1 of 25

โครงสร้างข้อมูลแบบแถวลำดับหรืออาร์เรย์ (Array)

2 of 25

ความหมายของแถวลำดับ

  • เป็นโครงสร้างข้อมูลที่มีการจองพื้นที่หน่วยความจำ (Memory) เป็นชุด ๆ แต่ละชุดประกอบด้วยจำนวนช่องข้อมูลหลายช่อง พื้นที่แต่ละช่องข้อมูลจะเก็บข้อมูลชนิดเดียวกัน และอยู่ในตำแหน่งที่ต่อเนื่องกันไปตามลำดับ
  • การเข้าถึงข้อมูล(Access) ใด ๆ ในโครงสร้างอาร์เรย์ สามารถกระทำได้โดยการระบุหมายเลขกำกับช่องข้อมูล ที่เรียกว่า ตัวดัชนี (Index) หรือบางครั้งเรียกว่า ตัวห้อย หรือซับสคริปต์ (Sub Script) เป็นตัวอ้างอิงตำแหน่งสมาชิกบนแถวลำดับ เช่น A(3) หมายถึง สมาชิกอาร์เรย์ A ลำดับที่ 3

3 of 25

ชนิดของอาร์เรย์

  • อาร์เรย์ 1 มิติ
  • อาร์เรย์ 2 มิติ
  • อาร์เรย์หลายมิติ (มากกว่า 2 มิติ)

4 of 25

อาร์เรย์หนึ่งมิติ (One Dimension Array)

  • มีการจัดเก็บข้อมูลในลักษณะต่อเนื่องกันเป็นแถว ซึ่งจะนำเสนอในมุมมองแบบแนวตั้งและแนวนอนก็ได้
  • สัญลักษณ์ที่ใช้คือ array_name[size]
  • เช่น num[5] หมายถึง num เป็นอาร์เรย์ 1 มิติขนาด 5 (มีสมาชิก 5 ตัวหรือ 5 ช่อง)

num[0]

num[1]

num[2]

num[3]

num[4]

5 of 25

อาร์เรย์หนึ่งมิติ (ต่อ)

  • name[10]

name[0]

name[1]

name[2]

name[9]

6 of 25

  • ในภาษาคอมพิวเตอร์ทั่วไป ค่าดัชนี(index) จะเริ่มต้นจาก 0 เช่น ภาษา C , C++ java และวงเล็บที่อยู่หลังตัวแปรอาร์เรย์ จะใช้เครื่องหมาย [ ] หรือ () ขึ้นอยู่กับ ภาษานั้น เช่น c , c++ , java ใช้เครื่องหมาย [ ] visual basic ใช้เครื่องหมาย ()
  • ตัวอย่างการประกาศอาร์เรย์ 1 มิติในภาษา C , C++

int num[20];

char grade[10];

7 of 25

ขอบเขตของอาร์เรย์ 1 มิติ

  • เลขดัชนีในอาร์เรย์ประกอบด้วยช่วงขอบเขตของค่าซึ่งประกอบด้วยขอบเขตล่างสุด (Lower Bound) และขอบเขตบนสุด (Upper Bound)

num[0]

num[1]

num[2]

num[3]

num[4]

num

Array name

Lower Bound

Upper Bound

ดังนั้น num(5) สามารถเขียนเป็น num[1:5]

8 of 25

การคำนวณหาจำนวนสมาชิกของอาร์เรย์หนึ่งมิติ

  • รูปแบบ ArrayName [L:U]

โดย ArrayName คือ ชื่อของอาร์เรย์

L คือ ขอบเขตล่างสุด (Lower Bound)

U คือ ขอบเขตบนสุด (Upper Bound)

  • จำนวนสมาชิก = U-L+1
  • เช่น num[1:5] มีสมาชิก เท่ากับ 5-1+1 = 5 ตัว

9 of 25

การคำนวณหาตำแหน่ง(Address)ในหน่วยความจำของอาร์เรย์ 1 มิติ

  • หาได้จากสูตร

Loc(A[i]) = B + w * (i – L)

โดยที่

i : ตำแน่งที่ต้องการ

B : ตำแหน่งเริ่มต้นในหน่วยความจำ

L : ตำแหน่งเริ่มต้น

w : ขนาดความกว้างของชนิดข้อมูลของข้อมูล (byte)

10 of 25

ตัวอย่าง การหาตำแหน่งในหน่วยความจำ ของอาร์เรย์หนึ่งมิติ

กำหนด อาร์เรย์ Data[1:5] เก็บข้อมูลชนิดตัวอักษร ซึ่งใช้เนื้อที่ในการเก็บข้อมูล

2 bytes ต่อชุด โดยมีตำแหน่งเริ่มต้นในหน่วยความจำอยู่ที่ 1000

จงหาตำแหน่งที่ใช้เก็บข้อมูลของ Data[2]

แทนค่าดังนี้

i = 2, B = 1000, L = 1, w = 2

จะได้ Loc(Data[2]) = 1000 + 2 * (2 – 1)

= 1000 + 2 * 1

= 1000 + 2

= 1002

Address Data

1000 Data[1]

1001

  1. Data[2]

1003

Data[3] Data[4] Data[5]

1009

.

.

.

11 of 25

ตัวอย่าง การหาตำแหน่งในหน่วยความจำ ของอาร์เรย์หนึ่งมิติ (ต่อ)

ต้องการประกาศตัวแปรอาร์เรย์ income เพื่อจัดเก็บยอดรายได้ของ ปี พ.ศ. 2541-2550

ซึ่งเป็นไปตามรูปแบบ income[2541:2550] ถ้าข้อมูลที่จัดเก็บกินเนื้อที่ 4 ไบต์ต่อสมาชิก1ตัว

และสมาชิกตัวแรกจัดเก็บในตำแหน่งที่ 7000 จงคำนวณหาแอดเดรสที่จัดเก็บยอดรายได้ของปี

2549

แทนค่าดังนี้

i = 2549, B= 7000, L = 2541, w = 4

จะได้ Loc(income[2549]) = 7000 + 4 * (2549 – 2541)

= 7000 + 4 * 8

= 7000 + 32

= 7032

12 of 25

13 of 25

อาร์เรย์ 2 มิติ (Two Dimension Array)

  • โครงสร้างข้อมูลที่มีการจัดเก็บข้อมูลแบบตารางสองทาง ข้อมูลมีการจัดเรียงกันตามแนวแถว (Row) และ แนวหลัก (Column) การอ้างถึงข้อมูลต้องระบุตำแหน่งแถวและตำแหน่งหลักที่ข้อมูลนั้นอยู่

Col 1

Col 2

Col 3

Col 4

Row 1

Row 2

Row 3

Row 4

14 of 25

รูปแบบทั่วไปของโครงสร้างข้อมูลอาร์เรย์ 2 มิติ�

ArrayName[L1 : U1 , L2 : U2]

เมื่อ ArrayName คือ ชื่อของโครงสร้างข้อมูลอาร์เรย์

L1 คือ ค่าขอบเขตล่างสุด (Lower Bound) ของแถว

U1 คือ ค่าขอบเขตสูงสุด (Upper Bound) ของแถว

L2 คือ ค่าขอบเขตล่างสุด (Lower Bound) ของคอลัมน์

U2 คือ ค่าขอบเขตสูงสุด (Upper Bound) ของคอลัมน์

15 of 25

อาร์เรย์ 2 มิติ

  • เช่น K[4,3] หรือ K[0:3,0:2]

10

5

3

2

1

9

11

6

7

0

4

3

Row

Column

0

1

2

0

1

2

3

Columns

Rows

16 of 25

การคำนวณหาจำนวนสมาชิกของอาร์เรย์สองมิติ

  • จำนวนสมาชิก = (U1 – L1 + 1) * (U2 – L2 + 1)

โดย U1 = ขอบเขตบนสุด ของแถว

L1 = ขอบเขตล่างสุด ของแถว

U2 = ขอบเขตบนสุด ของคอลัมน์

L2 = ขอบเขตล่างสุด ของคอลัมน์

เช่น A[1:2,1:3] มีจำนวนสมาชิก = (2-1+1)*(3-1+1)

= 2*3

= 6

17 of 25

A[1:2,1:3]

1

2

1

2

3

มีจำนวนสมาชิกเท่ากับ 6 ช่อง

18 of 25

การประกาศอาร์เรย์ 2 มิติในภาษาคอมพิวเตอร์

  • รูปแบบ type[ ] [ ] array_name หรือ type array_name [ ] [ ]

จากนั้นต้องจองหน่วยความจำด้วยคำสั่ง new และระบุสมาชิกในอาร์เรย์

  • รูปแบบ array_name = new type [row][col];

นอกจากนี้สามารถประกาศตัวแปรพร้อมกับจองพื้นที่หน่วยความจำ

  • รูปแบบ type [ ] [ ] array_name = new type [row][col];

19 of 25

การจัดเก็บอาร์เรย์สองมิติในหน่วยความจำ

ทำได้ 2 แบบ

1. การจัดเก็บด้วยการเรียงแถวเป็นหลัก (Row Major Order)

2. การจัดเก็บด้วยการเรียงคอลัมน์เป็นหลัก (Column Major Order)

20 of 25

สูตรการคำนวณหาตำแหน่งที่ใช้เก็บข้อมูลในอาร์เรย์สองมิติ

1. แบบการเรียงแถวเป็นหลัก

สูตร

LOC( K[i,j] ) = B+w[C(i-L1) + (j-L2)]

โดยที่

LOC(K[i,j]) = ตำแหน่งแอดเดรสที่เก็บ K[i,j] ในหน่วยความจำ

B = แอดเดรสเริ่มต้น (Base Address)

w = จำนวนช่องของหน่วยความจำที่จัดเก็บข้อมูลต่อหนึ่งสมาชิก

i = ตำแหน่งของแถวในอาร์เรย์

j = ตำแหน่งของคอลัมน์ในอาร์เรย์

L1 = ค่าขอบเขตล่างสุด (lower Bound) ของคอลัมน์

L2 = ค่าขอบเขตล่างสุด (lower Bound) ของคอลัมน์

C = จำนวนคอลัมน์ของแถวลำดับ

21 of 25

ตัวอย่าง

ต้องการทราบตำแหน่งแอดเดรสที่เก็บข้อมูลอาร์เรย์ K แถวที่ 2 คอลัมน์ 1 (K[2,1]) กำหนดให้ B = 500 W = 4 ไบต์

K[3,2]

K[3,1]

K[3,0]

K[2,2]

K[2,1]

K[2,0]

K[1,2]

K[1,1]

K[1,0]

K[0,2]

K[0,1]

K[0,0]

0

1

2

0

1

2

3

Columns

Rows

K[0:3 , 0:2]

22 of 25

การคำนวณ

สูตร

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

ดังนั้นอาร์เรย์ K แถวที่ 2 คอลัมน์ 1 จะจัดเก็บอยู่ในตำแหน่งแอดเดรสที่ 528

23 of 25

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

  • อาร์เรย์สามมิติคือการนำเอาอาร์เรย์สองมิติมาเรียงซ้อนกันหลายๆชั้น (page) ดังนั้นจึงทำให้อาร์เรย์สามมิติ จะมีลักษณะเป็นแถวและคอลัมน์แล้วก็จะมีความลึกเพิ่มขึ้นมา

0

1

2

Row

0

Row

1

Row

2

Row

3

Column

0

Column

1

Column

2

Column

3

Column

4

Page

2

Page

1

Page

0

24 of 25

รูปแบบทั่วไปของโครงสร้างข้อมูลอาร์เรย์ 3 มิติ

ArrayName[L1 : U1 , L2 : U2 , L3 : U3]

เมื่อ ArrayName คือ ชื่อของโครงสร้างข้อมูลอาร์เรย์

L1 คือ ค่าขอบเขตล่างสุด (Lower Bound) ของแถว

U1 คือ ค่าขอบเขตสูงสุด (Upper Bound) ของแถว

L2 คือ ค่าขอบเขตล่างสุด (Lower Bound) ของคอลัมน์

U2 คือ ค่าขอบเขตสูงสุด (Upper Bound) ของคอลัมน์

L3 คือ ค่าขอบเขตล่างสุด (Lower Bound) ของความลึก

U3 คือ ค่าขอบเขตสูงสุด (Upper Bound) ของความลึก

25 of 25

การหาจำนวนสมาชิกของอาร์เรย์ 3 มิติ

  • หาจากสูตร

จำนวนสมาชิก = (U1-L1+1) * (U2-L2+1) *(U3-L3+1)

  • เช่น จำนวนสมาชิกของอาร์เรย์ A(2,3,4) หรือ A(0:1,0:2,0:3)

จำนวนสมาชิก = (1-0+1)*(2-0+1)*(3-0+1)

= 2*3*4

= 24