บทที่ 10 การค้นหาข้อมูล (Searching)
10.1 บทนำ ข้อมูลข่าวสารที่เก็บอยู่ในคอมพิวเตอร์ หลังจากการประมวลผลแล้ว ผู้ใช้ย่อมต้องนำข้อมูลข่าวสารเหล่านั้นออกมาใช้ ซึ่งขั้นตอนในการนำข้อมูลออกจากคอมพิวเตอร์จะเร็วขึ้นหรือช้า ขึ้นอยู่กับอัลกอริทึมที่ใช้ และอัลกอริทึมที่ใช้ก็ขึ้นอยู่กับลักษณะการจัดเก็บข้อมูลนั้น
10.2 ประเภทของการค้นหาข้อมูล เมื่อมีการจัดเก็บข้อมูลในโครงสร้างข้อมูลประเภทต่าง ๆ แล้ว ผู้ใช้สามารถค้นหาข้อมูลได้โดยใช้อัลกอริทึมในการค้าหาข้อมูลประเภทต่าง ๆ ดังนี้ คือ 10.2.1 การค้นหาข้อมูลแบบเรียงลำดับ (Sequential Search) 10.2.2 การค้นหาข้อมูลแบบไบนารี (Binary Search) 10.2.3 การค้นหาข้อมูลแบบโดยการใช้แฮชชิ่ง (Hashing)
10.2 ประเภทของการค้นหาข้อมูล 10.2.1 การค้นหาข้อมูลแบบเรียงลำดับ (Sequential Search) หลักการในการค้นหาข้อมูลแบบเรียงลำดับ มีดังนี้ 1. กำหนดข้อมูลที่ต้องการค้นหา 2. เริ่มต้นค้นหาข้อมูลในตำแหน่งแรกสุด 3. ทำการเปรียบเทียบค่าข้อมูลที่ต้องการค้นหากับค้าข้อมูลในตำแหน่งนั้น ๆ - ถ้าค่าทั้งสองตรงกัน แสดงว่าค้นพบข้อมูลที่ต้องการ และจบการทำงานในส่วนของการค้นหา
10.2 ประเภทของการค้นหาข้อมูล 10.2.1 การค้นหาข้อมูลแบบเรียงลำดับ (Sequential Search) - ถ้าค่าทั้งสองตรงกัน แสดงว่าค้นพบข้อมูลที่ต้องการ และจบการทำงานในส่วนของการค้นหา - ทำการเปรียบเทียบในข้อ 3 จนพบข้อมูลที่ต้องการ - ถ้าเปรียบเทียบไปจนถึงข้อมูลตัวสุดท้ายแล้วยังไม่พบข้อมูลที่ต้องการ ให้จบการทำงานในส่วนของการค้นหา แสดงว่าไม่มีข้อมูลที่ต้องการ
10.2 ประเภทของการค้นหาข้อมูล ตัวอย่างที่ 10.1 กำหนดข้อมูลที่จัดเก็บไว้ดังนี้ 85 62 67 92 64 58 ให้แสดงขั้นตอนการค้นหา ITEM = 92 โดยวิธีการค้นหาข้อมูลแบบเรียงลำดับ วิธีทำ 1. เปรียบเทียบ ITEM = 92 กับข้อมูลในตำแหน่งที่ 1 คือ 85 ซึ่งข้อมูลไม่ตรงกัน จึงเลื่อนข้อมูลไปอีกหนึ่งตำแหน่ง 2. เปรียบเทียบ ITEM = 92 กับข้อมูลในตำแหน่งที่ 2 คือ 65 ซึ่งข้อมูลไม่ตรงกัน จึงเลื่อนข้อมูลไปอีกหนึ่งตำแหน่ง
10.2 ประเภทของการค้นหาข้อมูล ตัวอย่างที่ 10.1 กำหนดข้อมูลที่จัดเก็บไว้ดังนี้ 85 62 67 92 64 58 วิธีทำ 3 เปรียบเทียบ ITEM = 92 กับข้อมูลในตำแหน่งที่ 3 คือ 67 ซึ่งข้อมูลไม่ตรงกัน จึงเลื่อนข้อมูลไปอีกหนึ่งตำแหน่ง 4. เปรียบเทียบ ITEM = 92 กับข้อมูลในตำแหน่งที่ 4 คือ 92 ซึ่งข้อมูลตรงกัน ดังนั้นผลลัพธ์ที่ได้ คือ ITEM = 92 อยู่ตำแหน่งที่ 4
10.2 ประเภทของการค้นหาข้อมูล 10.2.2 การค้นหาข้อมูลแบบไบนารี (Binary Search) การค้นพบข้อมูลแบบไบนารี จะใช้ได้กับข้อมูลที่เรียงลำดับแล้วเท่านั้น วิธีการค้นหาทำได้ดังนี้ คือ กำหนดข้อมูลที่ต้องการหา 1. แบ่งข้อมูลออกเป็น 2 กลุ่ม 2. เปรียบเทียบข้อมูลที่ต้องการค้นหากับข้อมูลที่อยู่ตำแหน่งกึ่งกลาง หากไม่เท่ากันแสดงว่ายังไม่พบ 3. ถ้าข้อมูลที่ต้องการค้นหามากกว่าข้อมูลในตำแหน่งกึ่งกลาง ให้ค้นหาต่อไปในครึ่งหลัง
10.2 ประเภทของการค้นหาข้อมูล 10.2.2 การค้นหาข้อมูลแบบไบนารี (Binary Search) 4. ถ้าข้อมูลที่ต้องการค้นหาน้อยกว่าข้อมูลในตำแหน่งกึ่งกลาง ให้ค้นหาต่อไปในครึ่งแรก 5. ทำเช่นนี้ไปเรื่อย ๆ จนค้นพบ หรือจนกว่าแบ่งครึ่งข้อมูลไม่ได้แล้ว แสดงว่าไม่มีข้อมูลที่ต้องการ
10.2 ประเภทของการค้นหาข้อมูล ตัวอย่างที่ 10.2 กำหนดข้อมูลที่จัดเก็บไว้ดังนี้ 2 4 5 8 9 12 16 19 20 24 27 ให้แสดงขั้นตอนการค้นหา ITEM = 20 โดยวิธีการค้นหาข้อมูลแบบไบนารี วิธีทำ 1. เปรียบเทียบ 20 กับข้อมูลที่อยู่ในตำแหน่งกึ่งกลาง คือ 12 2. เนื่องจาก 20 > 12 ดังนั้นจึงค้นหาต่อในครึ่งหลัง 3. เปรียบเทียบ 20 กับข้อมูลที่อยู่ตำแหน่งกึงกลางของครึ่งหลัง คือ 20 4. แสดงว่าค้นพบข้อมูลที่ต้องการ
10.2 ประเภทของการค้นหาข้อมูล 10.2.3 การค้นหาข้อมูลแบบโดยการใช้แฮชชิ่ง (Hashing) เป็นวิธีการจัดเก็บและค้นหาข้อมูลอีกอย่างหนึ่ง โดยนำค่าของข้อมูลที่ต้องการจัดเก็บมาทำการแปลงให้เป็นตำแหน่ง (Address) ที่จัดเก็บข้อมูล ซึ่งมีลักษณะเป็นฟังก์ชันที่กำหนดไว้ และเรียกฟังก์ชันนี้ว่า Hashing Function แบ่งออกเป็น ดังนี้ คือ 1. วิธีอาศัยการหาร โดยฟังก์ชันโมดูโล ในรูปแบบ K Mod N ซึ่งหมายถึงค่าของเศษที่ได้จากการหาร K ด้วย N
10.2 ประเภทของการค้นหาข้อมูล 10.2.3 การค้นหาข้อมูลแบบโดยการใช้แฮชชิ่ง (Hashing) K Mod N ดังนั้นฟังก์ชัน H(K) สามารถกำหนดได้ ดังนี้ H(K) = K Mod N + L0 โดยที่ N หมายถึง ขนาดตาราง L0 หมายถึง ค่าเริ่มต้นของตำแหน่งที่ต้องการ
10.2 ประเภทของการค้นหาข้อมูล ตัวอย่างที่ 10.3 จงคำนวณตำแหน่งของข้อมูลที่กำหนดให้ จากฟังก์ชัน H(K) = K Mod 7 + 1 ข้อมูลที่กำหนดให้ คือ 25 16 27 31 18 40 37 วิธีทำ H(25) = 5 H(16) = 3 H(27) = 7 H(31) = 4
10.2 ประเภทของการค้นหาข้อมูล ข้อมูลที่กำหนดให้ คือ 25 16 27 31 18 40 37 วิธีทำ H(18) = 5 H(40) = 6 H(37) = 3
10.2 ประเภทของการค้นหาข้อมูล 2. แบบ Mid Square เป็นเทคนิคการคำนวณตำแหน่งของข้อมูล โดยให้ยกกำลัง 2 ของข้อมูล จากนั้นให้ใช้บิตที่อยู่ตรงกลางจำนวน t บิต มาใช้ ถ้าตารางที่สร้างมีขนาด 2t ช่อง ตัวอย่างที่ 10.4 จงคำนวณตำแหน่งของชุดข้อมูล 31 42 51 14 12 3 7 17 กำหนดตารางที่ใช้เก็บตำแหน่งมี 16 ช่อง คือ ตำแหน่ง 0-15 วิธีทำ เนื่องจากขนาดของตาราง คือ 16 ช่อง = 24 ดังนั้น ค่าของคีย์ต้องใช้จำนวน 4 บิต
10.2 ประเภทของการค้นหาข้อมูล K K2 ไบนารีของ K2 หลังจากที่ค่า K2 ของคีย์แต่ละตัวแล้ว เราจะเลือก 4 บิตจากค่าในรูปไบนารีของ K2 ซึ่ง 4 บิต ที่เลือกจะเป็น 4 บิต ใดก็ได้อยู่ในดุลพินิจของเราเอง ส่วนใหญ่จะเลือก 4 บิต ที่มีลักษณะต่างกันให้มากที่สุด 31 961 1 42 1761 51 2601 14 196 12 144 3 9 7 49 17 289
10.2 ประเภทของการค้นหาข้อมูล กรณีนี้ ถ้าเลือกบิตที่ 3, 4, 5, 6 นับจากทางขวา จะได้ K(31) = K(42) 1 9 K(51 8 K(14) K(12) 4 K(3) 2 K(7) 12 K(17)
10.2 ประเภทของการค้นหาข้อมูล 3. แบบพับ (Folding) ในกรณีที่คีย์มีขนดใหญ่ประกอบด้วยตัวเลขหลายหลักและจำนวนช่องในตารางเล็กมากกว่า เราสามารถคำนวณตำแหน่งที่อยู่ของแต่ละคีย์โดยการพับ ตัวอย่างที่ 10.5 ถ้าข้อมูลประกอบด้วยตัวเลข 8 หลัก และตำแหน่งของข้อมูลมีค่า 000-999 ซึ่งประกอบด้วยตัวเลข 3 หลัก วิธีทำ - เลือกหลักของข้อมูล 3 หลัก ในที่นี้เลือกหลักที่ 3, 4, 5 1 2 3 4 5 6 7 8
10.2 ประเภทของการค้นหาข้อมูล - ทำการพับข้อมูลหลักที่เหลือคือหลักที่ 1, 6, 7, 8 ไปยังหลักที่ 3, 4, 5 ดังนี้ พับหลักที่ 2 ไปยังหลักที่ 3 พับหลักที่ 1 ไปยังหลักที่ 4 พับหลักที่ 6 ไปยังหลักที่ 5 พับหลักที่ 7 ไปยังหลักที่ 4 พับหลักที่ 8 ไปยังหลักที่ 3 - เมื่อพับแล้วให้นำตัวเลขในตำแหน่งเดียวกันมาบวกกัน 1 2 3 4 5 6 7 8
10.2 ประเภทของการค้นหาข้อมูล ตัวอย่างที่ 10.6 จงคำนวณตำแหน่งของข้อมูล 23107830 โดยวิธีพับ ซึ่งกำหนดตำแหน่งของข้อมูลประกอบด้วย ตัวเลข 3 หลัก วิธีทำ - ข้อมูลที่กำหนด คือ - หลักข้อมูลที่เลือกคือ 4, 5, 6 และทำการพับข้อมูล 1 2 3 4 5 6 7 8 2 3 1 7 8 3
10.2 ประเภทของการค้นหาข้อมูล - นำตัวเลขในตำแหน่งเดียวกันมาบวกกัน ตำแหน่งที่ 4 0 + 1 = 1 ดังนั้นตำแหน่งของข้อมูล 23107830 = 103 1 2 3 4 5 6 7 8 2 3 1 7 8 3
10.2 ประเภทของการค้นหาข้อมูล 4. Digital Analysis วิธีนี้ใช้ค่าของตำแหน่งข้อมูลเพียงบางส่วนเท่านั้น ดังนั้นจะต้องมีวิธีการในการพิจารณาตำแหน่งใดควรใช้ ซึ่งการเรียกค่าตำแหน่งหนึ่งตำแหน่งใดในหลาย ๆ ตำแหน่ง มีหลักการดังนี้คือ เลือกตำแหน่งที่มีการกระจายสม่ำเสมอ ซึ่งสามารถนำตำแหน่งที่เลือกไปใส่ใน Hashing Function แบบอื่น ๆ ได้ ตัวอย่างที่ 10.7 จงวิเคราะห์ตัวเลขต่อไปนี้ โดยให้เลือก 2 ตำแหน่งที่เหมาะสมเพื่อใช้เป็นค่าของตำแหน่งข้อมูล 2328 4123 2645 8326 2529 2648
10.2 ประเภทของการค้นหาข้อมูล 2328 4123 2645 8326 2529 2648 วิธีทำ 1. นำข้อมูลที่กำหนดให้มาสร้างตาราง โดยแยกเป็นแต่ละตำแหน่ง ดังนี้ 1 2 3 4 8 6 5 9
2. สร้างตารางเพื่อทำการวิเคราะห์ตัวเลขในแต่ละตำแหน่ง 1 2 3 4 5 6 7 8 9
10.2 ประเภทของการค้นหาข้อมูล จากการวิเคราะห์ตัวเลข จะเห็นว่า ตำแหน่ง 2, 4 มีการกระจายตัวเลขที่สม่ำเสมอกว่าตำแหน่งอื่น ดังนั้นจึงเลือกตำแหน่ง 2, 4 เพื่อกำหนดค่าของตำแหน่งข้อมูล ดังนื้ คือ H (2328) = 38 H (4123) = 13 H (2645) = 65 H (8326) = 36 H (2529) = 59 H (2648) = 68
10.3 เทคนิคการแก้ปัญหาการชนกันของตำแหน่งของข้อมูล ในการจัดเก็บและค้นหาข้อมูลโดยการใช้แอชชิง เป็นค่าของตำแหน่งที่ใช้ในการจัดเก็บข้อมูลนั้นโดยวิธีต่าง ๆ ซึ่งค่าของตำแหน่งที่ได้จึงมีโอกาสชนกัน คือ ข้อมูลต่างกันเมื่อนำมาแปลงหาค่าของตำแหน่งจะได้ค่าเดียวกัน ดังนั้นจึงต้องมีวิธีแก้ปัญหา ดังนี้ คือ
10.3 เทคนิคการแก้ปัญหาการชนกันของตำแหน่งของข้อมูล 10.3.1 วิธี Chaining เป็นวิธีที่ใช้ Pointer ของ Linked List เพื่อชี้ตำแหน่งถัดไป แบ่งออกเป็น 2 วิธี คือ 1. วิธี Chaining แบบที่แต่ละ Chain มีขนาดเท่ากัน หมายถึง ตารางที่ใช้เก็บตำแหน่งของข้อมูล ถูกออกแบบเป็นส่วน ๆ แต่ละส่วนที่เรียกว่า Bucket จำนวน n ส่วน แต่ละส่วนมีขนาด m ช่อง มีลักษณะเป็น Array ขนาด n x m ดังนี้
10.3 เทคนิคการแก้ปัญหาการชนกันของตำแหน่งของข้อมูล 1. วิธี Chaining แบบที่แต่ละ Chain มีขนาดเท่ากัน กรณีที่ข้อมูล 2 ตัว นำมาแปลงได้ตำแหน่งเดียวกัน ให้ใช้ตำแหน่งถัดไปในส่วนนั้น ๆ ถ้าส่วนใดค่าของตำแหน่งถูกใช้หมด ให้นำค่าข้อมูลนั้นไปเก็บไว้ในส่วน Overflow ส่วนที่ 1 M ช่อง ส่วนที่ 2 M ช่อง ส่วนที่ 1 M ช่อง ส่วน Overflow
ตัวอย่างที่ 10.8 กำหนดชุดข้อมูล 42 51 82 14 2 15 5 6 ให้แปลงค่าข้อมูลให้เป็นค่าของตำแหน่ง โดยใช้ Hashing Function H(K) = K Mod 5 + 1 โดยให้หลีกเลี่ยงการชนกันโดยใช้ Chaining แบ่งตารางออกเป็น 5 ส่วน แต่ละส่วนมี 4 ช่อง วิธีทำ ข้อมูล 42 51 82 14 2 15 5 6 ตำแหน่ง 3 2 3 5 3 1 1 2 15 ตำแหน่ง = 1 5 51 ตำแหน่ง = 2 6 82 ตำแหน่ง = 3 42 2 82 2 42 ตำแหน่ง = 4 14 ตำแหน่ง = 5
10.3 เทคนิคการแก้ปัญหาการชนกันของตำแหน่งของข้อมูล 2. วิธี Chaining แบบที่แต่ละ Chain มีขนาดไม่เท่ากัน ขึ้นอยู่กับจำนวนข้อมูลที่ตกอยู่ใน Chain นั้น ๆ วิธีนี้อาศัย Linked List จำนวน n โหนด แต่ละโหนดใช้สำหรับค่าของตำแหน่ง 1 ค่า ซึ่งแต่ละโหนดประกอบด้วย 2 ส่วน คือ - ส่วนที่เก็บค่าข้อมูล - ส่วนที่เก็บ Pointer
ตัวอย่างที่ 10.9 กำหนดชุดข้อมูล 42 49 82 14 2 15 5 6 ให้แปลงค่าข้อมูลให้เป็นค่าของตำแหน่ง โดยใช้ Hashing Function H(K) = K Mod 7 + 1 โดยให้หลีกเลี่ยงการชนกันโดยใช้ Chaining ที่มีขนาดไม่เท่ากัน วิธีทำ ข้อมูล 42 49 82 14 2 15 5 6 ตำแหน่ง 1 1 6 1 3 2 6 7 1 42 49 14 2 15 3 2 4 X 5 X 6 82 5 7 X
10.3 เทคนิคการแก้ปัญหาการชนกันของตำแหน่งของข้อมูล 10.3.2 วิธี Rehashing วิธีนี้เป็นวิธีที่ง่ายที่สุด โดยการคำนวณค่าของตำแหน่งใหม่ โดยการบวกค่าคงที่ค่าหนึ่งเข้ากับ Hashing Function ที่เกิดการชนกัน