550 likes | 993 Views
โครงสร้างข้อมูลและอัลกอริธึม. โครงสร้างข้อมูลแบบอาร์เรย์ (Array). Array.
E N D
โครงสร้างข้อมูลและอัลกอริธึมโครงสร้างข้อมูลและอัลกอริธึม โครงสร้างข้อมูลแบบอาร์เรย์ (Array) Array
Array • โครงสร้างข้อมูลอาร์เรย์ (Array) คือ โครงสร้างข้อมูลที่มีการจองพื้นที่หน่วยความจำ (Memory) เป็นชุด ๆ แต่ละชุดประกอบด้วยจำนวนช่องข้อมูลหลายช่อง พื้นที่แต่ละช่องข้อมูลจะอยู่ในตำแหน่งที่ต่อเนื่องกันไปตามลำดับ การเข้าถึงข้อมูล(Access) ใด ๆ ในโครงสร้าง สามารถกระทำได้โดยการระบุหมายเลขกำกับช่องข้อมูล ที่เรียกว่า ตัวดัชนี (Index) หรือบางครั้งเรียกว่า ตัวห้อย หรือซับสคริปต์ (Sub Script) เป็นตัวอ้างอิงตำแหน่งสมาชิกบนแถวลำดับนั้นๆ เช่น • Score[1] คือคะแนนสอบของนักศึกษาคนแรก • Score[50] คือคะแนนสอบของนักศึกษาคนสุดท้าย Array
A[1:5] DATA DATA DATA DATA DATA A [ 1 : 5 ] ขนาดและมิติ (Dimension) ขอบเขตสูงสุด (Upper Bound) ขอบเขตต่ำสุด (lower Bound) ชื่อโครงสร้าง (Array Name) ลักษณะโครงสร้างข้อมูลอาร์เรย์ Array
คุณสมบัติสำคัญของอาร์เรย์คุณสมบัติสำคัญของอาร์เรย์ • อาร์เรย์เป็นตัวแทนกลุ่มของข้อมูลที่มีความสัมพันธ์กัน • สมาชิกในอาร์เรย์จะมีคุณสมบัติเหมือนๆกัน • ขนาดของอาร์เรย์จะมีค่าคงที่ • อาร์เรย์เป็นโครงสร้างข้อมูลที่ผู้ใช้สามารถอ้างอิงเพื่อเข้าถึงข้อมูลที่ต้องการได้ทันที • อาเรย์ของ String • อาเรย์ของ int • อาเรย์ของ char • อาเรย์ของ double String String String String String int int int int int char char char char char double double double double double Array
ตัวอย่าง เช่น month[1] แทนเดือนที่1 คือมกราคม month[2] แทนเดือนที่2 คือกุมภาพันธ์ . . month[12] แทนเดือนที่12 คือธันวาคม Char month[12] = {“JAN”,”FEB”,”MAR”,”APR”, “MAY”,”JUN”,”JUL”,”AUG”,”SEP”,”OCT”,”NOV”,”DEC”}; month month[4-1] = month[3] = APR(เมษายน) Array
ขอบเขตของอาร์เรย์ Bounds • เลขดรรชนีในอาร์เรย์ประกอบด้วยช่วงขอบเขตของค่าซึ่งประกอบด้วยขอบล่างสุด (Lower Bound) และขอบเขตบนสุด (Upper Bound) Array
ตัวอย่างการใช้งานอาร์เรย์ตัวอย่างการใช้งานอาร์เรย์ class Array1 { public static void main(String[] args) { int [] list; list = new int[10]; for (int i=0;i<list.length ;i++ ) { System.out.println("list["+i+"] = "+list[i]); } } } Array
ประเภทของอาร์เรย์ • อาร์เรย์หนึ่งมิติ (One Dimension Array) • อาร์เรย์สองมิติ (Tow Dimension Array) • อาร์เรย์สามมิติ (Three Dimension Array) Array
อาร์เรย์หนึ่งมิติ (One Dimension Array) • โครงสร้างข้อมูลอาร์เรย์หนึ่งมิติ จะมีการจัดเก็บข้อมูลในลักษณะต่อเนื่องกันเป็นเป็นแถว ซึ่งจะนำเสนอทั้งในมุมมองแบบแนวตั้งและแนวนอนก็ได้ โดยรูปแบบ ArrayName [L:U] โดย ArrayName คือ ชื่อของอาร์เรย์ L คือ ขอบเขตล่างสุด (Lower Bound) U คือ ขอบเขตบนสุด (Upper Bound) ตัวอย่าง a[0:4] หรือ a[5] String[5]; s [1] s [2] s [3] s [4] s [0] null null null null null Array
การคำนวณหาจำนวนสมาชิกของอาร์เรย์หนึ่งมิติการคำนวณหาจำนวนสมาชิกของอาร์เรย์หนึ่งมิติ • จำนวนสมาชิก = U-L+1 โดยที่ U = ขอบเขตบนสุด (Upper Bound) L = ขอบเขตล่างสุด (Lower Bound) ตัวอย่าง จำนวนสมาชิก = U – L + 1 =4 – 0 + 1 = 5 Array
การคำนวณหาตำแหน่งแอดเดรสในหน่วยความจำของอาร์เรย์หนึ่งมิติการคำนวณหาตำแหน่งแอดเดรสในหน่วยความจำของอาร์เรย์หนึ่งมิติ LOC(a[i]) = B + w(i-L) โดย LOC(a[i]) = ตำแหน่งแอดเดรสที่เก็บ a[i] ในหน่วยความจำ B = แอดเดรสเริ่มต้นของ (Base Address) a w = จำนวนช่องของหน่วยความจำที่จัดเก็บข้อมูลต่อหนึ่งสมาชิก i = ตำแหน่งของอาร์เรย์ L = ขอบเขตล่างสุด (Lower Bound) Array
ตัวอย่างที่ 1 • กำหนดให้ B = 1000 W = 1 ไบต์ อยากทราบว่าอาร์เรย์ a[10] ถูกจัดเก็บไว้ในหน่วยความจำแอดเดรสใด จากสูตร LOC(a[i]) = B+w(i-L) LOC(a[10]) = 1000+1(10-0) = 1010 ดังนั้นตำแหน่งอาร์เรย์ a[10] จะถูกเก็บไว้ในหน่วยความจำแอดเดรสที่ 1010 Array
ตัวอย่างที่ 2 ต้องการประกาศตัวแปรอาร์เรย์ income เพื่อจัดเก็บยอดรายได้ของ ปี พ.ศ. 2541-2550ซึ่งเป็นไปตามรูปแบบ income[2541:2550] กำหนดให้Base Address (B) = 7000 W = 4 ไบต์ จงคำนวณหาแอดเดรสที่จัดเก็บยอดรายได้ของปี 2549 LOC(income[i]) = B+w(i-L) LOC(income[2549]) = 7000+4(2549-2541) = 7032 ดังนั้นยอดรายได้ของปี 2549 จะถูกจัดเก็บไว้ในหน่วยความจำแอดเดรส 7032 Array
Col 1 Col 2 Col 3 Col 4 Row 1 Row 2 Row 3 Row 4 อาร์เรย์สองมิติ (Two Dimension Array) • หมายถึง โครงสร้างข้อมูลที่มีการจัดเก็บข้อมูลแบบตารางสองทาง ข้อมูลมีการจัดเรียงกันตามแนวแถว (Row) และ แนวหลัก (Column) การอ้างถึงข้อมูลต้องระบุตำแหน่งแถวและตำแหน่งหลักที่ข้อมูลนั้นอยู่ Array
อาร์เรย์สองมิติ • รูปแบบทั่วไปของโครงสร้างข้อมูลอาร์เรย์ 2 มิติ ArrayName[L1:U1, L2 : U2] เมื่อ ArrayName คือ ชื่อของโครงสร้างข้อมูลอาร์เรย์ L1 คือ ค่าขอบเขตล่างสุด (lower Bound) ของแถว U1 คือ ค่าขอบเขตสูงสุด (Upper Bound) ของแถว L2 คือ ค่าขอบเขตล่างสุด (lower Bound) ของคอลัมน์ U2 คือ ค่าขอบเขตสูงสุด (Upper Bound) ของคอลัมน์ Array
อาร์เรย์สองมิติ R C • เช่น K[4,3] หรือ K[0:3,0:2] Columns int K[4][3]; ชุดข้อมูลที่เก็บใน K 0 1 2 0 Rows 1 2 3 Array
การคำนวณหาจำนวนสมาชิกของอาร์เรย์สองมิติการคำนวณหาจำนวนสมาชิกของอาร์เรย์สองมิติ c0 c1 c2 c3 • จำนวนสมาชิก = (U1 – L1 + 1) * (U2 – L2 + 1) โดย U1 = ขอบเขตบนสุด ของแถว L1 = ขอบเขตล่างสุด ของแถว U2 = ขอบเขตบนสุด ของคอลัมน์ L2 = ขอบเขตล่างสุด ของคอลัมน์ r0 r1 r2 r3 row column r4 จำนวนสมาชิก= (U1 – L1 + 1) * (U2 – L2 + 1) = (4-0+1) * (3-0+1) = 5 *4 = 20 Int number [5][4]; Array
การจัดเก็บอาร์เรย์สองมิติในหน่วยความจำสามารถจัดเก็บได้ 2 วิธี • การจัดเก็บด้วยการเรียงแถวเป็นหลัก (Row Major Order) • การจัดเก็บด้วยการเรียงคอลัมน์เป็นหลัก (Column Major Order) Array
สูตรการคำนวณหาแอดเดรสที่ใช้เก็บข้อมูลในอาร์เรย์สองมิติสูตรการคำนวณหาแอดเดรสที่ใช้เก็บข้อมูลในอาร์เรย์สองมิติ -แบบการเรียงแถวเป็นหลัก สูตร LOC( K[i,j] ) = B+w[C(i-L1) + (j-L2)] โดย LOC(K[i,j]) = ตำแหน่งแอดเดรสที่เก็บ K[i,j] ในหน่วยความจำ B = แอดเดรสเริ่มต้นของ (Base Address) a w = จำนวนช่องของหน่วยความจำที่จัดเก็บข้อมูลต่อหนึ่งสมาชิก i = ตำแหน่งของแถวในอาร์เรย์ j = ตำแหน่งของคอลัมน์ในอาร์เรย์ L1 = ค่าขอบเขตล่างสุด (lower Bound) ของคอลัมน์ L2 = ค่าขอบเขตล่างสุด (lower Bound) ของคอลัมน์ C = จำนวนคอลัมน์ของแถวลำดับ Array
Columns 0 1 2 0 K[0,0] K[0,1] K[0,2] 1 K[1,0] K[1,1] K[1,2] 2 Rows K[2,0] K[2,1] K[2,2] K[3,0] K[3,1] K[3,2] 3 K[0:3 , 0:2] ตัวอย่าง ต้องการทราบตำแหน่งแอดเดรสที่เก็บข้อมูลอาร์เรย์ K แถวที่ 2 คอลัมน์ 1 (K[2,1]) กำหนดให้ B = 500 W = 4 ไบต์ Array
คำนวณ • สูตร 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 Array
สูตรการคำนวณหาแอดเดรสที่ใช้เก็บข้อมูลในอาร์เรย์สองมิติสูตรการคำนวณหาแอดเดรสที่ใช้เก็บข้อมูลในอาร์เรย์สองมิติ -แบบเรียงคอลัมน์เป็นหลัก สูตร LOC(K[i,j]) = B+w[R(j-L2) + (i-L1)] โดย LOC(K[I,j]) = ตำแหน่งแอดเดรสที่เก็บ K[I,j] ในหน่วยความจำ B = แอดเดรสเริ่มต้นของ (Base Address) a w = จำนวนช่องของหน่วยความจำที่จัดเก็บข้อมูลต่อหนึ่งสมาชิก i = ตำแหน่งของแถวในอาร์เรย์ j = ตำแหน่งของคอลัมน์ในอาร์เรย์ L1 = ค่าขอบเขตล่างสุด (lower Bound) ของRow L2 = ค่าขอบเขตล่างสุด (lower Bound) ของคอลัมน์ R = จำนวนแถวของแถวลำดับ Array
Columns 0 1 2 0 K[0,0] K[0,1] K[0,2] 1 K[1,0] K[1,1] K[1,2] 2 Rows K[2,0] K[2,1] K[2,2] K[3,0] K[3,1] K[3,2] 3 K[0:3 , 0:2] ตัวอย่าง ต้องการทราบตำแหน่งแอดเดรสที่เก็บข้อมูลอาร์เรย์ K แถวที่ 2 คอลัมน์ที่ 1 โดยการจัดเรียงข้อมูลในหน่วยความจำหลักอยู่ในรูปแบบของคอลัมน์เป็นหลัก กำหนดให้ B = 500 W = 4 ไบต์ Array
คำนวณ • สูตร LOC(K[ i, j ]) = B+w[R(j-L2) + (i-L1)] LOC(K[ 2, 1 ]) = 500+4[4(1-0) + (2-0)] = 500+4[4+2] = 500+24 = 524 ดังนั้นอาร์เรย์ K แถวที่ 2 คอลัมน์ 1 จะจัดเก็บอยู่ในตำแหน่งแอดเดรสที่ 524 Array
อาร์เรย์สามมิติ (Three Dimension Array) • อาร์เรย์สามมิติคือการนำเอาอาร์เรย์สองมิติมาเรียงซ้อนกันหลายๆชั้น(Page) ดังนั้นจึงทำให้อาร์เรย์สามมิตินอกจากจะมีแถวและคอลัมน์แล้วก็จะมีความลึกเพิ่มขึ้นมา รูปแบบ 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) ของคอลัมน์ Array
จงหาจำนวนสมาชิกของอาร์เรย์ s int S[3][4][5]; จำนวนสมาชิก = (U1-L1+1) * (U2-L2+1) * (U3-L3+1) = (2-0+1)*(3-0+1)*(4-0+1) = 3 * 4 * 5 = 60 Array
อาร์เรย์สามมิติ R • เช่น S[3,4,5] หรือ S[0:2 , 0:3 , 0:4] P C int S[3][4][5]; สูตรการหาจำนวนสมาชิกในอาร์เรย์สามมิติ จำนวนสมาชิก = (U1-L1+1) * (U2-L2+1) *(U3-L3+1) หรือ จำนวนสมาชิก = P * R * C Array
การคำนวณหาแอดเดรสของอาร์เรย์สามมิติแบบแถวเป็นหลักการคำนวณหาแอดเดรสของอาร์เรย์สามมิติแบบแถวเป็นหลัก สูตรLOC(S[k,i,j]) = B+[W*R*C(k-L1)] +[W*C(i-L2)] +[W(j-L3)] โดย LOC(S[i,j,k]) ตำแหน่งแอดเดรสที่เก็บ S[I,j,k] ในหน่วยความจำ B แอดเดรสเริ่มต้นของ (Base Address) W จำนวนช่องของหน่วยความจำที่จัดเก็บข้อมูลต่อหนึ่งสมาชิก i ตำแหน่งขอแถวในอาร์เรย์ j ตำแหน่งของคอลัมน์ในอาร์เรย์ k ตำแหน่งของชั้นในอาร์เรย์ R จำนวนแถวของแถวลำดับ C จำนวนคอลัมน์ของแถวลำดับ L1คือขอบเขตล่างสุด (Lower Bound) ของชั้น L2คือขอบเขตล่างสุด (Lower Bound) ของแถว L3คือขอบเขตล่างสุด (Lower Bound) ของคอลัมน์ Array
ตัวอย่าง • ต้องการทราบตำแหน่งแอดเดรสที่เก็บข้อมูลอาร์เรย์ s ชั้นที่0 แถวที่3 คอลัมน์ที่4 สูตรLOC(S[i,j,k]) = B+[W*R*C(i-L1)] +[W*C(j-L2)] +[W(k-L3)] LOC(S[0,3,4]) = 500+[4*4*5(0-0)] +[4*5(3-0)] +[4(4-0)] = 500+0+60+16 =576 กำหนดให้ B=500 W=4 ไบต์ int S[3][4][5]; Array
อาร์เรย์สามมิติชื่อ s ที่จัดเก็บข้อมูลแบบใช้แถวเป็นหลัก Array
Array Array
Array Array
Array Array
Array Array
Array Array
Array Array
Array Array
Array Array
Array Array
Array Array
Array Array
Array Array
Array Array
Array Array
Array Array
1. กำหนด Array x[-20..5] อยากทราบว่า • แถวลำดับ x จะมีสมาชิกกี่ตัว • ถ้า Loc (x[-20]) = 500 และใช้เนื้อที่ 4 ไบต์ จงหา Loc(x[-10]) Array
การบ้าน 2. กำหนดให้ Array A [-32..84,5..30] โดยสมาชิกแต่ละตัวใช้พื้นที่ในหน่วยความจำ 4 ไบต์ และตำแหน่งแรกของ Array A คือ [-32,5] = 400 จงหาที่อยู่ของ A[40,20] ทั้งสองแบบ Col, Row และหาจำนวนพื้นที่ในหน่วยความจำทั้งหมดเท่าไร 3. กำหนด Array z[-2..8,3..5,1..3] มี Loc (Z[5,4,2])=1024 และใช้เนื้อที่ 4 ไบต์ ของ RoW จงหา Loc(Z[4,3,2]) โรว์เมเจอร์ (Row Major) - ขนาดของ Array z และ หาจำนวน ไบต์ ของ Array z Array
4. กำหนดให้ Array A [-32..84,5..30] โดยสมาชิกแต่ละตัวใช้พื้นที่ในหน่วยความจำ 4 ไบต์ และตำแหน่งแรกของ Array A คือ [-32,5] = 400 จงหาที่อยู่ของ A[40,20] ทั้งสองแบบ Col, Row และหาจำนวนพื้นที่ในหน่วยความจำทั้งหมดเท่าไร • 5. กำหนด Array z[1..3,2..9,3..12] มี Loc (Z[1,2,3])=1024 และใช้เนื้อที่ 4 ไบต์ จงหา Loc(Z[2,8,9]) ทั้งแบบคอลัมน์เมเจอร์ (column Major) และ โรว์เมเจอร์ (Row Major) Array
ให้เขียน Algorithm (จะใช้ Flowchart หรือ Pseudo-code) • จงเขียนโปรแกรมเพื่อรับชื่อและคะแนนของนักศึกษาจำนวน 10 คน • หลังจากรับชื่อและคะแนนครบแล้วให้แสดงเฉพาะชื่อและคะแนนของนักศึกษาที่สอบผ่าน โดยมีเงื่อนไขว่าสอบได้คะแนน มากกว่าหรือเท่ากับ 60 คะแนน Array