ฉันจะเลือกโครงสร้างข้อมูลพจนานุกรมที่ทำงานได้อย่างไร


10

ฉันได้อ่านเกี่ยวกับโครงสร้างข้อมูลต่อไปนี้:

  • Ideal Hash พยายามของแบกเวล
  • ตารางแฮชแบบไดนามิกของ Larson
  • ต้นไม้สีแดง - ดำ
  • ต้นไม้แพทริเซีย

... และฉันแน่ใจว่ามีเป็นจำนวนมากของคนอื่น ๆ ออกมี ฉันได้เห็นน้อยมากในแบบของสิ่งที่แต่ละคนเหมาะสมกว่าหรือทำไมฉันถึงเลือกอีกแบบหนึ่ง ดังนั้นนี่คือคำถามสองสามข้อตามบรรทัดเหล่านี้:

  1. โครงสร้างข้อมูลพจนานุกรมที่ใช้งานได้มีความสำคัญอะไรที่ต้องรู้
  2. อะไรคือข้อดีข้อเสียของวิธีการเหล่านี้?
  3. เมื่อใดที่จะใช้โครงสร้างข้อมูลที่จำเป็นมากขึ้น

หมายเลข 2 และ 3 เป็นสิ่งที่สำคัญกว่า :-)


ที่เกี่ยวข้อง: มีอะไรใหม่ในโครงสร้างข้อมูลที่ใช้งานได้จริงตั้งแต่ Okasaki? (คำถามนั้นไม่ได้ จำกัด อยู่ที่พจนานุกรม)
Tsuyoshi Ito

คำถามนี้ (นอกเหนือจากรายการหมายเลข 3) มีความรู้สึกของ [รายการใหญ่]
Kaveh

2
การรู้ว่าคำถามที่ถูกเชื่อมโยงข้างต้นจะช่วยแก้ปัญหาของคุณได้หรือไม่
Suresh Venkat

@Suresh - คำตอบที่ # 1 แต่ 2 และ 3 เป็นคนที่สำคัญกว่า ฉันส่วนใหญ่กำลังมองหาภาพรวมภาพใหญ่ดังนั้นฉันสามารถตรวจสอบว่าคนที่มีมูลค่าการศึกษาในเชิงลึกมากขึ้น
Jason

2
ตกลง. ดังนั้นจึงควรแก้ไขคำถาม
Suresh Venkat

คำตอบ:


16

ฉันไม่สามารถตอบ # 2 โดยไม่หลงทาง (มีหลายมิติมากเกินไปซึ่งคุณสามารถเปรียบเทียบโครงสร้างเหล่านี้ได้) แต่สำหรับ # 3 คำตอบนั้นง่ายมาก

ใช้โครงสร้างข้อมูลที่จำเป็นถ้า: (a) ไม่มี aliasing หรือ (b) คุณจำเป็นต้องใช้ aliasing เพื่อการออกอากาศที่มีประสิทธิภาพ

หากไม่มีนามแฝงของโครงสร้างข้อมูลของคุณเลยคุณจะไม่ได้รับประโยชน์จากข้อเท็จจริงที่ว่าโครงสร้างข้อมูลการทำงานนั้นยังคงอยู่ ดังนั้นจึงไม่มีเหตุผลที่จะจ่ายสำหรับค่าใช้จ่ายของพวกเขา มีคำเตือนสองคำสำหรับคำแนะนำนี้ ก่อนอื่นคุณอาจต้องการความเรียบง่ายของการใช้งานโครงสร้างข้อมูลที่มีประโยชน์: การนำการลบสำหรับต้นไม้สีแดงดำที่ใช้งานได้จะทำให้คุณสาปแช่ง แต่การนำการลบในต้นไม้สีแดงดำที่จำเป็นกับพอยน์เตอร์จะทำให้คุณคิดฆ่าตัวตาย ประการที่สองการมอบหมายอาจมีราคาแพงกว่าที่คุณคาดหวังในภาษา gc'd เนื่องจากการเขียนสามารถทำให้โครงสร้างข้อมูลถูกย้ายออกจากคนรุ่นใหม่ เราไม่มีทฤษฎีแคชเอฟเฟกต์และ gc ที่ดีดังนั้นคุณไม่มีทางเลือกนอกจากทำการเปรียบเทียบ

ประการที่สองถ้าคุณต้องการช่องออกอากาศโครงสร้างข้อมูลที่ใช้ร่วมกันเป็นวิธีที่ยอดเยี่ยมในการทำ ด้วยการอัปเดตตามเวลาที่คงที่คุณสามารถบอกคนอื่น ๆ ว่าค่ามีการเปลี่ยนแปลงโดยพลการ (นี่คือเหตุผลที่ union-find เป็นโครงสร้างข้อมูลที่ยอดเยี่ยม) ด้วยการตั้งค่าการทำงานอย่างหมดจดไม่ว่าคุณจะต้องการปรับเปลี่ยนคนอื่น ๆ ทั้งหมดหรือให้พอยน์เตอร์ที่เป็นนามธรรมเข้าสู่สถานะที่คุณเขียนโค้ดด้วยตนเอง สิ่งที่ต้องทำ).

หากคุณไม่ต้องการให้เหตุผลเกี่ยวกับการสร้างสมนามและความเป็นเจ้าของวัตถุหรือหากคุณต้องการโครงสร้างข้อมูลเดียวกันหลายรุ่น (คุณต้องใช้ทั้งรุ่นเก่าและใหม่) จากนั้นใช้โครงสร้างข้อมูลที่ใช้งานได้

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


2
นามแฝงคืออะไรในบริบทนี้
Suresh Venkat

6
นามแฝงคือเมื่อคุณมีการอ้างอิงหลายรายการไปยังข้อมูลชิ้นเดียวกัน หากข้อมูลนั้นไม่แน่นอนให้เหตุผลเกี่ยวกับโปรแกรมที่ใช้ข้อมูลนั้นเพื่อพิจารณาโปรแกรมย่อยอื่น ๆ ทั้งหมดที่สามารถเข้าถึงและแก้ไขได้อย่างชัดเจน หากส่วนของข้อมูลนั้นไม่เปลี่ยนรูปคุณสามารถให้เหตุผลเกี่ยวกับโปรแกรมที่ใช้งานอยู่โดยไม่สนใจ aliasing เนื่องจากคุณรู้ว่าไม่มีใครที่สามารถเข้าถึงข้อมูลนั้นสามารถแก้ไขได้
Neel Krishnaswami

"แต่การลบการใช้งานในต้นไม้สีแดงดำที่จำเป็นกับพอยน์เตอร์จะทำให้คุณคิดฆ่าตัวตาย" ลองดูต้นไม้สีแดงดำที่เหลืออยู่ของ Sedgewick กรณีทั่วไปของการลบจะลดลงเป็นลบ -min โดยเคล็ดลับมาตรฐานและลบ -min เองนั้นง่ายมากสำหรับต้นไม้ LLRB ไม่จำเป็นต้องมีพอยน์เตอร์หลัก
ต่อ Vognsen

1
"โดยทั่วไปแล้วมันค่อนข้างน่ากลัวเต็มไปด้วยข้อบกพร่องและมีแนวโน้มที่จะสูญเสียความได้เปรียบด้านประสิทธิภาพของอัลกอริธึมที่จำเป็น" กระดาษของ Norman Ramsey เกี่ยวกับการใช้ zippers สำหรับกราฟการไหลควบคุมในคอมไพเลอร์ที่ปรับให้เหมาะสมนั้นเป็นตัวอย่างของการประนีประนอมที่น่าสนใจ คุณมีฮีปท้องถิ่นอย่างมีประสิทธิภาพสำหรับการสนับสนุนการอ้างอิงที่ง่ายและมีประสิทธิภาพในการอ้างอิงระหว่างบล็อกพื้นฐานใน CFG แต่การจัดการเนื้อหาของบล็อกพื้นฐานนั้นมีประโยชน์ (หรือกึ่งหน้าที่ขึ้นอยู่กับมุมมองทางปรัชญาของคุณ
ต่อ Vognsen

1

โครงสร้างข้อมูลพจนานุกรมที่ใช้งานได้มีความสำคัญอะไรที่ต้องรู้

ต้นไม้ไบนารีสมดุลความสูงและความพยายามของพวกเขาเป็นประนีประนอมทุกรอบที่ดี นอกจากนี้:

  • ต้นไม้แพทริเซีย
  • แฮพยายาม

อะไรคือข้อดีข้อเสียของวิธีการเหล่านี้?

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

ต้นแพทริเซียสามารถเร็วขึ้นหลายครั้ง แต่อนุญาตให้ใช้คีย์จำนวนเต็มเท่านั้น

การแฮชสามารถทำได้เร็วกว่าต้นไม้ไบนารีที่สมดุลหลายเท่าโดยเฉพาะอย่างยิ่งถ้าการแฮ็ชมีราคาถูกกว่าการเปรียบเทียบและ polymorphism มีค่าใช้จ่าย (เช่นสตริงบน. NET) และการเขียนพอยน์เตอร์ลงในฮีปนั้นรวดเร็ว (เช่น VM เหมาะสำหรับภาษาที่จำเป็นมากกว่าภาษาที่ใช้งานได้) แฮชยังอนุญาตให้ใช้การกลายพันธุ์ภายในเป็นการปรับให้เหมาะสม

ต้นไม้สีแดงดำมีความสำคัญน้อยกว่าเพราะพวกเขาไม่ได้รับประโยชน์อย่างมีนัยสำคัญมากกว่าต้นไม้ที่มีความสูง แต่มีข้อเสียอย่างมีนัยสำคัญที่พวกเขาไม่อนุญาตให้มีสหภาพการแยกและความแตกต่างที่มีประสิทธิภาพ

ในทำนองเดียวกันต้นไม้นิ้วไม่ได้ดีขึ้นในทางปฏิบัติมาก

เมื่อใดที่จะใช้โครงสร้างข้อมูลที่จำเป็นมากขึ้น

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

เมื่อคุณต้องการประสิทธิภาพ (ตารางแฮชที่เหมาะสมเช่น. NET Dictionaryมักเร็วกว่า 10-40 ×เร็วกว่าพจนานุกรมทั่วไปที่ใช้งานได้อย่างหมดจด)

เมื่อคุณต้องการดิกชันนารีที่อ่อนแอเนื่องจากไม่มีพจนานุกรมที่อ่อนแอที่ใช้งานได้จริง

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