我想用C#在一個平衡二叉搜索樹中存儲一些值。我查看了泛型命名空間中的集合,並且沒有找到與stl集合相同的集合。什麼是stl集合的C#等價物?
我可以使用哪些通用集合? (我不想存儲鍵/值對... ...只是值)。
我想用C#在一個平衡二叉搜索樹中存儲一些值。我查看了泛型命名空間中的集合,並且沒有找到與stl集合相同的集合。什麼是stl集合的C#等價物?
我可以使用哪些通用集合? (我不想存儲鍵/值對... ...只是值)。
如果您需要排序的設置,請使用SortedDictionary<T,U>
。這是使用二叉搜索樹實現的。無可否認,您將使用每個條目64位,因爲您正在下面存儲鍵值對。你可以寫它周圍的包裝是這樣的:
class Set<T> : SortedDictionary<T, bool>
{
public void Add(T item)
{
this.Add(item, true);
}
}
如果您不需要有序集合,使用HashSet<T>
。
否則,請檢查C5 Generic Collection Library。特別是TreeSet<T>
。它是一棵紅黑樹,只存儲值。
你可以使用一個HashSet
的
HashSet<T>
類提供高性能的一組操作。一組是包含的集合,沒有重複的元素,並且其元素沒有特定的順序。
HashSet<T>
對象的容量是對象可以容納的元素的數量。當元素添加到對象時,對象的容量會自動增加。
FWIW,這不是你正在尋找的 - 它不使用二叉樹,而是使用散列表。這使得性能更好,所以通常是首選的,AFAIK。 – 2009-02-22 18:40:50
HashSet,但HashSet在框架的2.0版本中不可用。如果你需要2.0的東西,然後使用Dictionary,並指定一個虛擬類型(例如object,int或bool),爲其提供一個虛擬值(例如null,0或false)作爲第二個/值參數(即使用字典作爲一組密鑰而不關心相關值)。
嘗試RedBlackTree.NET。它在VB中,但我認爲它可以很容易地轉換爲C#。
我相信一些收集類型實際上在內部使用紅黑樹。所以你可能想要decompile the framework本身,並尋找一些線索。
我不認爲二叉樹可以被HashSet替換。其性能特點不同,大致爲:
HashSet的 - O(1)查找(n)的搜索
二叉搜索樹 - Ø如果你想存儲(log n)的查找O(log n)的搜索
值和稍後執行搜索,您將希望使用二叉樹而不是HashSet。
的確如此:STL集合被排序,而C#HashSet不是。 – ChrisW 2009-02-22 20:30:01
請試試[IESI Collections](http://www.codeproject.com/KB/recipes/sets.aspx)。他們被NHibernate使用,所以應該是很好的實現。 – emirc 2009-02-23 22:26:00