C# Dictionary.Keys返回的KeyCollection操作的速度有多快?(.NET)
定义方法和属性(类型为C# Dictionary.Keys返回的KeyCollection操作的速度有多快?(.NET),c#,.net,collections,dictionary,complexity-theory,C#,.net,Collections,Dictionary,Complexity Theory,定义方法和属性(类型为ICollection)。 我对该方法的(渐进)复杂性和实现中的属性感兴趣 考虑定义 IDictionary<int, string> dict = new Dictionary<int, string>(); int k = new Random().Next(); IDictionary dict=new Dictionary(); int k=new Random().Next(); 考虑到我们已经添加到字典 DICT N< /代码>唯一
ICollection
)。
我对该方法的(渐进)复杂性和实现中的属性感兴趣
考虑定义
IDictionary<int, string> dict = new Dictionary<int, string>();
int k = new Random().Next();
IDictionary dict=new Dictionary();
int k=new Random().Next();
考虑到我们已经添加到字典<代码> DICT <代码> N< /代码>唯一<代码> KEY ValuePaule<代码> S.
调用的预期(渐进)复杂度是多少?我希望它在O(1)
中,但我没有在中找到它
调用dict.Keys.Contains(k)
的预期(渐进)复杂度是多少?我希望它在O(1)
中,但我在中或中都没有找到它。如果是在O(1)
中,我不明白为什么IDictionary.Keys
属性的类型是ICollection
,而不是ISet
(例如在Java中)。您提供的属性在备注中说:
此方法接近O(1)操作
此外,如果单击,您将在备注中看到相同的内容:
此方法是O(1)操作
由于IDictionary
只是一个接口,而不是一个实现,因此它不提供任何性能保证
对于内置的字典
类型,方法应为O(1):
该方法实际上调用父字典的ContainsKey
方法,因此也应该是O(1):
(两个引文均取自相关文档页面的“备注”部分。)注意:
ISet
是.NET 4的新版本,ICollection
和IDictionary
从.NET 2开始就存在了。安东尼·佩格拉姆:那么我希望他们将IDictionary.Keys
的类型更改为.NET 5中的ISet
。这对许多客户来说将是一个突破性的变化。他们不会那样做的。话虽如此,记住,它只是一个接口,任何东西都可以实现。实际上,要实现ISet
,您必须实现ICollection
。因此,返回的实际对象可以很好地实现ISet
。返回的接口类型没有说明实现细节,而仅仅是满足了实现的合同。@ Anthony Pegram:所有这些都被理解了(除了许多客户的“突破性改变”)——我不认为这是一个好的理由)。但是,返回的实际对象(KeyCollection
)没有实现ISet
,我认为应该实现。更重要的是,我认为它的类型应该是ISet
,当类型是ICollection
时,编程人员通常会想到类似List
的东西,并(以我为例)询问关于复杂度的问题:)。但是,返回的集合具有典型的set属性:快速回答“Doyoucontainsomeelement”而不进行枚举,因此类型应该对应。如果他们可以重新执行,他们可能会更改它。但一个新的框架版本并不能完全消除过去的弊病。你可能不这么想,但是避免突破性改变是最重要的事情之一。这并不是说微软从来没有也永远不会在.NET中引入突破性的改变,但好处必须超越巨大。但事实上,他们也可以吃蛋糕。它们返回一个接口,其实现细节不必是恒定的。哦,很抱歉,我应该仔细阅读。但是关于键.Contains的第二个问题在文档中没有答案,至少我找不到。@drasto:事实上,@Mehrdad:在我注意到OP对你答案的评论后,我实际上与你的同时进行了编辑。啊,很抱歉。。。不清楚到底发生了什么,我的错。这本字典真的不是O(1)。是O(对数n)