บทที่ 2 โครงสร้างข้อมูลแบบแถวลำดับหรืออาร์เรย์

Download Report

Transcript บทที่ 2 โครงสร้างข้อมูลแบบแถวลำดับหรืออาร์เรย์

บทที่ 2 โครงสร้างข้อมูลแบบแถวลาดับหรือ
อาร์เรย์ (Array)
อ.วิวฒ
ั น์ ชินนาทศิริกุล
ความหมายของแถวลาดับ


เป็ นโครงสร้างข้อมูลที่มีการจองพื้ นที่หน่ วยความจา (Memory) เป็ นชุด ๆ
แต่ละชุดประกอบด้วยจานวนช่องข้อมูลหลายช่อง พื้ นที่แต่ละช่องข้อมูลจะ
เก็บข้อมูลชนิ ดเดียวกัน และอยูใ่ นตาแหน่ งที่ต่อเนื่ องกันไปตามลาดับ
การเข้าถึงข้อมูล(Access) ใด ๆ ในโครงสร้างอาร์เรย์ สามารถกระทาได้โดย
การระบุหมายเลขกากับช่องข้อมูล ที่เรียกว่า ตัวดัชนี (Index) หรือบางครั้ง
เรียกว่า ตัวห้อย หรือซับสคริปต์ (Sub Script) เป็ นตัวอ้างอิงตาแหน่ ง
สมาชิกบนแถวลาดับ เช่น A(3) หมายถึง สมาชิกอาร์เรย์ A ลาดับที่ 3
ชนิดของอาร์เรย์



อาร์เรย์ 1 มิติ
อาร์เรย์ 2 มิติ
อาร์เรย์หลายมิติ (มากกว่า 2 มิติ)
อาร์เรย์หนึ่งมิติ (One Dimension Array)



มีการจัดเก็บข้อมูลในลักษณะต่อเนื่ องกันเป็ นแถว ซึ่งจะนาเสนอในมุมมองแบบแนวตั้ง
และแนวนอนก็ได้
สัญลักษณ์ที่ใช้คือ array_name[size]
เช่น num[5] หมายถึง num เป็ นอาร์เรย์ 1 มิติขนาด 5 (มีสมาชิก 5 ตัวหรือ 5
ช่อง)
num[0]
num[1]
num[2]
num[3]
num[4]
อาร์เรย์หนึ่งมิติ (ต่อ)

name[10]
name[0]
name[1]
name[2]
name[9]

ในภาษาคอมพิวเตอร์ทวั ่ ไป ค่าดัชนี จะเริ่มต้นจาก 0 เช่น ภาษา C , C++
และวงเล็บที่อยูห่ ลังตัวแปรอาร์เรย์ จะใช้เครื่องหมาย [ ] หรือ () ขึ้ นอยูก่ บั
ภาษานั้น เช่น c , c++ , java ใช้เครื่องหมาย [ ] visual basic ใช้เครื่องหมาย ()
java

ตัวอย่างการประกาศอาร์เรย์ 1 มิติในภาษา C , C++
int num[20];
char grade[10];

ตัวอย่าง การประกาศอาร์เรย์ 1 มิติ ในภาษา Visual Basic
dim num(5) as integer
ขอบเขตของอาร์เรย์ 1 มิติ

เลขดัชนี ในอาร์เรย์ประกอบด้วยช่วงขอบเขตของค่าซึ่งประกอบด้วยขอบ
ล่างสุด (Lower Bound) และขอบเขตบนสุด (Upper Bound)
Upper Bound
Lower Bound
num
num[0]
num[1]
num[2]
num[3]
num[4]
Array name
ดังนั้น num(5) สามารถเขียนเป็ น
num[1:5]
การคานวณหาจานวนสมาชิกของอาร์เรย์หนึ่งมิติ

รูปแบบ ArrayName [L:U]
โดย ArrayName คือ ชื่อของอาร์เรย์
L คือ ขอบเขตล่างสุด (Lower Bound)
U คือ ขอบเขตบนสุด (Upper Bound)

จานวนสมาชิก = U-L+1

เช่น num[1:5] มีสมาชิก เท่ากับ 5-1+1 = 5 ตัว
การคานวณหาตาแหน่ง(Address)ในหน่วยความจาของอาร์เรย์หนึ่ง
มิติ

หาได้จากสูตร
Loc(A[i]) = B + w * (i – L)
โดยที่
i : ตาแน่ งที่ตอ้ งการ
B : ตาแหน่ งเริ่มต้นในหน่ วยความจา
L : ตาแหน่ งเริ่มต้น
w : ขนาดความกว้างของชนิ ดข้อมูลของข้อมูล (byte)
ตัวอย่าง การหาตาแหน่งในหน่วยความจา ของอาร์เรย์
หนึ่งมิติ
กาหนด อาร์เรย์ 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
1000
1001
1002
1003
...
Data
Data[1]
Data[2]
Data[3]
Data[4]
Data[5]
1009
ตัวอย่าง การหาตาแหน่งในหน่วยความจา ของอาร์เรย์
หนึ่งมิติ (ต่อ)
ต้องการประกาศตัวแปรอาร์เรย์ 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
Base Add
Memory
Array
7000
income[2541]
7004
income[2542]
income[i]
7032
income[2549]
7036
income[2550]
อาร์เรย์สองมิติ (Two Dimension Array)

โครงสร้างข้อมูลที่มีการจัดเก็บข้อมูลแบบตารางสองทาง ข้อมูลมีการ
จัดเรียงกันตามแนวแถว (Row) และ แนวหลัก (Column) การอ้างถึงข้อมูล
ต้องระบุตาแหน่ งแถวและตาแหน่ งหลักที่ขอ้ มูลนั้นอยู่
Col 1
Col 2
Col 3
Col 4
Row 1
Data
Data
Data
Data
Row 2
Data
Data
Data
Data
Row 3
Data
Data
Data
Data
Row 4
Data
Data
Data
Data
รูปแบบทั ่วไปของโครงสร้างข้อมูลอาร์เรย์ 2 มิติ
ArrayName[L1 : U1 , L2 : U2]
เมื่อ ArrayName คือ ชื่อของโครงสร้างข้อมูลอาร์เรย์
L1 คือ ค่าขอบเขตล่างสุด (Lower Bound) ของแถว
U1 คือ ค่าขอบเขตสูงสุด (Upper Bound) ของแถว
L2 คือ ค่าขอบเขตล่างสุด (Lower Bound) ของคอลัมน์
U2 คือ ค่าขอบเขตสูงสุด (Upper Bound) ของคอลัมน์
อาร์เรย์สองมิติ
Row
K[4,3] หรือ K[0:3,0:2]
เช่น
Columns
Rows

Column
0
1
2
0
10
5
3
1
2
1
9
2
11
6
7
3
0
4
3
การคานวณหาจานวนสมาชิกของอาร์เรย์สองมิติ

จานวนสมาชิก = (U1 – L1 + 1) * (U2 – L2 + 1)
โดย U1 = ขอบเขตบนสุด ของแถว
L1 = ขอบเขตล่างสุด ของแถว
U2 = ขอบเขตบนสุด ของคอลัมน์
L2 = ขอบเขตล่างสุด ของคอลัมน์
เช่น A[1:2,1:3] มีจานวนสมาชิก
= (2-1+1)*(3-1+1)
= 2*3
=6
A[1:2,1:3]
1
2
3
1
2
มีจานวนสมาชิกเท่ากับ 6 ช่อง
การประกาศอาร์เรย์ 2 มิตใิ นภาษาคอมพิวเตอร์

ภาษา c , C++ ประกาศโดยใช้รปู แบบดังนี้
รูปแบบ data_type array_name[row_size][column_size]
เช่น
int num[2][3];
char name[5][20];
การจัดเก็บอาร์เรย์สองมิตใิ นหน่วยความจา
ทาได้ 2 แบบ
(Row Major Order)
2. การจัดเก็บด้วยการเรียงคอลัมน์เป็ นหลัก (Column Major Order)
กรณีใช้กบั ภาษาฟอร์ทราน เนื่ องจากภาษาฟอร์ทรานเป็ นภาษาที่ใช้กบั
คอมพิวเตอร์บางรุน่ ในยุดแรกๆ และเครื่องเหล่านั้นมีโครงสร้างแอดเดรสทีเ่ หมาะกับ
การจัดเก็บข้อมูลแบบเรียงคอลัมน์เป็ นหลัก
1. การจัดเก็บด้วยการเรียงแถวเป็ นหลัก
สูตรการคานวณหาตาแหน่งที่ใช้เก็บข้อมูลในอาร์เรย์สองมิติ
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 = จานวนคอลัมน์ของแถวลาดับ
ตัวอย่าง
ต้องการทราบตาแหน่ งแอดเดรสที่เก็บข้อมูลอาร์เรย์ K แถวที่ 2 คอลัมน์ 1
(K[2,1]) กาหนดให้ B = 500 W = 4 ไบต์
Columns
0
1
2
0
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]
Rows
1
2
3
K[0:3 , 0:2]
การคานวณ
Base Add
สูตร
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
Array
Row 0
500
504
7
Row
8 1
K[0][0]
K[0][1]
508
1
K[0][2]
512
2
K[1][0]
516
ดังนั้นอาร์เรย์ K แถวที่ 2 คอลัมน์ 1 จะจัดเก็บ
อยูใ่ นตาแหน
แอดเดรสที่ 528
Memory
Row
-3 2
K[1][1]
520
5
K[1][2]
524
-2
K[2][0]
528
Row
4 3
K[2][1]
532
9
K[2][2]
536
0
K[3][0]
540
6
K[3][1]
544
3
K[3][2]
Row 0
Row 1
Row 2
Row 3
อาร์เรย์สามมิติ (Three Dimension Array)

อาร์เรย์สามมิติคือการนาเอาอาร์เรย์สองมิติมาเรียงซ้อนกันหลายๆชั้น (page)
ดังนั้นจึงทาให้อาร์เรย์สามมิติ จะมีลกั ษณะเป็ นแถวและคอลัมน์ แล้วก็จะมี
ความลึกเพิ่มขึ้ นมา
2
1
0
2
Page
Row0
Row1
1
Page
Row2
0
Page
Row3
0
Column
1
Column
2
Column
3
Column
4
Column
รูปแบบทั ่วไปของโครงสร้างข้อมูลอาร์เรย์ 3 มิติ
ArrayName[L1 : U1 , L2 : U2 , L3 : U3]
เมื่อ ArrayName คือ
L1 คือ
U1 คือ
L2 คือ
U2 คือ
L3 คือ
U3 คือ
ชื่อของโครงสร้างข้อมูลอาร์เรย์
ค่าขอบเขตล่างสุด (Lower Bound) ของแถว
ค่าขอบเขตสูงสุด (Upper Bound) ของแถว
ค่าขอบเขตล่างสุด (Lower Bound) ของคอลัมน์
ค่าขอบเขตสูงสุด (Upper Bound) ของคอลัมน์
ค่าขอบเขตล่างสุด (Lower Bound) ของความลึก
ค่าขอบเขตสูงสุด (Upper Bound) ของความลึก
การหาจานวนสมาชิกของอาร์เรย์ 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