为什么散列连接的复杂性为O(n + m)?

时间:2015-05-28 10:04:49

标签: database join time-complexity

在网上搜索后,我发现连接两个表的Hash Join算法的复杂性被称为O(N + M),其中N和M是两个表的元组数。 / p>

我想知道为什么O(N + M),而不是最坏情况下的O(N * M)?

据我所知,Hash Join是equi join的一个实现:给定两个表R和S,它是从它们的交叉积R * S中选择元组t,其中t [RA] = t [SA], A是R和S的共同属性。

注意: 1)我想知道复杂性是否为O(N + M),特别是当加入属性中的数据值不唯一时(即我们没有加入关键属性)。 2)请注意,加入属性A可能是也可能不是关键。

1 个答案:

答案 0 :(得分:3)

搜索算法基本上是:

  1. 从R(O(n))

  2. 哈希每个元组
  3. 从S(O(m))散列每个元组

    2.1每次从S舍入一个元组时,在R(O(1))的哈希值中查找

    2.2仅当为R找到匹配的散列时,比较实际的元组值(O(1))

  4. 因此,您只需要为每个元组(n + m)计算一个哈希值并进行哈希查找,理想情况下每个哈希查找为O(1)。

    当然,如果散列函数不适合实际数据,或散列表太小,散列查找仍然是O(1),但你可能需要做很多完整的元组比较,其中大部分都是echo 0 | nc <ip> <port> 。因此,最差最坏情况,对于最坏情况哈希表,再次接近O(n * m)。