ImmutableSortedDictionary ช่วงแจงนับโดยคีย์


11

ผมอ่านเกี่ยวกับ C # 's ImmutableSortedDictionaryในSystem.Collections.Immutableและความคิดเกี่ยวกับวิธีการที่จะใช้มันในโปรแกรมของฉัน ฉันค่อนข้างชอบ C ++ lower_boundและupper_bound(ดูที่นี่ ) และฉันค่อนข้างคาดหวังที่จะเห็นบางสิ่งบางอย่างสำหรับการค้นหาช่วง อย่างไรก็ตามวิธีการที่คล้ายกันดูเหมือนจะแปลกขาดจากเอกสาร ฉันพลาดอะไรไปรึเปล่า? หรือว่า MS จัดเตรียมพจนานุกรมเรียงอย่างแท้จริงโดยไม่ต้องเข้าถึงช่วงเรียงอย่างมีประสิทธิภาพ? ดูเหมือนจะไม่เหมือนสิ่งที่คน ๆ หนึ่งทำได้บนIEnumerableปุ่มเหมือนกับวิธีการขยายดังนั้นฉันค่อนข้างงุนงงฉันไม่เห็นบางสิ่งที่ได้รับจากคอลเลกชันโดยตรง


เอริค Lippert แชร์AVL ต้นไม้การดำเนินการเปลี่ยนรูปกลับไปในปี 2008 จากความคิดเห็นที่ฉันไม่คิดว่าจะได้รับการปรับให้เหมาะสมโดยเฉพาะอย่างยิ่งสำหรับความเร็วหรือประสิทธิภาพเลย แต่IBinarySearchTree<K,V>มันใช้รูปลักษณ์ที่ใกล้ชิดกับสิ่งที่ผมจะคาดหวังว่า ฉันสงสัยว่าเขาจะแก้ไขเพิ่มเติมหรือไม่
J Trana

ImmutableList<T>ชั้นนอกจากนี้ยังจะดำเนินการเป็นต้นไม้ AVL จากซอร์สโค้ด :/// The root node of the AVL tree that stores this set.
Theodor Zoulias

คุณรู้หรือไม่ว่าพวกเขาหมายความว่ารายการใช้ AVL จริงเพื่อนำไปใช้ไม่ได้หรือถ้าต้นไม้ AVL เองไม่เปลี่ยนรูป? (อาจไม่เป็นไรเพราะพวกเขาไม่ได้เปิดเผยต้นไม้)
J Trana

นี่คือข้อดีของการที่ImmutableList<T>(การสนับสนุนจากต้นไม้ AVL) เหนือImmutableArray<T>(รับการสนับสนุนจากอาร์เรย์) ตามเอกสาร เหตุผลในการใช้รายการที่ไม่เปลี่ยนรูปแบบ: 1) การอัปเดตข้อมูลเป็นเรื่องปกติหรือจำนวนองค์ประกอบไม่คาดว่าจะน้อย 2) การอัปเดตคอลเลกชันมีความสำคัญยิ่งกว่าการทำซ้ำเนื้อหา
Theodor Zoulias

เนื่องจากเมื่อเพิ่มหรือลบองค์ประกอบจากทรี AVL ขนาดใหญ่คุณสามารถรับทรีใหม่โดยไม่ทำลายทรีดั้งเดิมโดยแบ่งปันโหนดส่วนใหญ่และสร้างโหนดใหม่เพียงไม่กี่ตัว ( โครงสร้างข้อมูลถาวร - ต้นไม้ )
Theodor Zoulias

คำตอบ:


9

มันน่ารำคาญที่คอลเลคชั่นในตัวที่มีอยู่ไม่ได้เสนอคุณสมบัติครบชุด (เช่นSortedDictionaryขาดBinarySearchวิธีการ) ทำให้เราต้องค้นหาวิธีแก้ไขของบุคคลที่สาม (เช่นไลบรารี C5 )

ในกรณีของคุณแทนที่จะใช้ImmutableSortedDictionaryคุณอาจใช้ a ImmutableSortedSet, ฝังค่าในคีย์และใช้เครื่องมือเปรียบเทียบที่เหมาะสม อย่างน้อย API ของชั้นนี้มีคุณสมบัติและMinMax


2
ในฐานะที่เป็นที่ทราบด้านอีกชั้นไม่เปลี่ยนรูปที่ImmutableList<T>จะดำเนินการภายในเหมือนต้นไม้ ดังนั้นมันจึงเป็นหน่วยความจำ 10 ครั้งช้าลงและจัดสรร 12 List<T>ครั้งมากกว่าหนึ่ง ใช้ImmutableArray<T>แทน
Theodor Zoulias

1
Hehe ฉันใช้ C5 อยู่แล้ว แต่ต้องการดูว่ามีอะไรบ้างในคอลเลกชันที่ไม่เปลี่ยนรูปแบบ ขอบคุณ! ฉันจะระงับความหวังว่าคนอื่นจะแก้ไขปัญหานี้ในรูปแบบหรือรูปแบบ แต่ฉันจะจำImmutableSortedSet
J Trana

@TheodorZoulias จุดของการมีวิธี BinarySearch ใน SortedDictionary คืออะไรเมื่อวิธี TryGetValue ทำงานใน log (N)? ดูที่นี่
Giorgi Chkhikvadze

2
@GiorgiChkhikvadze BinarySearchสามารถให้องค์ประกอบถัดไปที่มีขนาดใหญ่กว่ารายการที่คุณกำลังค้นหาในกรณีที่ไม่พบคู่ที่ตรงกัน
Theodor Zoulias

1
@GiorgiChkhikvadze อาจเป็นความแตกต่างที่ใหญ่ที่สุดที่นี่คือว่าผลตอบแทนไม่ได้เป็นเพียงค่าเดียวในคอลเลกชัน แต่ค่อนข้างวิธีการดัชนีในคอลเลกชันได้อย่างมีประสิทธิภาพ วิธี BinarySearch นั้นพิเศษไม่เพียงเพราะมันค้นหาค่าได้อย่างมีประสิทธิภาพ แต่เพราะมันหาดัชนีแม้ในกรณีที่พลาดตามที่ Theodor ชี้ให้เห็น - ซึ่งช่วยให้สามารถเข้าถึงได้อย่างรวดเร็วเช่นอาร์เรย์ ในกรณีของต้นไม้ดัชนีจำนวนเต็มอาจไม่ใช่วิธีที่มีประสิทธิภาพในการเข้าถึงโครงสร้าง C ++ แก้ปัญหานี้ผ่านการใช้วัตถุตัววนซ้ำ (แม้ว่าจะมีความซับซ้อนของตัวเอง)
J Trana
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.