【发布时间】:2021-08-19 06:49:09
【问题描述】:
我正在学习数据结构和算法。我被教导几乎所有 hashmap 操作几乎都是 O(1)。这是一种执行二次探测分辨率的方法,它返回所需对象的位置。
private int findPos( Object x )
{
int offset = 1;
int currentPos = myhash( x ); //Using quadratic probing
while( array[ currentPos ] != null &&
!array[ currentPos ].element.equals( x ) )
{
currentPos += offset; // Compute ith probe
offset += 2;
if( currentPos >= array.length )
currentPos -= array.length;
}
return currentPos;
}
我正在做作业,我必须找出这种方法的复杂性。这是场景:
该数组表示一个英语词典,其中每个元素都是其中的一个单词。这个作业的答案是 O(1) 复杂度。但我想知道为什么不是 O(n) 复杂度,因为里面有很多元素(大约 171,476 个字)会导致很多冲突。换句话说,我怎么能确定,在这种情况下,这个方法总是 O(1) ?
编辑 我的作业问题是:在最坏的情况场景中,这种方法的复杂性是多少。还是 O(1) 吗?
【问题讨论】:
-
对于每个元素,有两种情况:要么有碰撞,要么没有。考虑这两种情况的概率来计算每个元素的估计插入复杂度。最后,对
n值取平均值,以找到平均插入时间。 -
哈希表上的大多数操作不是 O(1),而且正如你所说的 O(n) 或更糟。他们的预期运行时间是 O(1)。
-
“里面有很多元素(约171,476字),会导致很多碰撞” - 碰撞的几率不取决于数量元素,它取决于负载系数。只要底层数组有足够的空间容纳元素,那么灾难性碰撞(即导致 O(n) 行为的一系列碰撞)就极不可能发生。
-
@ldog 所以,正如你所说,它们是 O(1) 预期时间,而不是 O(1) 最坏情况时间。就像快速排序是 O(n log n) 预期时间但 O(n^2) 最坏情况时间。除非我们另有说明,否则没有默认假设我们正在测量最坏的情况。
标签: algorithm data-structures time-complexity big-o