ข้อมูลประเภทใดที่มีการดำเนินการตารางแฮช O (1)


18

จากคำตอบถึง(เมื่อ) คือการค้นหาตารางแฮช O (1)? ฉันรวบรวมว่าตารางแฮชมีพฤติกรรมที่เลวร้ายที่สุดกรณีอย่างน้อยตัดจำหน่ายเมื่อข้อมูลเป็นไปตามเงื่อนไขทางสถิติบางอย่างและมีเทคนิคที่จะช่วยทำให้เงื่อนไขเหล่านี้กว้างขึ้นO(1)

อย่างไรก็ตามจากมุมมองของโปรแกรมเมอร์ฉันไม่ทราบล่วงหน้าว่าข้อมูลของฉันจะเป็นอะไร: มักจะมาจากแหล่งภายนอก และฉันไม่ค่อยมีข้อมูลทั้งหมดในครั้งเดียว: บ่อยครั้งที่การแทรกและการลบเกิดขึ้นในอัตราที่ไม่ต่ำกว่าอัตราการค้นหาดังนั้นการประมวลผลข้อมูลล่วงหน้าเพื่อปรับฟังก์ชั่นแฮชหายไป

ดังนั้นการก้าวออกจาก: ให้ความรู้เกี่ยวกับแหล่งข้อมูลฉันจะทราบได้อย่างไรว่าตารางแฮชมีโอกาสที่จะมีการดำเนินงานและอาจใช้เทคนิคใดในการใช้ฟังก์ชันแฮชของฉันO(1)


โอ้และตารางแฮชกับต้นไม้ไบนารีเกี่ยวข้อง แต่ที่นี่ฉันมุ่งเน้นไปที่ตารางแฮชและเมื่อพวกเขาอยู่ที่ดีที่สุด (หรือไม่)
Gilles 'SO- หยุดความชั่วร้าย'

กรณีที่ดีที่สุดสำหรับฟังก์ชันแฮชคือเมื่อข้อมูลถูกกระจายอย่างสม่ำเสมอ
0x0

@Sunil: ไม่จริง คุณสามารถมีฟังก์ชั่นแฮชได้ตามต้องการ
Raphael

ฉันคิดว่าคำถามนี้กว้างเกินไป โดยเฉพาะอย่างยิ่งคุณสามารถสังเขปความรู้เกี่ยวกับแหล่งข้อมูลจะมีลักษณะอย่างไร
Raphael

@Raphael ตัวอย่างเช่นถ้าคีย์เป็นสตริง: ชื่อของผู้คนชื่อไฟล์ในไดเรกทอรีแท็ก XML แฮชไฟล์ ...
Gilles 'ดังนั้น - หยุดความชั่วร้าย'

คำตอบ:


4

มีเทคนิคหลายอย่างที่รับประกันได้ว่าการค้นหาจะต้องใช้การดำเนินงาน 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) ตัดจำหน่าย

โครงสร้างข้อมูล / ตารางแฮช



5

การค้นหาตารางแฮชสามารถเป็นสำหรับเซตแบบคงที่ได้เสมอดูกระดาษ 2002 โดย Arne Andersson และ Mikkel Thorup: ชุดเรียงลำดับแบบไดนามิกที่มีแผนผังการค้นหาแบบเอ็กซ์โปเนนเชียลO(1)

O(1)O(n2W)

O(เข้าสู่ระบบn/เข้าสู่ระบบเข้าสู่ระบบn)O(1)


5

ชั่วโมงa,(x)=ax+พอควรพีสุ่มเลือกสมาชิกของครอบครัวที่ศัตรูไม่ทราบล่วงหน้าสุ่มเลือก สิ่งนี้คล้ายกับวิธีวิเคราะห์อัลกอริธึมแบบสุ่มเช่นกัน: ความคาดหวังถูกนำไปใช้กับตัวเลือกของอัลกอริทึมไม่ใช่การแจกแจงอินพุต

ในอดีตอ้างอิงจากเอกสาร Usenix โดย Crosby และ Wallachภาษาการเขียนโปรแกรมทั่วไปไม่ได้ทำอะไรแบบนี้ทิ้งเว็บแอพจำนวนมาก (และเซิร์ฟเวอร์อื่น ๆ ) เปิดการโจมตี DoS จากการชนกันของการผลิต (บทความนี้มาจากปี 2003 แต่มันแสดงให้เห็นว่า Dan Bernstein ได้ค้นพบความคิดเดียวกันก่อนหน้านี้สักหน่อย)

การค้นหา google อย่างรวดเร็วให้การอ้างว่าสถานะของความทันสมัยในแง่ของการใช้งานนั้นได้รับการปรับปรุงและไม่ได้ดีขึ้น

อีกสิ่งหนึ่งคือในโลกที่มีแบนด์วิธสูงการโจมตีตามจังหวะเวลานั้นไม่ยากที่จะหาการชนทางออนไลน์ (ตรงข้ามกับออฟไลน์ตามลิงก์ Crosby-Wallach ฉันดูเหมือนจะจำได้ว่า Daniel Golovin มีผลหลายปีที่ผ่านมากับโครงสร้างข้อมูลที่ไม่เสี่ยงต่อการโจมตีตามจังหวะเวลา แต่ฉันไม่รู้ว่ามีการใช้กันอย่างแพร่หลายหรือไม่


0

การวิเคราะห์กรณีเฉลี่ยสำหรับตารางแฮชทำภายใต้สมมติฐานปกติของความสม่ำเสมอของอินพุตซึ่งครั้งหนึ่งเคยทำให้เกิดเนื่องจากมีดโกนของ Occam

หากคุณมีความรู้เพิ่มเติมเกี่ยวกับโดเมนและการกระจายของคีย์คุณสามารถทำการวิเคราะห์ค่าเฉลี่ยกรณีเดียวกันและแทนที่การกระจายแบบสม่ำเสมอด้วยการแจกแจงของคุณและคำนวณความคาดหวังอย่างน้อยก็ในทางทฤษฎี

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

เห็นได้ชัดว่าสิ่งที่ง่ายที่สุดที่จะทำคือการจำลอง ปรับใช้ตารางแฮชและทำลายวิธีการทำงานของชุดอินพุตของคุณ


8
ฉันไม่เห็นด้วยกับประโยคแรก สมมติฐานมาตรฐานคือฟังก์ชั่นแฮชเป็นแบบสุ่มไม่ใช่ข้อมูลอินพุต การกระจายข้อมูลที่สม่ำเสมอช่วยผลักดันการวิเคราะห์สู่อาณาจักรแห่งจินตนาการ - ข้อมูลในโลกแห่งความเป็นจริงไม่เคยเหมือนกัน! แต่มีเทคนิคตำราเรียนสำหรับการทำฟังก์ชันแฮชให้มีความสม่ำเสมอ ดูคร่ำครวญสากลและการแฮชตารางพิเศษ
JeffE

@JeffE ดูที่การวิเคราะห์กรณีเฉลี่ยในคำตอบของราฟาเอลเขาระบุสมมติฐานความสม่ำเสมอนี้ คุณไม่สามารถทำการวิเคราะห์กรณีโดยเฉลี่ยได้หากไม่มีการแจกแจง คุณต้องเลือกอย่างใดอย่างหนึ่งและถ้าไม่ได้รับมีดโกนของ Occam แนะนำหนึ่งชุด
uli

6
แน่นอนคุณมีการแจกจ่าย มันคือการกระจายที่คุณใช้เพื่อเลือกฟังก์ชั่นแฮช การเลือกการแจกแจงสำหรับข้อมูลอินพุตเหมือนกับมองหากุญแจที่หายไปของคุณใต้เสาตะเกียง แน่นอนแสงดีกว่า แต่นั่นอาจไม่ใช่ที่ที่คุณทิ้งไว้
JeffE

@JeffE นั่นเป็นวิธีการวิเคราะห์รายกรณีโดยเฉลี่ยเลือกการแจกแจงและเริ่มคำนวณ เช่นเดียวกับทางเลือกของการแจกแจงที่เป็นที่ถกเถียงกัน คุณยินดีอย่างยิ่งที่จะทำการวิเคราะห์กรณีเฉลี่ยที่ไม่สม่ำเสมอ
uli

4
ใช่ฉันรู้ว่ามันเสร็จสิ้นแล้ว (ตรวจสอบโปรไฟล์ของฉัน) หากคุณต้องการให้การวิเคราะห์ของคุณสามารถทำนายได้ (ซึ่งเป็นจุดรวมของการวิเคราะห์) คุณต้องสุ่มฟังก์ชั่นแฮช จากนั้นคุณก็รู้การกระจายที่แม่นยำเพราะคุณเลือกมัน
JeffE

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.