DATA STRUCTURES AND ALGORITHMS โครงสร้ างข้ อมู ลและหลั...

49
DATA STRUCTURES AND ALGORITHMS โครงสร้างข้อมูลและหลักพื ้ นฐานของอัลกอริทึม 02 : โครงสร้างข้อมูลอาร์เรย์และสตริง อ.วริญทร เจนชัย

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]

อารเรยสามมต (Three-Dimension Array)

41

อารเรยสามมต (Three-Dimension Array)

42

สตรง (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

อางอง

โอภาส เอยมสรวงศ. โครงสรางขอมล (Data Structures) เพอการออกแบบ

โปรแกรมคอมพวเตอร. – กรงเทพฯ: ซเอดยเคชน, 2549.

49