java - 如何计算构建哈希表所需的最大/最小探针数

标签 java algorithm hashmap

我目前正在学习 Robert Sedgewick 和 Kevin Wayne 合着的算法第四版,我被困在其中一个练习中。我知道有人在 GitHub 上发布了本书中许多练习的解决方案,但我想自己做这些,以便我可以理解并从中学习。

我一直在浏览这本书,了解如何计算构建哈希表所需的最大/最小探针数(练习 3.4.12),但我找不到任何方法/函数/公式来说明如何计算处理这样的问题时才能前进。

练习:

Suppose that the keys A through G, with the hash values given below, are inserted in some order into an initially empty table of size 7 (= m) using a linear-probing (when there's a collision ew just check the next entry in the table by incrementing index) table (with no resizing for this problem)

key = "A B C D E F G"

hash = "2 0 0 4 4 4 2"

Which of the following could not possibly result from inserting these keys?

a) E F G A C B D

b) C E B G F D A

c) B D F A C E G

d) C G B A D E F

e) F G B D A C E

f) G E C A D B F

我找到了这个网站 http://orion.lcg.ufrj.br/Dr.Dobbs/books/book2/algo02e5.htm ,但我无法理解其中的大部分内容。当我试图解决这个问题时,我不知道该怎么做,首先我以为我误解了这个问题,或者我根本找不到如何解决这个练习的公式。

如何计算构建大小为 m 的表可能需要的最大和最小探测数?

最佳答案

我认为这个问题没有特定的公式。 您需要查看每个订单,并决定该订单是否有可能实现。

让我们一起看一下 (a):E F G A C B D

如果我们用哈希值替换键,我们将得到 4 4 2 2 0 0 4。现在重要的部分 - 请注意,只有 G 位于“右”桶中,所有其他值都因线性探测而移动。那可能吗?

假设我们首先插入了 G 并将其写入索引 2。现在怎么办?如果我们插入一个散列为 04 的键,它将被放置在单元格 04 中而不进行探测,这不是我们想要的。唯一的选择是现在插入 A,它的哈希值也是 2。它会去哪里?索引 3 当然是由于线性探测。到目前为止一切顺利,我们的数组如下所示:X X G A X X X

现在怎么办?我们只剩下散列为 04 的键,一旦我们插入一个这样的键,它将被放置在单元格 0 中或 4。但是在我们被询问的模式中,所有具有散列 04 的值都不在“正确的”单元格中。因此,这种模式是不可能的。

现在让我们看看 (b)。顺序是 C E B G F D A,转换为 0 4 0 2 4 4 2。我们如何创建这种模式?

让我们插入 C:C X X X X X X 现在怎么办?让我们插入 F:C X X X F X X。现在让我们插入 D。由于线性探测,我们将以 C X X X F D X 结束。现在怎么办?我们被困住了。不管我们现在插入什么,我们都无法到达 C E B G F D A。有什么我们可以改变我们以前的插入以获得不同的结果吗?不能。因此,(b)也是不可能的。

关于java - 如何计算构建哈希表所需的最大/最小探针数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58610865/

相关文章:

java - 单击 Canvas 后 KeyListener 停止工作

algorithm - p = B^E 的复杂度是多少?

java - 查找给定单词中字符的重复次数

java - 编辑程序以使用 Java 中用户输入的 do while/while 循环

java - 在 Eclipse 中将 native 库导出到外部包不起作用。这是一个错误吗?

java - RecognizerIntent 更改默认语言

c++ - 如何缩短多个 && 条件

java - Dijkstra最短路径算法: finding number of checked vertices

Java 在新的 hashmap 中对参数进行排序,而不是返回到 main

java - 如何迭代泛型的 HashMap ?