ภาพรวมตารางแฮชแบบง่าย
ในฐานะผู้ทบทวนตารางแฮชเป็นวิธีการจัดเก็บค่าภายใต้คีย์เฉพาะในโครงสร้างข้อมูล ตัวอย่างเช่นฉันสามารถเก็บค่า"a"
ไว้ใต้คีย์1
แล้วเรียกคืนได้ในภายหลังโดยค้นหาคีย์1
ในตารางแฮช
ตัวอย่างที่ง่ายที่สุดของตารางแฮชที่ฉันสามารถคิดได้จากด้านบนของหัวของฉันคือตารางแฮชที่สามารถเก็บจำนวนเต็มได้เท่านั้นที่สำคัญสำหรับรายการตารางแฮชก็คือค่าที่ถูกเก็บไว้ สมมติว่าตารางของคุณมีขนาด 8 และโดยทั่วไปมันเป็นอาร์เรย์ในหน่วยความจำ:
---------------------------------
| | | | | | | | |
---------------------------------
0 1 2 3 4 5 6 7
ฟังก์ชั่นแฮช
ฟังก์ชันแฮชให้ดัชนีเกี่ยวกับสถานที่จัดเก็บค่าของคุณ ฟังก์ชั่นกัญชาสวยเรียบง่ายสำหรับตารางนี้จะเพิ่ม 1 ถึงค่าที่คุณต้องการในการจัดเก็บและจากนั้นmodมัน 8 (ขนาดตาราง) ในคำอื่น ๆ ฟังก์ชั่นแฮชของคุณคือ(n+1)%8
ที่ซึ่งn
เป็นจำนวนเต็มที่คุณต้องการจัดเก็บ
แทรก
หากคุณต้องการแทรกค่าลงในตารางแฮชนี้คุณจะเรียกใช้ฟังก์ชันแฮช (ในกรณีนี้(n+1)%8
) กับค่าที่คุณต้องการแทรกเพื่อให้ดัชนี ตัวอย่างเช่นถ้าเราต้องการที่จะใส่ 14 เราจะเรียก(14 + 1) % 8
และได้รับดัชนีดังนั้นเราจึงต้องการใส่ค่าในดัชนี7
7
---------------------------------
| | | | | | | |14 |
---------------------------------
0 1 2 3 4 5 6 7
ในทำนองเดียวกันเราสามารถแทรก 33, 82 และ 191 ดังนี้:
---------------------------------
|191| |33 |82 | | | |14 |
---------------------------------
0 1 2 3 4 5 6 7
การชนกัน
แต่จะเกิดอะไรขึ้นถ้าเราพยายามแทรกบางสิ่งที่จะชนกับรายการ 2 ควรอยู่ในดัชนี3
แต่ดำเนินการโดย 82 มีหลายวิธีในการแก้ปัญหานี้วิธีที่ง่ายที่สุดคือเรียกฟังก์ชันแฮชของเราซ้ำแล้วซ้ำอีกจนกว่าเราจะหาพื้นที่ว่าง
ดังนั้นตรรกะมีดังนี้
- (2 + 1)% 8 = 3
- ดัชนี3เต็ม
- เสียบ3กลับเข้าสู่ฟังก์ชันแฮชของเรา ( 3 + 1)% 8 = 4ซึ่งว่างเปล่า
- วางค่าของเราเป็นดัชนีที่ 4
ตอนนี้ตารางแฮชที่มีลักษณะเช่นนี้มีมูลค่า 2 4
เก็บไว้ที่ดัชนี
---------------------------------
|191| |33 |82 |2 | | |14 |
---------------------------------
0 1 2 3 4 5 6 7
ข้อเสียของวิธีนี้คือในไม่ช้าโต๊ะของเราจะเต็ม! หากคุณรู้ว่าขนาดข้อมูลของคุณมี จำกัด สิ่งนี้ไม่ควรเป็นปัญหาตราบใดที่ตารางของคุณมีขนาดใหญ่พอที่จะเก็บค่าที่เป็นไปได้ทั้งหมด หากคุณต้องการที่จะถือมากขึ้นคุณสามารถจัดการการชนกันได้ ลองย้อนกลับไปยังจุดที่เราแทรกก่อน 2
---------------------------------
|191| |33 |82 | | | |14 |
---------------------------------
0 1 2 3 4 5 6 7
ถ้าคุณจำ(2+1)%8
ทำให้เรามีดัชนี3
ซึ่งจะได้รับการ หากคุณไม่ต้องการให้ตารางแฮชเติมคุณสามารถใช้ดัชนีแต่ละตารางเป็นรายการที่ลิงก์และผนวกเข้ากับรายการที่ดัชนีนั้น ดังนั้นแทนที่จะเรียกฟังก์ชันแฮชอีกครั้งเราจะเพียงผนวกไปยังรายการที่ดัชนี3
:
-----
| 2 |
---------------------------------
|191| |33 |82 | | | |14 |
---------------------------------
0 1 2 3 4 5 6 7
รายการนี้สามารถขยายได้มากเท่าที่หน่วยความจำจะอนุญาต ฉันสามารถใส่ 18 และมันจะถูกผนวกเข้ากับ 2:
-----
|18 |
-----
| 2 |
---------------------------------
|191| |33 |82 | | | |14 |
---------------------------------
0 1 2 3 4 5 6 7
การค้นหา
ค้นหาค่าในตารางแฮชของคุณอย่างรวดเร็วเนื่องจากตารางแฮชของคุณมีขนาดใหญ่มาก คุณเพียงแค่เรียกฟังก์ชันแฮชของคุณและรับดัชนี สมมติว่าคุณต้องการดูว่า 82 อยู่ในตารางของคุณหรือไม่ ฟังก์ชั่นการค้นหาจะเรียก(82+1)%8
= 3
และดูรายการในดัชนี3
และส่งคืนให้คุณ หากคุณค้นหา 16 ฟังก์ชันการค้นหาจะค้นหาในดัชนี1
และดูว่าไม่มีอยู่
การค้นหาจำเป็นต้องจัดการการชนเช่นกัน!
หากคุณพยายามค้นหาค่า 2 ตารางแฮชของคุณจะต้องใช้ตรรกะการชนกันแบบเดียวกับที่ใช้ในการจัดเก็บข้อมูลเพื่อดึงข้อมูล ขึ้นอยู่กับวิธีที่ตารางแฮชของคุณทำงานคุณจะต้องแฮชคีย์ซ้ำแล้วซ้ำอีกจนกว่าคุณจะพบรายการที่คุณกำลังมองหา (หรือค้นหาพื้นที่ว่าง) หรือคุณจะวนซ้ำรายการที่ลิงก์จนกว่าคุณจะพบรายการ (หรือ ได้ไปยังจุดสิ้นสุดของรายการ)
สรุป
ดังนั้นตารางแฮชเป็นวิธีที่ดีในการจัดเก็บและเข้าถึงคู่คีย์ - ค่าอย่างรวดเร็ว ในตัวอย่างนี้เราใช้คีย์เดียวกันกับค่า แต่ในตารางแฮชจริงในโลกคีย์ไม่ จำกัด ฟังก์ชันแฮชจะทำงานกับแป้นเพื่อสร้างดัชนีจากนั้นสามารถเก็บคีย์ / ค่าที่ดัชนีนั้นได้ ตารางแฮชไม่ได้หมายถึงการวนซ้ำจริง ๆ ถึงแม้ว่าจะเป็นไปได้ก็ตาม อย่างที่คุณเห็นตารางแฮชอาจมีพื้นที่ว่างจำนวนมากและการวนซ้ำไปมาอาจทำให้เสียเวลา แม้ว่าตารางแฮชจะมีตรรกะในการข้ามการค้นหาพื้นที่ว่างในตัววนซ้ำคุณจะเหมาะสมกว่าโดยใช้โครงสร้างข้อมูลที่ออกแบบมาสำหรับตัววนซ้ำเช่นรายการที่เชื่อมโยง