📅  最后修改于: 2023-12-03 15:42:14.873000             🧑  作者: Mango
该题是GATE-CS-2000年计算机科学专业的一道问题,考查的是对哈希表的实现细节的理解和掌握。具体问题描述如下:
一个哈希表的大小为m,其中有n个关键字(独立且均匀的随机分布)。每个关键字都可以等概率地被哈希到0到m-1的任意一个位置上,所有关键字的哈希位置是独立的。现在假设我们将哈希表中的所有位置(包括空位置)查找一遍,问期望的查找次数是多少?
我们可以将哈希表中的查找分为两种情况:
对于第一种情况,假设哈希函数将关键字$k$哈希到哈希值$h(k)$,则关键字$k$在哈希表中的查找次数为该桶中的元素个数(至多为$n$),即$X_i$,则该桶的期望查找次数为:
$$ E(X_i) = \sum_{j=0}^{n} j \cdot p_j $$
其中$p_j$表示该桶中有$j$个关键字的概率。由于每个关键字可以等概率地被哈希到$m$个位置中的任意一个位置,所以该桶中恰好有$j$个关键字的概率为:
$$ p_j = {n \choose j} \left(\frac{1}{m}\right)^j \left(1-\frac{1}{m}\right)^{n-j} $$
代入到期望计算公式中,则有:
$$ E(X_i) = \sum_{j=0}^{n} j \cdot {n \choose j} \left(\frac{1}{m}\right)^j \left(1-\frac{1}{m}\right)^{n-j} $$
由于该式较为复杂,计算难度较大,因此我们可以使用二项式式子$(a+b)^n = \sum_{j=0}^{n}{n\choose j} a^j b^{n-j}$将该式子化简,得到:
$$ E(X_i) = \frac{n}{m} + \left(\frac{n}{m}\right)^2 \cdot \frac{m-1}{m} $$
对于第二种情况,存在一个空桶,它的查找次数为$m$次。因此,期望的查找次数为所有桶的期望查找次数之和,再加上空桶的查找次数,即:
$$ E(X) = \frac{1}{m} \sum_{i=0}^{m-1} E(X_i) + \frac{1}{m} \cdot m $$
将上面的公式代入到该式中,得到期望的查找次数为:
$$ E(X) = \frac{n}{m} + 1 + \frac{n}{m(m-1)} $$
下面是该问题的Python代码实现:
def expected_search_time(m, n):
bucket_exp = n / m + ((n / m) ** 2) * (m - 1) / m
empty_exp = 1
total_exp = m * (bucket_exp + empty_exp) / m
return total_exp
# Test
print(expected_search_time(10, 3)) # 1.8
print(expected_search_time(100, 50)) # 1.51
其中,m
表示哈希表的大小,n
表示哈希表中的关键字数。函数expected_search_time(m, n)
返回期望的查找次数。对于题目中的示例输入(10, 3)
,expected_search_time(10, 3)
的输出为1.8
。