1 / 49

โครงสร้างข้อมูลและอัลกอริธึม

โครงสร้างข้อมูลและอัลกอริธึม. โครงสร้างข้อมูลแบบอาร์เรย์ (Array). Array.

Download Presentation

โครงสร้างข้อมูลและอัลกอริธึม

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. โครงสร้างข้อมูลและอัลกอริธึมโครงสร้างข้อมูลและอัลกอริธึม โครงสร้างข้อมูลแบบอาร์เรย์ (Array) Array

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

  3. A[1:5] DATA DATA DATA DATA DATA A [ 1 : 5 ] ขนาดและมิติ (Dimension) ขอบเขตสูงสุด (Upper Bound) ขอบเขตต่ำสุด (lower Bound) ชื่อโครงสร้าง (Array Name) ลักษณะโครงสร้างข้อมูลอาร์เรย์ Array

  4. คุณสมบัติสำคัญของอาร์เรย์คุณสมบัติสำคัญของอาร์เรย์ • อาร์เรย์เป็นตัวแทนกลุ่มของข้อมูลที่มีความสัมพันธ์กัน • สมาชิกในอาร์เรย์จะมีคุณสมบัติเหมือนๆกัน • ขนาดของอาร์เรย์จะมีค่าคงที่ • อาร์เรย์เป็นโครงสร้างข้อมูลที่ผู้ใช้สามารถอ้างอิงเพื่อเข้าถึงข้อมูลที่ต้องการได้ทันที • อาเรย์ของ 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

  5. ตัวอย่าง เช่น 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

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

  7. ตัวอย่างการใช้งานอาร์เรย์ตัวอย่างการใช้งานอาร์เรย์ 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

  8. ประเภทของอาร์เรย์ • อาร์เรย์หนึ่งมิติ (One Dimension Array) • อาร์เรย์สองมิติ (Tow Dimension Array) • อาร์เรย์สามมิติ (Three Dimension Array) Array

  9. อาร์เรย์หนึ่งมิติ (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

  10. การคำนวณหาจำนวนสมาชิกของอาร์เรย์หนึ่งมิติการคำนวณหาจำนวนสมาชิกของอาร์เรย์หนึ่งมิติ • จำนวนสมาชิก = U-L+1 โดยที่ U = ขอบเขตบนสุด (Upper Bound) L = ขอบเขตล่างสุด (Lower Bound) ตัวอย่าง จำนวนสมาชิก = U – L + 1 =4 – 0 + 1 = 5 Array

  11. การคำนวณหาตำแหน่งแอดเดรสในหน่วยความจำของอาร์เรย์หนึ่งมิติการคำนวณหาตำแหน่งแอดเดรสในหน่วยความจำของอาร์เรย์หนึ่งมิติ LOC(a[i]) = B + w(i-L) โดย LOC(a[i]) = ตำแหน่งแอดเดรสที่เก็บ a[i] ในหน่วยความจำ B = แอดเดรสเริ่มต้นของ (Base Address) a w = จำนวนช่องของหน่วยความจำที่จัดเก็บข้อมูลต่อหนึ่งสมาชิก i = ตำแหน่งของอาร์เรย์ L = ขอบเขตล่างสุด (Lower Bound) Array

  12. ตัวอย่างที่ 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

  13. ตัวอย่างที่ 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

  14. Col 1 Col 2 Col 3 Col 4 Row 1 Row 2 Row 3 Row 4 อาร์เรย์สองมิติ (Two Dimension Array) • หมายถึง โครงสร้างข้อมูลที่มีการจัดเก็บข้อมูลแบบตารางสองทาง ข้อมูลมีการจัดเรียงกันตามแนวแถว (Row) และ แนวหลัก (Column) การอ้างถึงข้อมูลต้องระบุตำแหน่งแถวและตำแหน่งหลักที่ข้อมูลนั้นอยู่ Array

  15. อาร์เรย์สองมิติ • รูปแบบทั่วไปของโครงสร้างข้อมูลอาร์เรย์ 2 มิติ ArrayName[L1:U1, L2 : U2] เมื่อ ArrayName คือ ชื่อของโครงสร้างข้อมูลอาร์เรย์ L1 คือ ค่าขอบเขตล่างสุด (lower Bound) ของแถว U1 คือ ค่าขอบเขตสูงสุด (Upper Bound) ของแถว L2 คือ ค่าขอบเขตล่างสุด (lower Bound) ของคอลัมน์ U2 คือ ค่าขอบเขตสูงสุด (Upper Bound) ของคอลัมน์ Array

  16. อาร์เรย์สองมิติ 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

  17. การคำนวณหาจำนวนสมาชิกของอาร์เรย์สองมิติการคำนวณหาจำนวนสมาชิกของอาร์เรย์สองมิติ 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

  18. การจัดเก็บอาร์เรย์สองมิติในหน่วยความจำสามารถจัดเก็บได้ 2 วิธี • การจัดเก็บด้วยการเรียงแถวเป็นหลัก (Row Major Order) • การจัดเก็บด้วยการเรียงคอลัมน์เป็นหลัก (Column Major Order) Array

  19. สูตรการคำนวณหาแอดเดรสที่ใช้เก็บข้อมูลในอาร์เรย์สองมิติสูตรการคำนวณหาแอดเดรสที่ใช้เก็บข้อมูลในอาร์เรย์สองมิติ -แบบการเรียงแถวเป็นหลัก สูตร 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

  20. 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

  21. คำนวณ • สูตร 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

  22. สูตรการคำนวณหาแอดเดรสที่ใช้เก็บข้อมูลในอาร์เรย์สองมิติสูตรการคำนวณหาแอดเดรสที่ใช้เก็บข้อมูลในอาร์เรย์สองมิติ -แบบเรียงคอลัมน์เป็นหลัก สูตร 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

  23. 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

  24. คำนวณ • สูตร 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

  25. อาร์เรย์สามมิติ (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

  26. จงหาจำนวนสมาชิกของอาร์เรย์ 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

  27. อาร์เรย์สามมิติ 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

  28. การคำนวณหาแอดเดรสของอาร์เรย์สามมิติแบบแถวเป็นหลักการคำนวณหาแอดเดรสของอาร์เรย์สามมิติแบบแถวเป็นหลัก สูตร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

  29. ตัวอย่าง • ต้องการทราบตำแหน่งแอดเดรสที่เก็บข้อมูลอาร์เรย์ 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

  30. อาร์เรย์สามมิติชื่อ s ที่จัดเก็บข้อมูลแบบใช้แถวเป็นหลัก Array

  31. Array Array

  32. Array Array

  33. Array Array

  34. Array Array

  35. Array Array

  36. Array Array

  37. Array Array

  38. Array Array

  39. Array Array

  40. Array Array

  41. Array Array

  42. Array Array

  43. Array Array

  44. Array Array

  45. Array Array

  46. 1. กำหนด Array x[-20..5] อยากทราบว่า • แถวลำดับ x จะมีสมาชิกกี่ตัว • ถ้า Loc (x[-20]) = 500 และใช้เนื้อที่ 4 ไบต์ จงหา Loc(x[-10]) Array

  47. การบ้าน 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

  48. 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

  49. ให้เขียน Algorithm (จะใช้ Flowchart หรือ Pseudo-code) • จงเขียนโปรแกรมเพื่อรับชื่อและคะแนนของนักศึกษาจำนวน 10 คน • หลังจากรับชื่อและคะแนนครบแล้วให้แสดงเฉพาะชื่อและคะแนนของนักศึกษาที่สอบผ่าน โดยมีเงื่อนไขว่าสอบได้คะแนน มากกว่าหรือเท่ากับ 60 คะแนน Array

More Related