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


11

ฉันต้องการใช้ตารางแฮชโดยใช้ Binary Search Trees เพื่อลดความซับซ้อนในการค้นหาในกระบวนการแยกการเชื่อมโยงจาก O (n) (โดยใช้รายการที่เชื่อมโยง) ถึง O (log n) (โดยใช้ BST) สามารถทำได้และถ้าใช่แล้วได้อย่างไร มันจะง่ายกว่าที่จะเข้าใจว่าการแก้ปัญหาเป็นขั้นตอนการดำเนินการตามตรรกะ

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


4
ตารางแฮชและแผนผังการค้นหาแบบไบนารีเป็นคอนเทนเนอร์ที่แตกต่างกัน ดังนั้นคุณไม่สามารถทำสิ่งที่คุณแนะนำได้ (หรือคุณกำลังทำผิดพลาดทางคำศัพท์)
Basile Starynkevitch

ฉันเดาว่าคุณสามารถใส่ hash / value pair ในแต่ละโหนดในแผนผัง ... แต่นั่นอาจเป็นตารางแฮชที่ไม่ดีหรือต้นไม้ไบนารีที่ไม่ดี หากไม่มีการชี้แจงเกี่ยวกับสาเหตุที่คุณต้องการทำสิ่งนี้และสิ่งที่คุณต้องการให้ผลลัพธ์สุดท้ายสามารถทำได้ฉันไม่แน่ใจว่านี่เป็นคำตอบที่แท้จริง
Ixrec

1
@AK_: เอาอะไรทำนองนั้นมาอย่างที่คุณพูด ฉันต้องการจัดการการชนโดยใช้แผนภูมิการค้นหาแบบไบนารี ฉันแก้ไขคำถามของฉันเล็กน้อยเพื่อให้ชัดเจนขึ้น
Aviral

1
โปรดทราบว่ามาพร้อมกับบทลงโทษของ O (n log n) สำหรับการแทรกทุกครั้ง โดยทั่วไปเมื่อคุณมีตารางแฮชที่เริ่มเต็มแล้ว (และคุณมีโซ่ยาวเกินกว่าที่คุณจะทนได้) คุณจะสร้างแฮชใหม่ หากคุณพบเจอโซ่นานกว่า 3 หรือ 4 เป็นประจำมีบางอย่างผิดปกติ

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

คำตอบ:


11

สิ่งที่คุณต้องการนั้นเป็นไปได้เนื่องจากข้อ จำกัด ของคุณ

การวิเคราะห์

จุดแข็งของตารางแฮชคือการค้นหาและแทรกความเร็วที่รวดเร็ว เพื่อให้ได้ความเร็วนั้นเราจะต้องละทิ้งรูปลักษณ์ใด ๆ ของการสั่งซื้อในตาราง: รายการต่างๆนั้นจะวนเวียนอยู่ รายการสามารถใช้เป็นรายการในตารางได้เนื่องจากในขณะที่การแวะผ่านคือ O (n) รายการมักจะสั้นหากสมมติว่าตารางแฮชมีขนาดใหญ่พอสมควรและวัตถุที่เก็บไว้ในตารางจะถูกแฮชโดยใช้อัลกอริทึมการแฮชคุณภาพดี

แผนผังการค้นหาแบบไบนารี (BST) มีการแทรกและค้นหาแบบรวดเร็วที่ O (บันทึก2 n) นอกจากนี้ยังมีข้อ จำกัด เกี่ยวกับองค์ประกอบที่จัดเก็บ: ต้องมีวิธีการสั่งซื้อองค์ประกอบ เมื่อพิจารณาสององค์ประกอบAและB ที่เก็บไว้ในต้นไม้จะต้องมีความเป็นไปได้ที่จะตรวจสอบว่าAมาก่อนBหรือมีลำดับที่เท่าเทียมกันหรือไม่

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

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

โปรดทราบว่าโดยทั่วไปค่าโสหุ้ยและพฤติกรรมของ BST จะไม่นำสิ่งใดมาสู่สถานการณ์ในโลกแห่งความจริงในฐานะที่เป็นที่เก็บถังแฮชของตารางซึ่งเป็นเหตุผลว่าทำไมผลงานที่ไม่ดีทางทฤษฎีของรายการเป็นที่ยอมรับ กล่าวอีกนัยหนึ่งตารางแฮชชดเชยความอ่อนแอของรายการโดยการวางรายการน้อยลงในแต่ละรายการ (ฝากข้อมูล) อย่างไรก็ตาม : ปัญหาระบุไว้โดยเฉพาะว่าตารางแฮชไม่สามารถเพิ่มขนาดได้และการชนกันบ่อยกว่าปกติในตารางแฮช

การดำเนินงาน

ฉันจะไม่ใส่รหัสที่นี่เพราะสุจริตไม่จำเป็นจริงๆและคุณไม่ได้ให้ภาษา

สิ่งที่ฉันจะทำคือเพียงแค่คัดลอกตารางแฮชมาตรฐานใด ๆ ที่ไลบรารีมาตรฐานของภาษาของคุณมีอยู่ในคลาสใหม่จากนั้นเปลี่ยนประเภทที่จัดเก็บตารางจากรายการไปยังทรี ทั้งนี้ขึ้นอยู่กับภาษาและห้องสมุดมาตรฐานของสิ่งนี้อาจเป็นเรื่องเล็กน้อยที่ต้องทำ

ปกติฉันจะไม่สนับสนุนการคัดลอกและวางรหัสเช่นนี้ แต่ก็เป็นวิธีที่ง่ายที่จะได้รับข้อมูลโครงสร้างการต่อสู้ผ่านการทดสอบมากได้อย่างรวดเร็ว


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

@ Steve314 โปรดทราบว่าปัญหามีการชนกันมากมายดังนั้นเขาจึงคาดว่าถังจะมีรายการมากกว่าตารางแฮชตามปกติ

จุดดี - เช่นสำหรับตารางแฮชขนาดคงที่ที่มีข้อมูลไม่ จำกัด ประสิทธิภาพการทำงานของซีมโทติคของตารางแฮชจะเหมือนกับประสิทธิภาพซีมโทติคของการจัดการการชน - ตารางแฮชจะเปลี่ยนปัจจัยคงที่เท่านั้น
Steve314

@ Steve314 ถูกต้องโดยพื้นฐานแล้วถ้าตารางแฮชไม่สามารถ จำกัด จำนวนองค์ประกอบในที่เก็บข้อมูลแต่ละชุดได้อย่างมีประสิทธิภาพประสิทธิภาพแบบ asymptotic จะลดลงในโครงสร้างข้อมูลย่อยใด ๆ ที่ใช้ในที่เก็บข้อมูลแต่ละชุด ฉันเพิ่มย่อหน้าลงในคำตอบเพื่อให้ชัดเจน

7

การใช้ทรีไบนารีสำหรับการจัดการการชนในตารางแฮชไม่สามารถทำได้ แต่ทำได้

วอลเตอร์สดใสเป็นที่รู้จักกันดีในฐานะนักประดิษฐ์ของภาษาการเขียนโปรแกรม Dแต่ยังเขียนตัวแปร ECMAScript เรียกDMDScript ในอดีตการอ้างสิทธิ์พาดหัวของ DMDScript (หรืออาจเป็นบรรพบุรุษ - ฉันดูเหมือนจะจำชื่อ DScript) ได้ว่าแฮชเทเบิลของมันมักจะมีประสิทธิภาพสูงกว่าภาษาอื่นที่คล้ายคลึงกัน เหตุผล - การจัดการการชนโดยใช้ต้นไม้ไบนารี

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

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