User Tools

Site Tools


Sidebar

1. บทนำ

2. การวิเคราะห์ Algorithm

3. List, Stack and Queue

4. Tree

5. Hashing

6. Priority Queues

7. การจัดเรียง (Sorting)

8. The Disjoint Set

9. Graph Algorithms

dsa:hextend

5.7 Extendible Hashing

หัวข้อสุดท้ายที่จะกล่าวถึงในบทนี้คือกรณีที่จำนวนข้อมูลมีปริมาณมากเกินกว่าที่จะบรรจุลงในหน่วยความหลักได้ทั้งหมด ดังที่ได้กล่าวไปแล้วในบทที่ 4 ว่าสิ่งที่จะต้องให้ความสนใจในกรณีเช่นนี้ คือจำนวนครั้งในการเข้าถึงแผ่นจานแม่เหล็กที่เราต้องการอ่านเขียนหรือค้นหาข้อมูล

สมมุติ เรามีข้อมูลอยู่จำนวน N รายการที่จะต้องจัดเก็บ ณ เวลาหนึ่ง ซึ่งค่า N นี้จะเปลี่ยนไปตามเวลาที่ใช้งาน และเรากำหนดให้ disk block หนึ่งสามารถจุข้อมูลได้ M รายการ ในหัวข้อนี้เราจะใช้ M = 4 ปัญหาที่จะเกิดขึ้นถ้าเราเลือกใช้โครงสร้างข้อมูลแบบตารางแฮชทั้งที่เป็น open hashing หรือ closed hashing ก็คือ เมื่อเกิดการชนขึ้นก็อาจจะทำให้ต้องมีการอ่านบล็อกจำนวนมากเพื่อการค้นหา (find) ถึงแม้จะเป็นตารางที่มีการกระจายของข้อมูลที่ดีก็ตาม ยิ่งไปกว่านั้น เมื่อตารางใกล้เต็ม และต้องใช้การ rehash ก็จะต้องใช้จำนวนการเข้าถึง disk block เป็น $O(N)$ บล็อก ซึ่งเป็นสิ่งที่ไม่พึงประสงค์

Extendible hashing มีการทำงานของ find ด้วยการเข้าถึง disk เพียงสองครั้ง การบรรจุค่าก็เข้าถึง disk เพียงไม่กี่ครั้ง สำหรับโครงสร้างแบบ B-tree แล้วก็จะมีความลึกเป็น $O(log_{M/2}⁡N)$ และเมื่อ M มีค่าเพิ่มขึ้นความลึกของ B-tree ก็จะลดลง ดังนั้นในทางทฤษฎีแล้ว เราก็อาจจะเลือกให้ M มีค่ามากจนกระทั่งความลึกของ B-tree ดังกล่าวนั้นมีค่าเท่ากับ 1 และการทำงาน find การอ่านบล็อกแรกแล้วก็จะอ่านบล็อกอีกครั้งเท่านั้น ถ้าสมมติให้โนดรากทั้งโนดของมันสามารถเก็บในหน่วยความหลักได้ ปัญหาของวิธีที่กล่าวนี้ คือ จำนวนกิ่งแขนงมีเป็นจำนวนสูงมากและต้องใช้เวลาการทำงานนานมากเพื่อตัดสินใจว่าโนดที่เป็น leaf โนดใดที่มีข้อมูลที่ต้องการ และถ้าเวลาที่ต้องใช้ในขั้นตอนที่กล่าวนี้สามารถทำให้ลดลงได้ก็จะเป็นวิธีที่น่านำมาใช้ได้ในทางปฏิบัติ วิธีที่จะทำเช่นที่กล่าวนี้ได้คือวิธีที่เรียกว่า extendible hashing

สมมติให้ข้อมูลที่เรามีสามารถเขียนแทนได้ด้วย six-bit integers รูปที่ 5.23 แสดง extendible hashing ของข้อมูลนี้ รากของ “tree” มีตัวเชื่อมต่อ (link) 4 ตัวที่นำมาจากสองบิตแรกของชุดข้อมูล แต่ละ leaf มีข้อมูลสมาชิกได้สูงสุดถึง M = 4 ตัว จะเห็นว่าค่าข้อมูลในแต่ละ leaf เดียวกันมีสองบิตแรกเหมือนกันซึ่งระบุได้ด้วยตัวเลขในวงเล็บ หรือกล่าวว่า ถ้า D แทนจำนวนบิตที่ใช้ในโนดราก (เรียกว่า directory) จำนวนรายการที่สามารถบรรจุได้ใน directory ก็จะเป็น 2D รายการ ตัวเลข dL เป็นจำนวนบิตนำหน้าของข้อมูลที่ทุกสมาชิกใน leaf L มีค่าเหมือนกัน ค่าของ dL จะเป็นเท่าใดนั้นขึ้นอยู่กับว่ามันเป็น leaf ใด, และ dL < D

ถ้าเราต้องการบรรจุค่า 100100 ค่านี้ก็จะต้องถูกจัดอยู่ใน leaf ที่ 3 แต่เนื่องจาก leaf ที่ 3 นี้ไม่มีที่ว่างพอเนื่องมีจำนวนข้อมูลเต็มความจุแล้วทำให้ต้องแยกโนดนี้ออกเป็น 2 โนดโดยที่ต้องนำบิตที่ 3 ของข้อมูลมาร่วมใช้ในการพิจารณาด้วย และยังจะต้องเพิ่มขนาดของ directory ขึ้นเป็น 3 บิต ผลการทำงานนี้แสดงในรูปที่ 5.24

จะสังเกตเห็นว่าโนดที่เป็น leaf ใดที่ไม่เกี่ยวข้องกับการแบ่งแยกโนดก็จะมีตัวเชื่อมต่อของ directory มาจาก 2 รายการ ถ้าต้องการบรรจุค่า 000000 ก็จะต้องแยกโนดแรกเป็น 2 โนดที่มี dL = 3 เนื่องจาก D = 3 การปรับเปลี่ยนที่เกิดขึ้นใน directory คือการเปลี่ยนตัวเชื่อมต่อของ 000 และ 001 เท่านั้น ดังแสดงในรูปที่ 5.25


รูปที่ 5.23 Extendible hashing ของข้อมูลเริ่มต้น


รูปที่ 5.24 Extendible hashing หลังการบรรจุค่า 100100 และเกิดการขยาย directory


รูปที่ 5.25 Extendible hashing หลังการบรรจุค่า 000000 และเกิดการแยกโนดของ leaf

dsa/hextend.txt · Last modified: 2021/09/08 21:46 by wasu

Page Tools