我们如何找出哈希表上搜索操作的平均时间和最差时间复杂度,该操作已按以下方式实现:
假设'N'是需要进行哈希处理的键数。我们采用大小为M的哈希表(M = alpha * N,alpha~0.1)。通过以链式链表方式存储密钥来解决冲突,将每个新条目存储在'hashTable [i]'指向的每个链表的头部。
恕我直言,最好,平均和最坏情况的复杂性可能是O(1),O(N / M)和O(N)。如果我错了,请纠正我。详细解释将不胜感激。答案 0 :(得分:6)
答案取决于散列函数的特征和alpha的特定值。最糟糕的情况是,如果散列实现不良分布(对于任何alpha),并且正如您在原始帖子中所述,是O(N)。最好的情况发生在你有一个分布均匀的哈希并且alpha相对较大(> 1.0)时,如你所说,那就是O(1)。所以我们同意最好的情况和最坏的情况。
但是我认为平均情况需要更多分析,因为alpha对性能有非线性影响。考虑两个极端的例子。情况1,alpha = 100,1000,10000。当alpha缩放到无穷大时,你将没有可避免的冲突(即由于必须截断哈希以映射到M桶而导致的冲突,而不是哈希的非均匀行为),所以平均情况收敛到最好的情况,或O(1)。案例2,alpha = 0.01,0.001,0.0001。当alpha缩放为零时,您拥有越来越少的散列桶,直到整个表只是一个散列桶,其中所有值都在该桶中的单个列表中,因此平均情况收敛于线性搜索最坏情况,或O( N)。
平均情况介于O(1)和O(N)之间,具体取决于alpha。我们可以将其表示为O(N ^ x),其中x是将alpha = 0映射到x = 1,alpha =无穷大到x = 0的函数。所以为了辩论,(见http://en.wikipedia.org/wiki/Heaviside_function ),也许像O(N ^(e ^( - alpha)))。