我想使用C#在平衡二进制搜索树中存储一些值。我查看了泛型命名空间中的集合,但我没有找到stl集的等价物。
我可以使用哪些通用收藏品? (我不想存储键/值对......只是值。)
答案 0 :(得分:14)
您可以使用HashSet
HashSet<T>
类提供高性能集合操作。集合是包含无重复元素的集合,其元素没有特定顺序。
HashSet<T>
对象的容量是对象可以容纳的元素数。随着元素添加到对象中,HashSet<T>
对象的容量会自动增加。
答案 1 :(得分:7)
如果您需要排序集,请使用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>
。它是一棵红黑树,只存储值。
答案 2 :(得分:3)
试试RedBlackTree.NET。它在VB中,但我认为它可以很容易地转换为C#。
我相信一些集合类型实际上在内部使用了一个红黑树。所以你可能想要decompile the framework本身,并寻找一些线索。
我认为二进制树不能被HashSet替换。它们的性能特征大致相同:
HashSet - O(1)lookup(n)搜索
二进制搜索树 - O(log n)查找O(log n)搜索
如果要存储值并稍后执行搜索,则需要使用二叉树而不是HashSet。
答案 3 :(得分:2)
HashSet,但HashSet在框架的2.0版本中不可用。如果你需要2.0的东西,那么使用Dictionary,并指定一个虚拟类型(例如object,int或bool),为其提供一个虚拟值(例如null,0或false)作为第二个/ value参数(即使用字典作为一组键而不关心相关的值)。
答案 4 :(得分:1)
我知道这个问题很旧,但是对于.NET Framework 4.0及更高版本,请使用SortedSet<T>
或ImmutableSortedSet<T>
。