เหตุใดจึงไม่มีคลาส Tree <T> ใน. NET


89

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

ฉันตาบอด แต่หาไม่พบ ... มันถูกฝังอยู่ที่ไหนสักแห่งใน BCL หรือไม่? ถ้าไม่มีใครสามารถแนะนำไลบรารี C # /. NET ฟรีหรือโอเพ่นซอร์สสำหรับต้นไม้ไบนารีได้หรือไม่? โดยเฉพาะอย่างยิ่งที่ใช้ยาชื่อสามัญ

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


ตกลง บางครั้งฉันจำเป็นต้องค้นหา (ใน O (Log N) time) ทั้งสองโหนดที่ผูกค่าไว้ (เมื่อไม่พบค่าในคอลเล็กชัน) ตัวอย่างเช่นคอลเลกชัน (ต้นไม้) มี 13 และ 17 (ในกลุ่มอื่น ๆ ) และฉันกำลังมองหาต้นไม้ที่ยิ่งใหญ่ที่สุดน้อยกว่าและน้อยกว่า 16 ต้นไม้สามารถทำได้ แต่พจนานุกรมรายการที่เรียงลำดับและตารางแฮชใช้ O (N) .
Les

คำตอบ:


31

คุณพูดถูกไม่มีอะไรใน BCL ฉันสงสัยว่านี่เป็นเพราะการเลือกว่าจะใช้ทรีนั้นโดยทั่วไปแล้วจะเป็นรายละเอียดการใช้งานหรือไม่และเป็นวิธีที่ไม่ธรรมดาในการเข้าถึงข้อมูล นั่นคือคุณไม่ได้พูดว่า "binary-search-for element # 37"; คุณจะพูดว่า "ขอองค์ประกอบ # 37 ให้หน่อย"

แต่คุณได้ดูC5 แล้วหรือยัง? สะดวกมากและมีการใช้งานต้นไม้หลายอย่าง ( 1 , 2 , 3 )


3
C5 รองรับต้นไม้ Red Black ไม่ใช่ B-Tree เป็นความแตกต่างที่ผู้คนควรระวัง B-Tree เหมาะสมกว่าสำหรับแผนผังที่ใช้ดิสก์หรือทรีที่ใช้หน่วยความจำขนาดใหญ่ โหนดอื่น ๆ จะถูกเก็บไว้ในพื้นที่เดียวกันเพื่อให้คุณได้รับประสิทธิภาพแคชของโปรเซสเซอร์ที่ดีขึ้นและอ่านเขียนลงดิสก์ได้เร็วขึ้น
AnthonyLambert

69

คุณสามารถกำหนดของคุณเอง:

public class MyTree<K, V> : Dictionary<K, MyTree<K, V>>
{
    public V Value { get; set; }
}

หรือไม่ใส่คีย์:

public class MyTree<V> : HashSet<MyTree<V>>
{
    public V Value { get; set; }
}

อย่างไรก็ตามสิ่งนี้ต้องการให้คุณรู้ว่าคุณจะจัดการระดับต้นไม้กี่ระดับในเวลารวบรวมฉันผิดหรือเปล่า?
Veverke

1
ไม่คอมไพเลอร์ C # รองรับไวยากรณ์นี้
Jason

3
ระวังว่าองค์ประกอบไม่ได้เรียงลำดับด้วยวิธีนี้
Sebastian

@Veverke บางทีคุณอาจกำลังคิดถึงเทมเพลต C ++ .NET generics คือประเภทรันไทม์
Tom Blodget

ฉันอยากรู้. คุณใช้สิ่งนี้อย่างไร? จวน? ตัวอย่างใด ๆ
Syaiful Nizam Yahya

40

คุณต้องการอะไรจากการใช้งานดังกล่าว?

ต้นไม้ไบนารี? แดงดำ? ต้น Radix? บี - ทรี? อาร์ - ทรี? ร * - ทรี?

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


1
คำตอบที่ดีที่สุดสำหรับส่วน "ทำไม" ของคำถาม
Joel Coehoorn

และนี่เป็นเพียงต้นไม้ค้นหาเท่านั้น นอกจากนี้ยังมีต้นไม้แสดงออกปอยผมตัดสินใจ ...
Henk Holterman

รายละเอียดการดำเนินการมีความสำคัญ ในกรณีของฉันฉันต้องการใช้อัลกอริทึมบางอย่างที่จะดำเนินการข้ามผ่านที่แตกต่างกัน (infix, postfix) ในชุดข้อมูลที่จัดระเบียบซึ่งเป็นส่วนหนึ่งของชุดการแปลง โครงสร้างต้นไม้เป็นวิธีที่ดีที่สุดในการแก้ปัญหาของฉัน
LBushkin

12
ในจักรวาลคู่ขนานมีคนถามคำถามว่า "ทำไมไม่มี list types ใน. net" และพวกเขาก็ได้รับคำตอบว่า "คุณต้องการอะไรจากการนำไปใช้งานเช่นนี้อาร์เรย์หรือรายการที่เชื่อมโยงคิว? A พจนานุกรม?" ฉันคิดว่านี่เป็นคำตอบที่ไม่ใช่ตัวต่อเนื่อง
rymdsmurf


12

SortedSet<T>จะดำเนินการเป็นต้นไม้ค้นหาแบบทวิภาคโทษ SortedDictionary<TKey, TValue>ใช้ภายในSortedSet<T>ดังนั้นจึงเป็นการอ้างอิงต้นไม้ค้นหาแบบไบนารีเช่นกัน


5
น่าเสียดายที่สิ่งเหล่านี้เป็นเพียงการนำแผนที่และรายการสั่งซื้อไปใช้ ไม่เป็นประโยชน์สำหรับการนำมาใช้ซ้ำเป็นต้นไม้ไบนารี - โครงสร้างต้นไม้เหล่านี้เป็นเพียงรายละเอียดการใช้งานของคอลเล็กชัน ฉันกำลังมองหาคลาสที่เปิดเผยโครงสร้างต้นไม้
LBushkin

9

ไม่ไม่มีTree<T>ประเภท "เหมือน" ใด ๆใน BCL (สิ่งที่ทำให้ฉันงงงวยตลอดเวลาเช่นกัน) แต่นี่เป็นบทความดีๆที่จะแนะนำคุณตลอดการใช้งานของคุณเองใน C #

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



-5

มีTreeNode ที่คุณสามารถใช้ได้ ไม่ใช่แบบทั่วไปและซ่อนอยู่ในรูปแบบ windows และใช้กับตัวควบคุม Treeview แต่คุณสามารถใช้ที่อื่นได้เช่นกัน


ใช่ แต่มันมีคุณสมบัติ Tag ของ System.Object ype ไม่มีพารามิเตอร์ <T> ทั่วไป
Henk Holterman

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

4
กำไรจากการใช้งานจะเป็นอย่างไร? โหนดทรีมักไม่มีฟังก์ชันการทำงานที่เกี่ยวข้อง เป็นเพียงการอ้างอิงถึงเด็กและในที่สุดก็เป็นผู้ปกครอง ไม่มีเหตุผลที่จะใช้คลาส System.Windows.Forms ในทางที่ผิด! เพียงแค่เขียนด้วยตัวคุณเอง - ในไม่กี่นาที
user492238
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.