C# 当一次手术“失败”时意味着什么;方法O(1)“;而不是;是O(1)吗;?

C# 当一次手术“失败”时意味着什么;方法O(1)“;而不是;是O(1)吗;?,c#,.net,optimization,big-o,C#,.net,Optimization,Big O,例如,考虑.NET Framework 4.5字典类的文档: 在.ContainsKey方法的 此方法接近O(1)操作 在.Count属性的 检索此属性的值是一个O(1)操作 请注意,我不一定要询问C#、.NET、字典的详细信息,也不一定要询问一般的大O符号是什么。我只是觉得这种“方法”的区别很有趣 有什么区别吗?如果是这样,它的潜在重要性有多大?我应该注意一下吗?O(1)是一个恒定的运行时间,接近O(1)接近于恒定,但不完全相同,但在大多数情况下,增长可以忽略不计。你不应该注意它。有些东西要么

例如,考虑.NET Framework 4.5
字典
类的文档:

.ContainsKey
方法的

此方法接近O(1)操作

.Count
属性的

检索此属性的值是一个O(1)操作

请注意,我不一定要询问
C#
.NET
字典
的详细信息,也不一定要询问一般的大O符号是什么。我只是觉得这种“方法”的区别很有趣


有什么区别吗?如果是这样,它的潜在重要性有多大?我应该注意一下吗?

O(1)是一个恒定的运行时间,接近O(1)接近于恒定,但不完全相同,但在大多数情况下,增长可以忽略不计。你不应该注意它。

有些东西要么是O(1),要么不是O(1)。我想他们想说的是,对于大量操作,每个操作的运行时间大约为O(1)。

如果哈希代码中底层对象使用的哈希函数“良好”,则意味着冲突将非常罕见。一个给定的散列桶中只有一个项目的可能性很大,可能是两个,而且几乎不会更多。如果您可以肯定地说,一个bucket中的项目永远不会超过
c
(其中
c
是一个常数),那么操作将是O(c)(即O(1))。但这种保证是不可能的。很有可能,你恰好有n个不同的项目,不幸的是,它们都发生碰撞,最后都在同一个桶中,在这种情况下,
ContainsKey
是O(n)。也有可能哈希函数不“好”,经常导致哈希冲突,这会使实际的包含检查比O(1)更糟糕这是因为Dictionary是的一个实现-这意味着通过使用散列函数完成键查找,该函数告诉您数据结构中包含的多个bucket中的哪个bucket包含您要查找的值。通常,对于一个好的哈希函数,假设一组足够大的bucket,每个bucket只包含一个元素-在这种情况下,复杂性确实是O(1)-不幸的是,这并不总是正确的-哈希函数可能会有冲突,在这种情况下,一个bucket可能包含多个条目,因此算法必须在bucket中迭代,直到找到您要查找的条目-因此对于这些(希望是)罕见的情况,不再是O(1)。

ContainsKey可能会搜索所有项,计数必须计数所有项目。@MarvinSmit:
ContainsKey
不必搜索,
count
不必计数
ContainsKey
使用
GetHashCode
Count
只是一个已设置的属性。文档的可能副本可能是错误的或误导性的。也许这是类似于
O(logn)
的东西,因为它们的
logn
并没有超出某个相对较小的常数,所以基本上是
O(1)
@TimS。从技术上讲,它不是O(1)的原因是您需要考虑散列冲突。每个bucket的平均冲突数取决于特定的哈希函数以及您放入其中的项。在大多数情况下,从技术上讲它是O(1),只是你不能保证它是O(1),所以他们需要使用给定的措辞。即使不是O(1),描述与对象碰撞的平均次数的实际函数也会很复杂,甚至可能不依赖于集合中的项目数。