มีเทคนิคหลายอย่างที่รับประกันได้ว่าการค้นหาจะต้องใช้การดำเนินงาน O (1) เสมอแม้ในกรณีที่เลวร้ายที่สุด
ฉันจะทราบได้อย่างไรว่าตารางแฮชมีโอกาสที่จะมีการดำเนินการ O (1) หรือไม่และอาจใช้เทคนิคใดในฟังก์ชั่นแฮชของฉัน
กรณีที่เลวร้ายที่สุดเกิดขึ้นเมื่อผู้โจมตีที่เป็นอันตราย (Mallory) จงใจให้ข้อมูลที่ Mallory ได้เลือกไว้เป็นพิเศษเพื่อให้ระบบทำงานช้า
เมื่อคุณเลือกฟังก์ชั่นแฮชบางอย่างแล้วมันอาจจะเป็นไปได้ที่คุณจะคิดว่ามัลลอรี่จะไม่พบว่าฟังก์ชันแฮชตัวใดที่คุณเลือก เมื่อมัลลอรี่ค้นพบฟังก์ชันแฮชที่คุณเลือกถ้าคุณอนุญาตให้มัลลอรี่ให้ข้อมูลจำนวนมากที่จะถูกแทรกลงในตารางแฮชของคุณโดยใช้ฟังก์ชั่นแฮชนั้นคุณก็ถึงวาระแล้ว: มัลลอรี่สามารถสร้างรายการข้อมูลได้อย่างรวดเร็ว ฟังก์ชั่นแฮชเพื่อค้นหาว่ารายการข้อมูลใดที่มีแนวโน้มที่จะเกิดการชนจากนั้นฟีดข้อมูลรายการหนึ่งในพันรายการที่มีแนวโน้มที่จะเกิดการชนกันซึ่งนำคุณไปสู่การค้นหาที่ทำงานช้ากว่า O (1)
เทคนิคทั้งหมดที่รับประกันการค้นหา "O (1) แม้ในกรณีที่เลวร้ายที่สุด" หลีกเลี่ยงปัญหานี้ด้วยการทำงานพิเศษเล็กน้อยในแต่ละการแทรกเพื่อรับประกันว่าในอนาคตการค้นหาที่เป็นไปได้ทุกครั้งสามารถประสบความสำเร็จในเวลา O (1) . โดยเฉพาะอย่างยิ่งเราถือว่า (กรณีที่เลวร้ายที่สุด) ที่มัลลอรี่จะค้นพบฟังก์ชันแฮชที่เรากำลังใช้ไม่ช้าก็เร็ว แต่เขาจะมีโอกาสเพียงแทรกไอเท็มข้อมูลสองสามรายการก่อนที่เราจะเลือกฟังก์ชันแฮชที่แตกต่างกัน - การจัดตารางการแฮชหรือการแฮชทั่วไปอื่น ๆ- ที่เราเลือกเป็นพิเศษเพื่อให้ข้อมูลทั้งหมดที่เรามีอยู่ หรือ 3 โพรบ - เช่น O (1) เนื่องจากเราสุ่มเลือกฟังก์ชั่นนี้เราจึงมั่นใจได้ว่ามัลลอรี่จะไม่ทราบว่าฟังก์ชั่นใดที่เราเลือกมาระยะหนึ่ง แม้ว่ามัลลอรี่ให้ข้อมูลแก่เราทันทีแม้ว่าจะมีฟังก์ชั่นแฮชใหม่นี้ชนกับข้อมูลก่อนหน้านี้เราก็สามารถเลือกฟังก์ชั่นแฮชใหม่ที่สดใหม่เช่นหลังจากทำข้อมูลทั้งหมดก่อนหน้านี้เขาและคนอื่น ๆ เพิ่มขึ้นใน 2 หรือ 3 โพรบในกรณีที่เลวร้ายที่สุด - คือการค้นหา O (1) ในกรณีที่เลวร้ายที่สุด
มันค่อนข้างง่ายที่จะสุ่มเลือกฟังก์ชั่นแฮชใหม่และจัดตารางใหม่ทั้งหมดบ่อยครั้งพอที่จะรับประกันได้ว่าการค้นหาแต่ละครั้งจะอยู่ที่ O (1) เสมอ ในขณะที่สิ่งนี้รับประกันได้ว่าการค้นหาแต่ละครั้งจะเป็น O (1) เสมอเทคนิคเหล่านี้เมื่อแทรกรายการ Nth ลงในตารางแฮชที่มีรายการ N-1 อยู่แล้วอาจต้องใช้เวลา O (N) สำหรับการแทรกนั้นเป็นครั้งคราว อย่างไรก็ตามมันเป็นไปได้ที่จะออกแบบระบบเช่นนั้นแม้ว่า Mallory จงใจให้ข้อมูลใหม่กับคุณโดยใช้ฟังก์ชั่นแฮชใหม่ชนกับข้อมูลก่อนหน้าระบบสามารถรับไอเท็มจำนวนมากจาก Mallory และอื่น ๆ ก่อนที่จะต้องทำ สร้างใหม่ O (N) แบบเต็ม เทคนิคตารางแฮชที่เลือกฟังก์ชั่นและรูปแบบใหม่เพื่อรับประกันการค้นหา O (1) แม้ในกรณีที่เลวร้ายที่สุด ได้แก่ :
- cashing hashingรับประกันได้ว่าการค้นหาคีย์แต่ละครั้งจะประสบความสำเร็จด้วยการคำนวณแฮช 2 ครั้งและการค้นหาตาราง 2 ครั้ง
- hopscotch hashingรับประกันได้ว่าการค้นหาคีย์แต่ละครั้งจะประสบความสำเร็จหลังจากตรวจสอบรายการที่มีขนาดเล็กจำนวน H (อาจเป็น H = 32) ติดต่อกันในตาราง
- hashing ที่สมบูรณ์แบบไดนามิก - กระดาษ 1994 โดย Dietzfelbinger เป็นคนแรกที่ฉันได้อ่านที่ชี้ให้เห็นว่าถึงแม้ว่ามันจะ "บ่อย" เพื่อยืนยันว่าการค้นหาคีย์แต่ละครั้งจะประสบความสำเร็จเสมอด้วยการคำนวณ 2 hash และ 2 lookups เป็นไปได้ การทำ rehash เต็มรูปแบบจึงไม่ค่อยเกิดขึ้นแม้ว่าแต่ละ rehash เต็มใช้เวลา O (n), ค่าใช้จ่ายเฉลี่ยที่คาดไว้ของการแทรกและการลบคือ O (1) ตัดจำหน่าย
โครงสร้างข้อมูล / ตารางแฮช