📜  门| GATE-CS-2000 |问题17(1)

📅  最后修改于: 2023-12-03 15:42:14.873000             🧑  作者: Mango

GATE-CS-2000 Problem 17

该题是GATE-CS-2000年计算机科学专业的一道问题,考查的是对哈希表的实现细节的理解和掌握。具体问题描述如下:

一个哈希表的大小为m,其中有n个关键字(独立且均匀的随机分布)。每个关键字都可以等概率地被哈希到0到m-1的任意一个位置上,所有关键字的哈希位置是独立的。现在假设我们将哈希表中的所有位置(包括空位置)查找一遍,问期望的查找次数是多少?

问题分析

我们可以将哈希表中的查找分为两种情况:

  1. 在哈希表中查找的关键字出现在某一个桶中(即与关键字哈希到同一个位置)。
  2. 在哈希表中查找的关键字未出现在任何一个桶中。

对于第一种情况,假设哈希函数将关键字$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