320 likes | 487 Views
ตารางแฮช. Hash Table. แนวคิดพื้นฐานของตารางแฮช. เป็นโครงสร้างที่มีประสิทธิภาพต่อการจัดเก็บข้อมูลเพื่อการค้นหา การเพิ่ม และการลบข้อมูล โดย ไม่มีการดำเนินการที่เกี่ยวกับลำดับของข้อมูล
E N D
ตารางแฮช Hash Table
แนวคิดพื้นฐานของตารางแฮชแนวคิดพื้นฐานของตารางแฮช เป็นโครงสร้างที่มีประสิทธิภาพต่อการจัดเก็บข้อมูลเพื่อการค้นหา การเพิ่ม และการลบข้อมูล โดยไม่มีการดำเนินการที่เกี่ยวกับลำดับของข้อมูล อาศัยฟังก์ชันการคำนวณเลขที่อยู่ของข้อมูล ที่เรียกว่า “ฟังก์ชันแฮช”(Hash Function) ซึ่งมีหน้าที่แปลงคีย์ของข้อมูลไปเป็นเลขที่อยู่ (Address) ในช่องในตารางแฮช ฟังก์ชันแฮชที่ดีจะใช้สามารถคำนวณเลขที่อยู่ได้รวดเร็ว มีพฤติกรรมกระจายอย่างสม่ำเสมอ และแปลงคีย์ไปเป็นเลขที่อยู่ของตารางที่มีขนาดเล็ก
Hashing เป็นเทคนิคการสร้างตารางเก็บค่าคีย์แบบหนึ่ง ช่วยให้สามารถค้นหาข้อมูลในตารางนั้นได้ง่ายและรวดเร็วยิ่งขึ้น โดยอาศัยเทคนิคของการแปลงค่าคีย์เป็นเลขที่อยู่ (Address)ของข้อมูลนั้นในตาราง Hashing Function Address Key
คุณสมบัติของฟังก์ชันแฮชที่ดีคุณสมบัติของฟังก์ชันแฮชที่ดี คํานวณตำแหน่งที่อยูไดรวดเร็ว ในเวลาคงตัว (เวลาแปรตามขนาดของคีย์) สามารถกระจายค่าตำแหน่งที่อยู่ต่าง ๆ ที่ไม่ซ้ำกัน หรือ ซ้ำกันน้อยที่สุด
HashingFunction • Division Hashing • Digit Hashing • Mid Square Hashing • Fold Hashing • Fold Shift • Boundary Shift • Rotation Hashing
Key Concept เป็นฟังก์ชันโมดูลาในรูปแบบ K mod N ตำแหน่งที่อยู่ (Address) คือ ค่าเศษที่เหลือจากการหาร K/N K modN + L0 Key Address H(K) = K modN + L0 K คือ ค่าคีย์ของข้อมูล Nคือ ขนาดของตาราง L0คือ ค่าคงที่ที่ปรับเพื่อปรับค่าตำแหน่งที่อยู่เริ่มต้น
Ex. ให้คำนวณหาตำแหน่งของคีย์ต่อไปนี้ กำหนดให้ใช้ตารางแฮชขนาด 7 และมีตำแหน่งที่อยู่เริ่มต้นเป็น 0 เทคนิคDivision Hashing
Division Hashing :: Example H(K) = K mod 7 เกิดการซ้ำกันของคีย์ที่ได้จากการคำนวณทั้งหมด 4 ครั้ง
Digit Hashing :: Key Concept เป็นการเลือกค่าคีย์มาจากบางตำแหน่งเท่านั้น เช่น ค่าคีย์มีทั้งหมด 6 ตำแหน่ง แต่ต้องการจัดเก็บในตารางแฮชเพียง 3 ตำแหน่ง อาจเลือกตำแหน่งที่ 1, 3 และ 4 มาเป็นค่าเลขที่อยู่ในตารางแฮช เทคนิคDigit Hashing
Mid Square Hashing :: Key Concept นำค่าคีย์มายกกำลังสองตัดค่าด้านซ้ายและขวาออก k หลัก k = 4 เทคนิคMid Square Hashing
Digit Square เป็นการใช้เทคนิค Digit Hashing ร่วมกับ Mid SquareHashing เทคนิคDigit Square Hashing
Key Concept • แบ่งคีย์ออกเป็นส่วนๆ แล้วนำส่วนต่างๆ เหล่านี้มา "รวม" กัน • Summation • Exclusive OR • Fold Hashing มี 2 วิธีได้แก่ • Fold Shift • Boundary Shift เทคนิคFold Hashing
Fold Shift :: Summation กำหนดให้แบ่งกลุ่ม ๆ กลุ่มละ 3 หลัก Key 2 2 1 7 3 6 5 2 2 1 7 3 6 5 7 3 6 5 Address 9 6 2 เทคนิคFold Shift Hashing
Boundary Shift :: Summation กำหนดให้แบ่งกลุ่ม ๆ กลุ่มละ 3 หลัก Key 2 2 1 7 3 6 5 2 2 1 7 3 6 5 6 3 7 5 Address 3 5 8 เทคนิคBoundary Shift Hashing
Rotation Hashing 3 7 9 4 5 2 3 7 9 4 5 2 2 3 7 9 4 5 7 9 4 5 2 3 2 3 7 9 4 5 7 9 4 5 2 3 เทคนิคRotation Hashing Right Rotation Left Rotation
เทคนิคการเลือกใช้ Hashing Function จะต้องคำนึงถึงสิ่งต่อไปนี้ ค่า H(K) ที่ใช้ต้องเป็นฟังก์ชันที่คำนวณง่าย ไม่เสียเวลามาก Address ที่ได้จาก H(K) ต้องทำให้เกิดการซ้ำกันน้อยที่สุด ขนาดของตารางควรมีขนาดใหญ่กว่า ขนาดของข้อมูลชุดที่มีอยู่จริง ๆ เพราะถ้าช่วงฟังก์ชันมีขนาดใหญ่ ย่อมทำให้โอกาสที่จะเกิดการชนกันน้อยลง
การชนกันของคีย์และการแก้ปัญหาการชนกันของคีย์และการแก้ปัญหา
การชนกันของคีย์ (Collision) การชนกันของคีย์ คือ การที่นำคีย์ไปผ่าน Hashing Function แล้วได้ตำแหน่งแอดเดรสเป็นค่าเดียวกัน H(k1) = H(k2) เมื่อเกิดการชนกันขึ้น ( collision) ระหว่าง k1 และ k2 โดยมีฟังก์ชัน H เป็นตัวแปลงค่า เราต้องมีวิธีจัดการกับเหตุการณ์นี้ เพื่อให้ k1 และ k2 สามารถอยู่รวมกันได้ โดยต้องหาที่อยู่ให้กับ k1 และ k2ใหม่แล้วแต่ว่าใครมาก่อนมาหลัง
การแก้ปัญหาการชนกันของคีย์การแก้ปัญหาการชนกันของคีย์ เทคนิคเพื่อจัดการกับการชนกันที่นิยมใช้มาก มี 2 เทคนิค คือ • Chainingเป็นหลักการที่ใช้พอย์เตอร์แบบลิงค์ลิสต์หรือใช้แอดเดรสถัด ๆ ไปในอาร์เรย์ • chain มีขนาดคงที่ • chain มีขนาดไม่เท่ากัน (ขนาดขึ้นกับจำนวนคีย์ที่อยู่ใน chain นั้น) • Rehashing ( Open Addressing )
Chaining :: ขนาดคงที่ แบ่งตารางข้อมูลที่ใช้ถูกแบ่งออกเป็นส่วน ๆ (bucket)จำนวน n bucket แต่ละ bucket มีขนาด m ช่อง ถ้าคีย์ใดมีแอดเดรสซ้ำกัน ให้เก็บในตำแหน่งถัดไปใน Bucket เดียวกัน ถ้า bucket ใดถูกใช้จนหมด (Bucket เต็ม) ให้ถ่ายเทไปอยู่ในส่วน overflow ซึ่งอาจเป็นอีกอาร์เรย์หนึ่ง หรืออาจเป็น bucket ที่ถัดจาก bucket n โดยอาจมีมากกว่า 1 bucket
Chaining :: ขนาดคงที่ ตัวอย่าง จงแปลงคีย์ต่อไปนี้ให้เป็นแอดเดรส และให้หลีกเลี่ยงการชนโดยใช้ Bucket โดยกำหนดให้แต่ละ Bucket มี 4 ช่อง และตารางนี้มีทั้งหมด 5 Bucket ฟังก์ชันที่ใช้คือ H(K)= K mod 5+1 ชุดคีย์ ( 42 , 51, 82, 14, 2, 15, 5, 6, 62, 25, 37, 21)
Chaining :: ขนาดคงที่ Bucket#เต็ม
Chaining :: ขนาดไม่คงที่ จะอาศัย linked list ขนาด n ตัว แต่ละตัวสำหรับค่า address ค่าหนึ่ง แต่ละโหนดที่เก็บค่าคีย์ จะมี 2 ส่วนคือ สำหรับเก็บคีย์ และ ส่วนเก็บพอยน์เตอร์ ตัวอย่าง จงสร้างตารางสำหรับ key ต่อไปนี้ ชุดคีย์ ( 42 , 49 , 82, 14, 2, 15, 5, 6 )กำหนดฟังก์ชั่น H(K)= Kmod7+1 ให้ใช้หลักการหลีกเลี่ยงการชนกันแบบ chaining (ขนาดไม่คงที่) H(42) = 1 H(2) = 3 H(49) = 1 H(15) = 2 H(82) = 6 H(5) = 6 H(14) = 1 H(6) = 7
5 42 15 2 82 6 49 14 Chaining :: ขนาดไม่คงที่ H(K)= Kmod7+1 1 2 3 4 5 6 7
Rehashing เป็นเทคนิคหนึ่งใช้หลักการ Open Addressing “ถ้าเกิดการชนกันขึ้นระหว่างคีย์ K1 และ K2 เนื่องจากการใช้ฟังก์ชันแฮชชิ่ง H1 ให้ทำการคำนวณที่อยู่ของ K2 ใหม่ โดยใช้ ฟังก์ชันแฮชชิ่ง H2” K -------- > H1(K) -------- > H2 (H1(K)) ฟังก์ชัน H2 อาจเป็นฟังก์ชันใหม่หรือเหมือนกับ H1 ก็ได้