ต้องการภาพรวมที่ดีสำหรับอัลกอริทึมโครงสร้างข้อมูลที่ซับซ้อน


14

( ถามไซต์หลักแล้ว แต่ขอให้คุ้มครองเพิ่มเติมที่นี่ด้วย)

เนื่องจากฉันรู้เกี่ยวกับโครงสร้างข้อมูลสั้น ๆฉันต้องการภาพรวมที่ดีของการพัฒนาล่าสุดในพื้นที่นั้น

ฉัน googled และอ่านบทความจำนวนมากที่ฉันสามารถเห็นได้จากผลลัพธ์ของ google ตามคำขอจากหัวของฉัน ฉันยังคงสงสัยว่าฉันพลาดสิ่งสำคัญที่นี่

นี่คือหัวข้อที่น่าสนใจเป็นพิเศษสำหรับฉัน:

  1. การเข้ารหัสแบบสั้น ๆ ของต้นไม้ไบนารีด้วยการดำเนินการที่มีประสิทธิภาพในการรับพาเรนต์ลูกซ้าย / ขวาจำนวนองค์ประกอบในทรีย่อย

    คำถามหลักที่นี่มีดังต่อไปนี้: วิธีการทั้งหมดที่ฉันรู้ว่าถือว่าโหนดของต้นไม้นับตามลำดับลมหายใจแรก (เช่นในงานบุกเบิกในพื้นที่นี้ Jacobson, G. J (1988) โครงสร้างข้อมูลแบบคงที่แบบรวบรัด) ซึ่งไม่ได้ ดูเหมือนจะเหมาะสมสำหรับงานของฉัน ฉันจัดการกับต้นไม้ไบนารีขนาดใหญ่ที่ได้รับในเค้าโครงความลึกแรกและดัชนีโหนดความลึกแรกเป็นกุญแจสู่คุณสมบัติของโหนดอื่นดังนั้นการเปลี่ยนเค้าโครงต้นไม้มีค่าใช้จ่ายสำหรับฉันซึ่งฉันต้องการจะลดให้น้อยที่สุด ดังนั้นความสนใจในการอ้างอิงถึงงานพิจารณาอื่น ๆ แล้วเค้าโครงต้นไม้ BF

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

    จำนวนของไอเท็มทั่วไป - หลายร้อยล้านขึ้นไปเป็นหมื่น milliards

    ประมาณ 30% ของรายการที่มีความยาวไม่มากขึ้นแล้ว 1 บิต ;

    รายการ 40% -60% มีความยาวน้อยกว่า 8 บิต

    เพียงไม่กี่เปอร์เซ็นต์ของรายการที่มีความยาวระหว่าง 32 และ 255 บิต (255 บิตเป็นขีด จำกัด )

    ความยาวรายการเฉลี่ย ~ 4 บิต +/- 1 บิต

    การกระจายความยาวของรายการอื่น ๆ เป็นไปได้ในทางทฤษฎี แต่ทุกกรณีที่น่าสนใจในทางปฏิบัติมีสถิติใกล้เคียงกับที่อธิบายไว้ข้างต้น

ลิงก์ไปยังบทความที่มีความซับซ้อนบทเรียนของความคลุมเครือห้องสมุด C / C ++ ที่มีเอกสารมากหรือน้อย - อะไรก็ตามที่มีประโยชน์สำหรับคุณในงานที่คล้ายกันหรือสิ่งที่ดูเหมือนว่าโดยการศึกษาของคุณ

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

นอกจากนี้ต้นไม้ทั่วไปยังมีมิลล์ของโหนดและไม่ควรเก็บไว้ใน RAM อย่างสมบูรณ์

คำตอบ:


12

ฉันคิดว่าคุณสนใจโครงสร้างข้อมูลหน่วยความจำภายนอกที่มีประสิทธิภาพในทางปฏิบัติ ในกรณีนี้คุณอาจได้สิ่งที่คุณต้องการด้วยเทคนิคพื้นฐานและวิศวกรรม

สำหรับต้นไม้ที่ผมจะเริ่มต้นด้วยการอ่าน Arroyuelo et al .: กะทัดรัดต้นไม้ในการปฏิบัติ กระดาษเกี่ยวข้องกับต้นไม้ในหน่วยความจำหลัก แต่เทคนิคส่วนใหญ่สามารถใช้ในหน่วยความจำภายนอกที่มีตัวเลือกคล้ายกันดังต่อไปนี้

γδBB

nSnS[ผม]=1ผมJRank(J) และถอดรหัสเพื่อรับไอเท็ม

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

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