IDictionary<TK, TV>
定义方法IDictionary.ContainsKey(in TK)
和属性IDictionary.Keys
(类型ICollection
)。
我对Dictionary
的IDictionary<TK, TV>
实现中此方法和属性的(渐近)复杂性感兴趣。
考虑定义
IDictionary<int, string> dict = new Dictionary<int, string>();
int k = new Random().Next();
并考虑我们已添加到字典dict
n
唯一KeyValuePair
s。
电话dict.ContainsKey(k)
的预期(渐近)复杂性是什么?我希望它在O(1)
,但我没有在documentation of Dictionary.ContainsKey
中找到它。
调用dict.Keys.Contains(k)
的预期(渐近)复杂性是什么?我希望它在O(1)
,但我没有在documentation of Dictionary.Keys
或documentation of Dictionary.KeyCollection
中找到它。如果它在O(1)
中,我不明白为什么IDictionary.Keys
属性的类型是ICollection
而不是ISet
(例如在Java中)。
答案 0 :(得分:7)
由于IDictionary<K,V>
只是一个接口,而不是一个实现,因此它不提供任何性能保证。
对于内置Dictionary<K,V>
类型,ContainsKey
方法应为O(1):
Keys.Contains
方法实际上调用了父词典的ContainsKey
方法,因此也应该是O(1):
(两个引号均来自相关文档页面的“备注”部分。)
答案 1 :(得分:5)