DATA STRUCTURES AND ALGORITHMS โครงสร้ างข้ อมู ลและหลั...
-
Upload
independent -
Category
Documents
-
view
3 -
download
0
Transcript of DATA STRUCTURES AND ALGORITHMS โครงสร้ างข้ อมู ลและหลั...
DATA STRUCTURES AND ALGORITHMS
โครงสรางขอมลและหลกพ นฐานของอลกอรทม
02 : โครงสรางขอมลอารเรยและสตรง
อ.วรญทร เจนชย
วตถประสงค
บอกคณสมบตโครงสรางแบบอารเรยได
เขาใจหลกการจดเกบอารเรยในหนวยความจ า
สามารถค านวณหาแอดเดรสในหนวยความจ าของอารเรยหนงมตหรอหลาย
มตได
2
นยาม/ความหมาย
อารเรย เปนตวแปรชดทมการก าหนดชอตวแปรเพยงชอเดยว แตสามารถ
ก าหนดจ านวนชองทใชในการจดเกบขอมลไดหลายชอง ชนดขอมลทจดเกบใน
อารเรยชดเดยวกนจะมชนดขอมลเพยงชนดเดยว และการอางองอารเรยจะตอง
ระบชองทของอารเรย เรยกวา Subscript หรอ Index
อารเรยเปนโครงสรางขอมลแบบเสน (Linear Structure) กลาวคอ ชองท
ใชในการจดเกบขอมลของอารเรยเดยวกน จะใชเนอทในหนวยความจ าเรยงล าดบ
กนไปตงแตชองแรกไปจนถงชองสดทายของอารเรย และมจ านวนชองทตายตว
อารเรย เปนโครงสรางขอมลทใชเกบขอมลชนดเดยวกน เปนกลมหรอชดท
เรยงตดตอกนเปนแถว มขอบเขตจ ากดและมขนาดคงท
** ขอมลชนดเดยวกน คอ ขอมลทกตวทอยในอารเรยจะตองเปน
ขอมลชนดเดยวกนเทานน เชน ถาเปนอารเรยชนดจ านวนเตม ขอมลทกตวใน
อารเรยกตองเปนชนดจ านวนเตม ไมสามารถเกบขอมลตางชนดกนได **
นยาม/ความหมาย
ลกษณะของ ARRAY
อารเรยเปนโครงสรางขอมล ทมลกษณะ ดงน
1. เปนโครงสรางขอมลชนดเปนเชงเสน (Linear Structure) คอจดเกบ
ขอมลในชองของอารเรยตอเนองกนไป ขอมลชองทตดกนจะเกบใน
หนวยความจ าทตอเนองกน เชน อารเรย A ชองท 2 จะอยตอจากอารเรย A
ชองท 1 เปนตน
2. จดเกบขอมลชนดเดยวกน คอ ในอารเรยเดยวกนไมวาจะก าหนด
จ านวนชองไวกชองกตาม ชนดของทกชองจะเปนชนดขอมลเดยวกนเทานน
ไมสามารถจดเกบขอมลทมหลากหลายชนดในอารเรยเดยวกนได
3. มการก าหนดจ านวนชองไวแนนอน คอ เมอก าหนดตวแปรใดใหเปนอารเรย
จะตองระบจ านวนชองของอารเรยวาจะใหมชองทใชในการจดเกบขอมลทงหมดก
ชอง และแตละชองจะเรยงตอเนองกนไปเรอยๆ ตงแตชองแรกไปจนถงชองสดทาย
4. สามารถเขาถงชองตางๆ ไดโดยตรง คอ จากจ านวนชองทงหมดของอารเรย
ทก าหนดไว เราสามรถเขาถงขอมลชองใดๆ ไดโดยตรงโดยไมจ าเปนตองเรมตน
ตงแตชองแรกกได โดยการระบ ชองทของอารเรยทตองการเขาถง แตการระบชอง
ทตองอยในขอบเขตทก าหนด เชน ก าหนดอารเรย A มจ านวน 10 ชอง สามารถ
เขาถงชองใดกไดตงแต ชองท 1 ถงชองท 10 โดยระบชองไวหลงชอตวแปร
ตวอยาง A[5] หมายถง อารเรย A ชองท 5
ลกษณะของ ARRAY
ประเภทของอารเรย
หากจะแบงอารเรยตามมตของอารเรย ทใชอางองในการเขยนโปรแกรม
สามารถแบงไดเปน 3 ประเภท คอ
1. อารเรย 1 มต
2. อารเรย 2 มต
3. อารเรย 3 มต
สวนประกอบของอาเรย
ชอของอาเรย (name) คอ ชอทใชอางถงอาเรย
ขนาดของอาเรย (size) คอความสามารถในการเกบขอมลของอาเรยนนๆ บง
บอกวารองรบขอมลมากทสดกตว
ดชนของอาเรย (index) คอ ตวบงชวาโปรแกรมก าลงท างานกบอาเรยชองใด
8
สวนประกอบของอาเรย
ชอของอาเรย
score 0 1 2 3 4
index หรอตวชของอาเรย
size หรอขนาดของอาเรย
จากภาพ
index = 0 ถง 4 size = จ านวนชอง = 5
9
การประกาศตวแปรอารเรย
ชนดขอมล ชอตวแปรอารเรย[n];
ประเภทขอมลในตวแปรอารเรย
จ านวนสมาชกของตวแปรอารเรย
int A[10];
float B[5];
10
int n[10];
ประกาศตวแปรอารเรยชอ n มขนาด 10 หนวย แตละหนวยเกบ
เลขจ านวนเตม
char a[20];
ประกาศตวแปรอารเรยชอ a มขนาด 20 หนวย แตละหนวยเกบ
ตวอกขระ
float g[5];
ประกาศตวแปรอารเรยชอ g มขนาด 5 หนวย แตละหนวยเกบเลข
ทศนยม
ตวอยาง
11
การก าหนดคาเรมตนใหอารเรย
ตวอยาง
int n[5] = {1,4,9,16,25};
char a[3] = {‘A’,’B’,’C’};
int pw[ ] = {1,2,4,8,16,32,64,128};
char name[ ] = ‚COMPUTER‛;
ชนดของขอมล ชอตวแปรอารเรย[ขนาด] = {value-list};
ถาไมระบขนาด โปรแกรมจะจองหนวยความจ าใหเอง
12
ถาในตอนประกาศตวแปรอารเรยไมก าหนดคาเรมตนใหกบมนแลว คาท
อยในตวแปรจะเปนคาทคางอยในหนวยความจ าชวงทเราจองไวเปนอารเรย
นน
ถาก าหนดคาเรมตนตงแตตอนประกาศตวแปรแตก าหนดไมครบ ในกรณท
เปนอารเรยแบบตวเลขทงจ านวนเตมและจ านวนจรง คาทเหลอจะถก
ก าหนดเปน 0 โดยอตโนมต
การก าหนดคาเรมตนใหอารเรย
ตวอยาง เชน
บางครงถาก าหนดคาเรมตนใหแกอารเรยเลย เราไมจ าเปนตองใสขนาดของ
อารเรยกได
เชน float a[ ] = {1,2,3,4,5} ;
ความหมายคอ เปนการก าหนดตวแปรอารเรยของจ านวนจรงแบบ float
ขนาด 5 ชอง
การก าหนดคาเรมตนใหอารเรย
แตถาเราก าหนดตวแปรอารเรยโดยไมใสขนาดของอารเรย และไมได
ก าหนดคาเรมตนใหกบมน
เชน int a[ ] ; ประกาศผด!!!
นนคอ เราไมสามารถประกาศตวแปรอารเรยโดยไมใสขนาดของอารเรยได
ยกเวนมการก าหนดคาเรมตนใหกบมนตงแตแรก
การก าหนดคาเรมตนใหอารเรย
การอางองต าแหนงสมาชก
การอางอง หรอการเขาถงสมาชกตวใด จะใชตวบอกล าดบเพยงตวเดยว เชน
month[0] แทนเดอนท 1: เดอนมกราคม
month[1] แทนเดอนท 2: เดอนกมภาพนธ
month[11] แทนเดอนท 12: เดอนธนวาคม
subscript 0 1 2 3 4 5 6 7 8 9 10 11
data JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC
16
ถาหากมขอมลกลมหนงเปนคะแนนของนกศกษา 8 คน สามารถเกบไดดงน
หมายเลข X[0] X[1] X[2] X[3] X[4] X[5] X[6] X[7]
คะแนน 18 20 35 84 21 45 65 74
ถาหากมการอางถงอาเรยอาจเปนดงตอไปน
X[2] อางถงเซลลท 2 มคาเทากบ 35 X[2] + X[3] น าเซลลท 2 บวกกบเซลลท 3 จะได 35 + 84 เทากบ 119 X[1+3] อางเซลลท 4 มคาเทากบ 21 X[5] + 1 น าเซลลท 5 มาบวกดวย 1 จะไดเทากบ 46
ตวอยาง
17
ขอบเขตของอารเรย (Bounds)
โดยทวไปตวบอกล าดบจะเรมตนจาก 0 หรอ 1 เรยกวา ‚ขอบเขตลาง‛ (Lower bound)
ในภาษาคอมพวเตอรอยางภาษา C หรอ JAVA หมายเลขล าดบของอารเรยจะเรมตนดวย
หมายเลข 0 ในขณะทภาษา FORTRAN จะเรมตอนดวยหมายเลข 1 ดงนนหากมการ
ประกาศตวแปรอารเรยอาจเกดความสบสนได จงจ าเปนตองใชอยางระมดระวง
ตวบอกล าดบสดทาย เรยกวา ‚ขอบเขตบน‛ (Upper bound)
การประกาศอารเรยในภาษา C เชน int a[5];
Lower Bound Upper Bound
a[0] a[4] a[1] a[2] a[3]
18
การหาจ านวนสมาชกของอารเรยหนงมต
19
จ านวนสมาชก = U – L +1
L = Lower Bound U = Upper Bound
จงหาจ านวนสมาชก a[5]; ในภาษา C = 4 – 0 +1 = 5
Income[2541..2550] = 2550-2541+1 = 10
ต าแหนงอารเรยในหนวยความจ า
loc(a[i]) = B + w (i-L) โดยท loc(a[i]) = ต าแหนงทอยของสมาชกตวท i ของอารเรย a
i = ตวบอกล าดบ B = ต าแหนงทอยของสมาชกตวแรก
w = เนอทในหนวยความจ าทใชในการ จดเกบสมาชกแตละตว L = ขอบเขตลาง
20
ต าแหนงอารเรยในหนวยความจ า(2)
Array Memory Base Address a[0]
a[1]
a[99]
1000 1001
1099
B+w
B+99w
*สมมตสมาชกแตละตวของอารเรยมขนาดหนงไบต
21
การหาต าแหนงขอมลท i
จากสตร loc(a[i]) = B + w(i-L) ก าหนด num[1932..1984] โดยสมาชกแตละตวใชเนอทในหนวยความจ า 4 ไบต และต าแหนงแรกของ Array num คอ num[1932] = 200 จงหาทอยของ num[1980] วธท า Loc (num[1980]) = 200 + 4(1980 - 1932) = 200 + 4(48) = 200+192 ต าแหนง num[1980] = 392 byte ขนาดของจ านวนชองArray num = 4 * ((1984 - 1932)+1) = 212
22
ตวอยาง
#include <stdio.h>
main()
{
int num[10],sum,i;
for(i = 0; i < 10; i++)
scanf(“%d”,&num[i]);
sum = 0;
for(i=0;i<10;i++)
sum = sum + num[i];
printf(“sum is %d\n“,sum);
}
โปรแกรมรบขอมล 10 คา แลวหาผลรวมของขอมลเหลานน
23
อารเรยสองมต
เปนแบบทการอางอง การเขาถงสมาชกตวใด จะใชตวบอกล าดบ 2 ตว
โครงสรางขอมลจะเหมอนกบลกษณะของ Matrix หรอตาราง ซง
สมาชกแตละตวจะถกจดเรยงใหอยเปนแถว (Row) และคอลมภ
(Column)
int a[4][3];
Column 0 Column 1 Column 2
Row 0 a[0][0] a [0][1] a[0][2]
Row 1 a[1][0] a [1][1] a[1][2]
Row 2 a[2][0] a[2][1] a[2][2]
Row 3 a[3][0] a[3][1] a[3][2]
[แถว][คอลมภ]
24
7 8 1
2 -3 5
-2 4 9
0 6 3
จดเกบชดตวเลขตอไปน
การหาจ านวนสมาชกของอารเรยสองมต
25
จ านวนสมาชก = (U1 – L1 +1) x (U2 – L2 +1)
U1 = Upper Bound ของแถว L1 = Lower Bound ของแถว U2 = Upper Bound ของคอลมภ L2 = Lower Bound ของคอลมภ
จงหาจ านวนสมาชก a[5][4]; ในภาษา C = (4 – 0 + 1) x (3 – 0 + 1) = 5 x 4 = 20
อารเรยสองมต
26
การจดเกบอารเรยสองมตในหนวยความจ าสามารถจดเกบได
2 วธ
1. การจดเกบดวยการเรยงแถวเปนหลก (Row Major Order)
2. การจดเกบดวยการเรยงคอลมภเปนหลก (Column Major
Order)
การจดเกบอารเรย 2 มต ในหนวยความจ า
การจดเรยงสมาชกในหนวยความจ าแบบแถวเปนหลก (Row major) จะเรยงสมาชกทกตวในแถวแรกใหหมดกอนแลวจงน าสมาชกในแถวถดไปมาเรยงตอกน
Row 0
a[0][0]
a[0][1]
a[0][2]
a[0][3]
Row 1
a[1][0]
a[1][1]
a[1][2]
a[1][3]
Column 0 Column 1 Column 2 Column 3
Row 0 a[0][0] a[0][1] a[0][2] a[0][3]
Row 1 a[1][0] a[1][1] a[1][2] a[1][3]
int a[2][4];
27
การหาต าแหนงขอมลท [i][j](Row Major)
จากสตร loc(K[i][j])= B + w[C(i-L1)+(j-L2)]
C = จ านวนคอลมภของอารเรย
L1 = Lower Bound ของแถว
L2 = Lower Bound ของคอลมภ
i = ต าแหนงแถว
j = ต าแหนงคอลมภ
B = ต าแหนงทอยของสมาชกตวแรก(ต าแหนงฐาน)
w = เนอทในหนวยความจ าทใชในการจดเกบสมาชกแตละตว
28
29
ตวอยาง จากอารเรย K[4][3] ซงใชการเกบแบบแถวเปนหลก จงหาวา K[2][1] จดเกบอยต าแหนงแอดแดรสทเทาใด
ก าหนด B=500, W=4
อารเรย K มขอบเขตระหวาง K[0:3,0:2] loc(K[i][j])= B + w[C(i-L1)+(j-L2)]
loc(K[2][1])= 500+4[3(2-0)+(1-0)]
= 500+4[6+1]
= 500+28
= 528
ต าแหนงอารเรยในหนวยความจ า
7
8
1
2
-3
5
-2
4
9
0
6
3
Array Memory
Base Address K[0][0] K[0][1] K[0][2] K[1][0] K[1][1] K[1][2] K[2][0] K[2][1] K[2][2] K[3][0] K[3][1] K[3][2]
500 504 508 512 516 520 524 528 532 536 540 544
B+w
B+11w
30
Row 1 Row 2 Row 3 Row 4
7 8 1
2 -3 5
-2 4 9
0 6 3
การจดเกบอารเรย 2 มต ในหนวยความจ า
การจดเรยงสมาชกในหนวยความจ าแบบคอลมภเปนหลก (Column major) จะเรยงสมาชกทกตวในคอลมภแรกใหหมดกอนแลวจงน าสมาชกในคอลมภถดไปมาเรยงตอกน
Column 0
a[0][0]
a[1][0]
Column 1 a[0][1]
a[1][1]
Column 2 a[0][2]
a[1][2]
Column 3 a[0][3]
a[1][3]
Column 0 Column 1 Column 2 Column 3
Row 0 a[0][0] a [0][1] a[0][2] a[0][3]
Row 1 a[1][0] a [1][1] a[1][2] a[1][3]
int a[2][4];
31
การหาต าแหนงขอมลท [i][j](Column Major)
จากสตร loc(K[i][j])= B + w[R(j-L2)+(i-L1)]
R = จ านวนแถวของอารเรย
L1 = Lower Bound ของแถว
L2 = Lower Bound ของคอลมภ
i = ต าแหนงแถว
j = ต าแหนงคอลมภ
B = ต าแหนงทอยของสมาชกตวแรก(ต าแหนงฐาน)
w = เนอทในหนวยความจ าทใชในการจดเกบสมาชกแตละตว
32
33
ตวอยาง จากอารเรย K[4][3] ซงใชการเกบแบบคอลมภเปนหลก จงหาวา K[2][1] จดเกบอยต าแหนงแอดแดรสทเทาใด
ก าหนด B=500, W=4
อารเรย K มขอบเขตระหวาง K[0:3,0:2] loc(K[i][j])= B + w[C(i-L1)+(j-L2)]
loc(K[2][1])= 500+4[4(1-0)+(2-0)]
= 500+4[4+2]
= 500+24
= 524
ต าแหนงอารเรยในหนวยความจ า
7
2
-2
0
8
-3
4
6
1
5
9
3
Array Memory
Base Address K[0][0] K[1][0] K[2][0] K[3][0] K[0][1] K[1][1] K[2][1] K[3][1] K[0][2] K[1][2] K[2][2] K[3][2]
500 504 508 512 516 520 524 528 532 536 540 544
B+w
B+11w
34
Column 1 Column 2 Column 3
7 8 1
2 -3 5
-2 4 9
0 6 3
ต าแหนงอารเรยในหนวยความจ า
7
2
-2
0
8
-3
4
6
1
5
9
3
Array Memory
Base Address K[0][0] K[1][0] K[2][0] K[3][0] K[0][1] K[1][1] K[2][1] K[3][1] K[0][2] K[1][2] K[2][2] K[3][2]
500 504 508 512 516 520 524 528 532 536 540 544
B+w
B+11w
35
Column 1 Column 2 Column 3
7
8
1
2
-3
5
-2
4
9
0
6
3
Array Memory
K[0][0] K[0][1] K[0][2] K[1][0] K[1][1] K[1][2] K[2][0] K[2][1] K[2][2] K[3][0] K[3][1] K[3][2]
Row 1 Row 2 Row 3 Row 4
7 8 1
2 -3 5
-2 4 9
0 6 3
การเกบขอมลในอารเรยสองมต
main( ) { int a[3][3]; a[0][0] = 4; a[0][1] = 5; a[0][2] = 10;
a[1][0] = 8;
a[1][1] = 14;
a[1][2] = 17;
a[2][0] = 9;
a[2][1] = 8;
a[2][2] = 13;
}
17
4
10
8 14 5
9 8
13
a[0][2]
a[0][1]
a[1][0] a[0][0] a[2][0]
a[1][2] a[2][2]
36
การเกบขอมลในอารเรยสองมต
main() { int a[3][3]; int x, y; for(y = 0; y <= 2; y++) { for(x = 0; x <= 2; x++) printf(“%d\t”,a[y][x]); printf(“\n”); } }
17
4
10
8 14 5
9 8
13
ตวแปร x
ตวแปร y
37
#include <stdio.h>
main()
{
int i, j, sum;
int b[5][4];
sum = 0;
for(i = 0; i < 5; i++)
for(j = 0; j < 4; j++)
{
scanf(“%d”, &b[i][j]);
sum = sum + b[i][j];
}
printf(“The sum is %d\n“,sum);
}
โปรแกรมอานขอมลจ านวนเตมจากตวแปรอารเรยสองมต แลวน าขอมลทงหมดมาบวกกน
38
ตวอยาง
#include <stdio.h>
int main()
{
int age[4];
age[0]=23;
age[1]=34;
age[2]=65;
age[3]=74;
printf("%d\n", age[0]);
printf("%d\n", age[1]);
printf("%d\n", age[2]);
printf("%d\n", age[3]);
return 0;
}
39
อารเรยสามมต (Three-Dimension Array)
40
อารเรยสามมต คอ การน าอารเรย สองมตมาเรยงซอนกนหลายๆ ชน
(page) ท าใหอารเรยสามมต นอกจากจะมคอลมนและแถวแลว กจะมความ
ลกเพมข น ความลกนเองทเกดจากการน าอารเรยสองมตมาเรยงซอนกน
ตวอยาง สมมตวาไดมการก าหนดให A[3,4,5] ดวยภาษา C
int A[3][4][5]
A[แถว][คอลมภ][ชน]
สมาชกแตละตวบนแถวล าดบสามมตสามารถก าหนดได คอ
A[0,0,0], A[0,0,1], A[i,j,k], … , A[2,3,4]
สตรง (String)
ขอมลสตรงนนโปรแกรมทเขยนดวยภาษา C จะถอวาเปนอารเรยของขอมล
ตวอกษร (char) ทเรยงกนตามล าดบ
char name[100];
char name2[] = ‚Varinthorn Janchai‛;
ทกสตรงจะมตวสนสดสตรง NULL หรอ \0 ปดทายเสมอ
char Str1[] = ‚Hello World‛;
char Str2[14] = ‚good bye‛;
char Str3[] = ‚see you again‛;
0 1 2 3 4 5 6 7 8 9 10 11 12 13
Str1 H e l l l W o r l d \0
Str2 g o o d b y e _ _ _ _ _ \0
Str3 s e e y o u a g i n \0
43
ฟงกชนของตวแปรสตรง
ฟงกชน strcat()
น าสตรงสองตวมาตอกน มรปแบบดงน
strcat(สตรง1 , สตรง2);
ฟงกชน strcmp()
น าสตรงสองตวมาเปรยบเทยบกน มรปแบบดงน
strcmp(สตรง1 , สตรง2);
44
ฟงกชนของตวแปรสตรง
ฟงกชน strcpy()
คดลอกสตรงตนทางไปไวปลายทาง มรปแบบดงน
strcpy(สตรงปลายทาง , สตรงตนทาง);
ฟงกชน strlen()
นบจ านวนอกขระในสตรง มรปแบบดงน
strlen(สตรง);
main()
{
int i;
char str1[20];
strcpy(str1,”Have a nice day”);
printf(“%s\n”,str1);
i = strlen(str1);
printf(“ %d\n”, i);
}
45
แบบฝกหด
จากประกาศอารเรยตอไปน Float a[10];
อารเรย a เกบขอมลชนดใด
จงใชสตรค านวณจ านวนสมาชกของอารเรย a
ล าดบสมาชกของอารเรย a เรมตนทเทาใด และสนสดทเทาใด (วาด
ภาพประกอบ)
จากประกาศอารเรยดวยภาษา C ตอไปน int x[5][4];
จงใชสตรค านวณจ านวนสมาชกของอารเรย x
จงแสดงอารเรย x ทจดเกบในหนวยความจ าในรปแบบแถวเปนหลก โดย
ก าหนด แอดแดรสเรมตนท 200 และใชเนอทเกบขอมลเทากบ 4 ไบต
(วาดภาพประกอบ)
จงค านวณหา x[5][4]; อยต าแหนงใดในหนวยความจ า
46
แบบฝกหด
ใหเขยนโปรแกรมทท าการเกบขอมลคะแนนของนกศกษาจ านวน 5 คนไวใน
โครงสรางอารเรยซงมคะแนนดงน
73, 64, 95, 74, 82
และใหท าการหาผลรวมของคะแนนของนกศกษาทงหมดมาแสดงผล
หมายเหต
score[5]: ตวแปรอารเรยของคะแนนนกศกษา
totalScore: ตวแปรผลรวมคะแนนของนกศกษา
47
เฉลย
#include <stdio.h>
int main()
{
int score[] = {73,64,95,74,82};
int totalScore = 0;
int i;
score[0]=73;
score[1]=64;
score[2]=95;
score[3]=74;
score[4]=82;
for(i=0; i<5; i++)
totalScore=totalScore+score[i];
printf("%d\n", totalScore);
return 0;
}
48