1 / 29

โครงสร้างข้อมูล (Data Structure)

โครงสร้างข้อมูล (Data Structure). การค้นหาข้อมูล (Searching). การค้นหาข้อมูล (Searching).

Download Presentation

โครงสร้างข้อมูล (Data Structure)

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. โครงสร้างข้อมูล (Data Structure) การค้นหาข้อมูล (Searching)

  2. การค้นหาข้อมูล (Searching) • การค้นหาข้อมูลจะมีประสิทธิภาพมากน้อยเพียงใด ขึ้นอยู่กับขั้นตอนวิธีการค้นหาข้อมูลเป็นสำคัญ การค้นหาข้อมูลมีหลายวิธี แต่ละวิธีก็มีข้อดีข้อเสียด้วยกันทั้งสิ้น และยังเหมาะสมเฉพาะงาน ซึ่งในจะแสดงวิธีการค้นหาข้อมูล 3 วิธีด้วยกันคือ • การค้นหาแบบลำดับ (Sequential search) • การค้นหาแบบทวิภาค (Binary search) • การค้นหาแบบแฮช (Hashing search)

  3. การค้นหาแบบลำดับ (Sequential search) • Sequential search เป็นกรรมวิธีค้นหาข้อมูลที่ง่ายที่สุด และสามารถกระทำบนโครงสร้างข้อมูลที่ถูกจัดเรียงหรือไม่ก็ได้ • หลักการของ Sequential search คือ เอาค่าข้อมูลที่ต้องการหาตำแหน่งในโครงสร้างไปไล่เทียบข้อมูลในโครงสร้างทีละตัวตามลำดับ

  4. การค้นหาแบบลำดับ (Sequential search) • KEY = 54 (มีข้อมูล) 25 32 48 3 3 7 7 12 12 25 32 48 54 78 k 5 6 7 0 1 2 3 4 i = i + 1 i = i + 1 i = i + 1 i = 0 i = i + 1 i = i + 1 i = i + 1 found not found not found not found not found not found not found i = 6 Comparison time(s) 2 3 1 4 5 6 7

  5. การค้นหาแบบลำดับ (Sequential search) • KEY = 99 (ไม่มีข้อมูล) 3 7 12 25 32 48 54 78 3 7 12 25 32 48 54 78 k 5 6 7 0 1 2 3 4 i = i + 1 i = i + 1 i = i + 1 i = i + 1 i = 0 i = i + 1 i = i + 1 i = i + 1 not found not found not found not found not found not found not found not found Comparison time(s) NOT FOUND…!!! 3 2 1 6 5 4 8 7

  6. การค้นหาแบบลำดับ (Sequential search) • จำนวนครั้งของการเปรียบเทียบ • หาเจอเมื่อเปรียบเทียบครั้งแรกเจอ = O (1) • ไม่มีข้อมูลนั้นอยู่ = O (n) • ค่าเฉลี่ยของจำนวนครั้งของการค้นหาเมื่อไฟล์ขนาด N คือ O (N/2)

  7. การค้นหาแบบลำดับ (Sequential search) • ขั้นตอนวิธีข้างต้นของการค้นหาแบบเรียงลำดับจะเหมาะกับการค้นหาค่าในชุดข้อมูลที่ไม่ได้เรียง • แต่ถ้าข้อมูลเรียงเรียบร้อยแล้ว จะมีข้อเสียบางประการคือ กรณีที่ค้นหาไม่พบ แม้ว่าเมื่อค้น target ในชุดข้อมูลจนถึงตัวที่มีค่ามากกว่า target แล้ว การค้นหายังไม่ยุติการค้น ยังคงวนรอบเพื่อเปรียบเทียบข้อมูลจนถึงตัวสุดท้ายในชุดข้อมูล ทำให้เสียเวลา

  8. การค้นหาแบบลำดับ (Sequential search) • การปรับปรุงประสิทธิภาพการค้นหาแบบลำดับ • การค้นหาข้อมูลแบบลำดับด้วยเทคนิคการเรียงลำดับข้อมูล เรียงลำดับข้อมูลจากน้อยไปหามาก • การค้นหาข้อมูลแบบลำดับด้วยเทคนิคเซล์ฟรีออร์เดอร์ริ่ง (Self Reordering)ปรับปรุงขั้นตอนวิธีการค้นหา โดยการค้นหาข้อมูลจะหยุดทำการค้นหาเมื่อพบว่าคีย์ที่ใช้ค้นมีค่าน้อยกว่าข้อมูลในชุดข้อมูล

  9. การค้นหาแบบลำดับแบบปรับปรุงการค้นหาแบบลำดับแบบปรับปรุง • KEY = 29 (ไม่มีข้อมูล) 3 7 12 25 32 48 54 78 3 7 12 25 32 k 5 6 7 0 1 2 3 4 i = i + 1 i = i + 1 i = i + 1 i = 0 i = i + 1 not found not found not found not found K[i] > key Stop..!! Comparison time(s) NOT FOUND…!!! 1 2 3 4 5

  10. การค้นหาแบบทวิภาค (Binary Search) • เป็นการค้นหากับข้อมูลที่ถูกเรียงลำดับแล้ว • ปัญหากรณีที่ข้อมูลจำนวนมากจะต้องเสียเวลาในการเรียง • ขั้นตอนในการค้นหาข้อมูลมีดังนี้ • กำหนด หรือรับข้อมูลที่ต้องการค้นหา • แบ่งครึ่งแฟ้มข้อมูลหรือแถวลำดับข้อมูล • ทำการเปรียบเทียบข้อมูลในแฟ้มข้อมูลหรือแถวลำดับข้อมูล โดยแบ่งครึ่งลงไปเรื่อยๆ จนกว่าจะพบหรือไม่สามารถแบ่งได้อีกต่อไป นั้นหมายความว่าไม่พบข้อมูลนั้นแน่นอน

  11. 2 4 5 9 12 20 27 0 1 2 3 4 5 6 low upper 2 4 5 9 12 20 27 0 1 2 3 4 5 6 การค้นหาแบบทวิภาค (Binary Search) Key = 20 ครั้งที่ 1 เปรียบเทียบค่า key = 20 กับข้อมูลที่อยู่กึ่งกลางของ list พบว่า ค่า key มีค่ามากกว่าค่ากึ่งกลางของข้อมูล ดังนั้นไปค้นหาข้อมูลต่อในส่วนที่ 2 9 ข้อมูลส่วนที่ 1 ข้อมูลส่วนที่ 2 mid = (low+upper)/2 = (0+6)/2 = 3

  12. low upper 2 4 5 9 12 20 27 0 1 2 3 4 5 6 การค้นหาแบบทวิภาค (Binary Search) • ครั้งที่ 2 เปรียบเทียบค่า key = 20 กับข้อมูลที่อยู่กึ่งกลางของข้อมูลส่วนที่ 2 20 mid = (low+upper)/2 = (4+6)/2 = 5 ข้อมูลส่วนที่ 2 ข้อมูลส่วนที่ 1 FOUND…!! ค่า key = 20 ที่ต้องการค้นหามีค่าตรงกับข้อมูลที่อยู่กึ่งกลางของข้อมูลส่วนที่ 2 หมายความพบข้อมูลที่ต้องการ

  13. 2 4 5 9 12 20 27 0 1 2 3 4 5 6 low upper 2 4 5 9 12 20 27 0 1 2 3 4 5 6 การค้นหาแบบทวิภาค (Binary Search) Key = 7 ครั้งที่ 1 เปรียบเทียบค่า key = 7 กับข้อมูลที่อยู่กึ่งกลางของ list พบว่า ค่า key มีค่าน้อยกว่าค่ากึ่งกลางของข้อมูล ดังนั้นไปค้นหาข้อมูลต่อในส่วนที่ 1 9 ข้อมูลส่วนที่ 1 ข้อมูลส่วนที่ 2 mid = (low+upper)/2 = (0+6)/2 = 3

  14. low upper 2 4 5 9 12 20 27 0 1 2 3 4 5 6 การค้นหาแบบทวิภาค (Binary Search) • ครั้งที่ 2 เปรียบเทียบค่า key = 7 กับข้อมูลที่อยู่กึ่งกลางของข้อมูลส่วนที่ 1 4 mid = (low+upper)/2 = (0+2)/2 = 1 ข้อมูลส่วนที่ 1 ข้อมูลส่วนที่ 2 Key มีค่ามากกว่าค่ากึ่งกลางของข้อมูลส่วนที่ 1นี้ ดังนั้นไปค้นหาต่อที่ข้อมูลส่วนที่ 2

  15. low upper 2 4 5 9 12 20 27 0 1 2 3 4 5 6 การค้นหาแบบทวิภาค (Binary Search) • ครั้งที่ 3 เปรียบเทียบค่า key = 7 กับข้อมูลที่อยู่กึ่งกลางของข้อมูล 4 NOT FOUND…!! ข้อมูลที่ค้นหา เปรียบเทียบค่า 5 กับค่า 7 เนื่องจาก key = 7 ไม่เท่ากับ 5 แต่มีค่ามากกว่าจึงต้องค้นหนต่อไป แต่ปรากฏว่าไม่มีค่าระหว่าง 5 กับ 7 อีกแล้วเพราะฉะนั้นสรุปได้ว่า ไม่พบข้อมูล 7 ในข้อมูลชุดนี้

  16. การค้นหาแบบทวิภาค (Binary Search) • กระบวนการทำงานแบบ Binary Search จะพบว่าเมื่อมีการเปรียบเทียบแต่ละครั้งจะมีการตัดข้อมูลในตารางออกไปได้ทีละครึ่งหนึ่งเสมอ ดังนั้นถ้าเริ่มต้นมีจำนวนข้อมูล n ตัว • จำนวนข้อมูลที่นำมาเพื่อค้นหาค่าที่ต้องการหลังการเปรียบเทียบแต่ละครั้งจะเป็นดังนี้ ครั้งที่ 2 = n/2 (หรือ n/21) ครั้งที่ 3 = n/4 (หรือ n/22) ครั้งที่ 4 = n/8 (หรือ n/23)

  17. การค้นหาแบบทวิภาค (Binary Search) • การเปรียบเทียบจะได้ว่า n/2k < 1 หรือ n < 2k จะได้ log2 n < k • จำนวนการเปรียบเทียบของ Binary Search คือ O(log2 n )

  18. การค้นหาแบบแฮช (Hashing search) • เป็นวิธีการค้นหาข้อมูลที่ใช้การแปลงคีย์ (Key) ให้เป็นตำแหน่ง(Address) ที่อยู่ในพื้นที่เก็บข้อมูล โดยใช้เทคนิคการสร้างตารางมาเพื่อเก็บคีย์ดังกล่าว • การแปลงคีย์ให้เป็นแอดเดรส คือ การแปลงข้อมูลให้ไปอยู่ในตารางแอดเดรสที่เตรียมไว้ซึ่งตารางนี้เรียกว่า ตารางแฮช (Hash Table) • การแปลงค่านี้ต้องอาศัยฟังชัน H(k) เป็นตัวช่วยในการหาแอดเดรสของค่าคีย์ k (ค่า H(k) คือ แอดเดรสของคีย์ K นั้นเอง)

  19. การค้นหาแบบแฮช (Hashing search) • การค้นหาด้วยวิธีนี้จะไม่ขึ้นอยู่กับจำนวนข้อมูล • อาศัยหลักการคำนวณตำแหน่งที่เก็บข้อมูลจากคีย์ที่กำหนด นั่นคือจะต้องหา Hashing Function ที่เหมาะสม • บางครั้ง Hashing Function จะคำนวณค่า key ที่ต่างกันแต่ให้ค่าตำแหน่งเพื่อเก็บข้อมูลที่เดียวกัน ซึ่งเหตุการณ์ที่เกิดขึ้นในลักษณะนี้เรียกว่าการชนกันของคีย์ (Collision)

  20. การค้นหาแบบแฮช (Hashing search) hash function อย่างง่าย hash(key) = key MOD TableSize • TableSizeคือ ขนาดของตารางที่จัดเก็บควรเลือกค่าที่เป็นจำนวนเฉพาะ (Prime Number)

  21. การค้นหาแบบแฮช (Hashing search) • ชุดตัวเลข 9, 17, 22, 14, 13, 5 ถ้ากำหนดแฮชชิ่งฟังก์ชั่นด้วยสมการ H(K) = K MOD 9 ค่าที่ได้จากแฮชชิ่งฟังก์ชั่นแสดงได้ดังนี้ H(9) = 0 H(17) = 8 H(22) = 4 H(14) = 5 H(13) = 4 H(8) = 8 คีย์ 17 ได้ตำแหน่งแอดเดรสตรงกับคีย์ 8 คีย์ 22ได้ตำแหน่งแอดเดรสตรงกับคีย์ 13 ลักษณะเช่นนี้เรียกว่าเกิดการชนกันของคีย์

  22. การค้นหาแบบแฮช (Hashing search) • การแก้ปัญหาการชนกันของคีย์ (Collision) ทำโดยการเก็บค่าคีย์ใน Hash tableแบบ • Chaining • Open Addressing

  23. Chaining • วิธี Chaining เป็นวิธีการแก้ไขปัญหาของการชนกันที่ดีที่สุด มีการใช้ linked list เข้ามาช่วย โดยมีการแบ่งเนื้อที่ออกเป็น 2 ส่วน ส่วนแรกจะเก็บ address  ส่วนที่สองจะเก็บค่าข้อมูลทั้ง list ที่มี address เดียวกัน

  24. Chaining Key={0, 81, 64, 25, 36, 49, 4, 1, 9, 16} H(x) = x MOD 10

  25. Open addressing • open addressing วิธีการนี้เราจะค้นหาค่าตำแหน่งถัดไปที่ยังว่าง แล้วนำข้อมูลที่ได้มาในภายหลังไปเก็บไว้ • แบ่งออกเป็น 3 ประเภท • Open addressing with Linear Probing • Open addressing with Quadratic Probing • Open addressing with Double Hashing

  26. Open addressing Key {89, 18, 49, 58, 69} Hash function: hash(x) = x MOD 10 Collision resolution strategy: f(i) = i ( i แทน ครั้งที่หา ) hi(x) = (hash(x)+f(i)) mod 10) Open addressing with Linear Probing

  27. 49 MOD 10 = 9 เกิดการชนกัน hi(x) = (hash(x)+f(i2)) mod 10) = (9+12) mod 10 = 0 58 MOD 10 = 8 เกิดการชนกัน hi(x) = (hash(x)+f(i2)) mod 10) = (8+12) mod 10 = 9 (ชน) = (8+22) mod 10 = 2 69 MOD 10 = 9 เกิดการชนกัน hi(x) = (hash(x)+f(i2)) mod 10) = (9+12) mod 10 = 0 (ชน) = (9+22) mod 10 = 3 Open addressing Key {89, 18, 49, 58, 69} Hash function: hash(x) = x MOD 10 Collision resolution strategy: f(i) = i2 hi(x) = (hash(x)+f(i2)) mod 10) Open addressing with Quadratic Probing

  28. 49 MOD 10 = 9 เกิดการชนกัน hi(x) = (hash(x)+f(i * hash2(x))) mod 10) = (9+( 1 * (7- (49 mod 7)) mod 10 = (9+7) mod 10 = 6 58 MOD 10 = 8 เกิดการชนกัน hi(x) = (hash(x)+f(i * hash2(x))) mod 10) = (8+( 1 * (7- (58 mod 7)) mod 10 = (8+5) mod 10 = 3 69 MOD 10 = 9 เกิดการชนกัน hi(x) = (hash(x)+f(i * hash2(x))) mod 10) = (9+( 1 * (7- (69 mod 7)) mod 10 = (9+1) mod 10 = 0 Open addressing Key {89, 18, 49, 58, 69} Hash functions: hash(x) = x MOD 10 hash2(x) = 7 - (x MOD 7) Collision resolution strategy: f(i) = i * hash2(x) Open addressing with Double Hashing

  29. Open addressing • รูปแบบของ hash2(x) ที่นิยม คือ hash2(x) = R - (x MOD R) เมื่อ R คือ จำนวนเฉพาะ (Prime Number) ที่น้อยกว่า TableSize

More Related