2009-02-22 64 views
3

我想用C#在一個平衡二叉搜索樹中存儲一些值。我查看了泛型命名空間中的集合,並且沒有找到與stl集合相同的集合。什麼是stl集合的C#等價物?

我可以使用哪些通用集合? (我不想存儲鍵/值對... ...只是值)。

+0

請試試[IESI Collections](http://www.codeproject.com/KB/recipes/sets.aspx)。他們被NHibernate使用,所以應該是很好的實現。 – emirc 2009-02-23 22:26:00

回答

7
  1. 如果您需要排序的設置,請使用SortedDictionary<T,U>。這是使用二叉搜索樹實現的。無可否認,您將使用每個條目64位,因爲您正在下面存儲鍵值對。你可以寫它周圍的包裝是這樣的:

    class Set<T> : SortedDictionary<T, bool> 
    { 
        public void Add(T item) 
        { 
         this.Add(item, true); 
        } 
    } 
    
  2. 如果您不需要有序集合,使用HashSet<T>

  3. 否則,請檢查C5 Generic Collection Library。特別是TreeSet<T>。它是一棵紅黑樹,只存儲值。

14

你可以使用一個HashSet

HashSet<T>類提供高性能的一組操作。一組是包含的集合,沒有重複的元素,並且其元素沒有特定的順序。

HashSet<T>對象的容量是對象可以容納的元素的數量。當元素添加到對象時,對象的容量會自動增加。

+0

FWIW,這不是你正在尋找的 - 它不使用二叉樹,而是使用散列表。這使得性能更好,所以通常是首選的,AFAIK。 – 2009-02-22 18:40:50

2

HashSet,但HashSet在框架的2.0版本中不可用。如果你需要2.0的東西,然後使用Dictionary,並指定一個虛擬類型(例如object,int或bool),爲其提供一個虛擬值(例如null,0或false)作爲第二個/值參數(即使用字典作爲一組密鑰而不關心相關值)。

3

嘗試RedBlackTree.NET。它在VB中,但我認爲它可以很容易地轉換爲C#。

我相信一些收集類型實際上在內部使用紅黑樹。所以你可能想要decompile the framework本身,並尋找一些線索。

我不認爲二叉樹可以被HashSet替換。其性能特點不同,大致爲:

HashSet的 - O(1)查找(n)的搜索
二叉搜索樹 - Ø如果你想存儲(log n)的查找O(log n)的搜索

值和稍後執行搜索,您將希望使用二叉樹而不是HashSet。

+0

的確如此:STL集合被排序,而C#HashSet不是。 – ChrisW 2009-02-22 20:30:01

相關問題