在C#.NET中以O(1)时间获取项目的“正确”集合?如果我存储了一堆字符串值,我希望能够在O(1)之后找到它们,我经常做的是:foreach(StringvalueinsomeStringCollection){someDictionary.Add(value,String.Empty);}像这样,我以后可以轻松地对这些字符串值执行恒定时间查找,例如:if(someDictionary.containsKey(someKey)){//etc}但是,我觉得我通过将值设为String来作弊。空的。我应该使用更合适的.NET集合吗?如果您使用的是.Net3.5,请尝试使用HashSet。如果您不使用.Net3.5,请尝试C5。否则你当前的方法是好的(bole,正如@leppie建议的那样更好,或者不像@JonSkeet建议的那样,dundundun!)。HashSetstringSet=newHashSet(someStringCollection);if(stringSet.Contains(someString)){...}您可以在.NET3.5中使用HashSet,否则我会坚持使用您当前的方法(实际上我更喜欢Dictionary但并不总是那么奢侈)。您可能想要添加的是散列的初始大小。我不确定C#的实现是否与Java不同,但它通常有一些默认大小,如果你添加更多,它会扩展集合。然而,适当大小的散列对于尽可能接近O(1)很重要。目标是在每个桶中恰好有1个条目,不是很大。如果您进行一些搜索,我知道有一个建议的比率来调整哈希表的大小,前提是您事先知道要添加多少元素。比如“hash的大小应该是要添加的元素个数的1.8倍”(不是实际比例,只是一个例子)。来自维基百科:通过良好的哈希函数,哈希表通常可以包含与表槽一样多的元素的70%-80%,并且仍然表现良好。根据冲突解决机制,随着更多元素的添加,性能可能会逐渐或急剧下降。为了解决这个问题,当负载因子超过一定阈值时,需要分配一个新的更大的表,将原表的所有内容添加到这个新表中。例如在Java的HashMap类中,默认的加载因子阈值是0.75。我应该问一个问题,因为我经常看到这个问题。是什么让你认为字典是O(1)的?从技术上讲,唯一可能类似于O(1)的事情是使用整数索引值访问标准整数索引固定边界数组(在以这种方式实现的数组中没有查找)。假设它看起来像一个数组引用,那么当“索引”是必须以某种方式查找的值时它是O(1),但在幕后,意味着它不能是O(1)解决方案,除非你幸运的是哈希函数可以得到一个没有冲突的数据(并且可能有很多浪费的单元格)。我已经看到了这些问题,甚至看到了声称O(1)的答案[不是关于这个特定问题,但在我看来它看起来像这些],没有任何理由或解释要求确保O(1)实际实现。嗯,我认为这是一个很好的问题。我会在此处发布此评论后这样做。以上是C#学习教程:'proper'collectionforfetchingitemsinO(1)timeinC#.NET?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
