我对此感到很困惑。阅读完课本并完成练习后,我仍然无法理解它是如何工作的,不幸的是我无法亲自去看教授,而且有点难以联系(夏季在线课程,不同的时区)。如果我只是理解如何解决这个问题,我觉得它会“点击”。教科书单独详细介绍了哈希函数和运行时,但我觉得这个问题超出了我们学到的范围。如果有人可以指出任何有帮助的事情,那就太好了。
1)考虑将 m 键插入哈希表T [0 .. m - 1]的过程,其中 m 是素数,我们使用开放式寻址。我们使用的哈希函数是h( k , i )=( k + i )mod 米。举一个 m 键 k1 , k2 ... km 的示例,以便执行以下操作Ω( n ^ 2 )时间:
插入( k1 ),插入( k2 ),...,插入( km )
我知道插入操作应该花费O(1)时间,或者在某些情况下,O(n)。我究竟应该如何设计将其转换为Ω(n ^ 2)时间的键?我希望能理解这一点,我觉得我错过了一些巨大的暗示,因为教科书章节看起来很简单,对我来说很有意义,对此根本没有帮助。在问题中,它表明 m 是一个素数,这是重要的吗?我只是迷失了,谷歌曾经让我失望。
答案 0 :(得分:0)
此处的关键字是哈希冲突:
为了使哈希函数运行良好,您需要将某个输入的值分布在条目存储的所有m
个可能值上。如果哈希表具有大约一样多的条目当插入元素时,您可以期望每个元素都存储在其哈希值(或附近)(意味着只需要少量探测),从而使访问,插入和删除成为一个恒定时间操作。
但是,如果找到不同的输入值,哈希函数每次都会映射到相同的值(冲突),在插入过程中,探测步骤必须跳过所有先前添加的元素,每个元素的时间为Ω(n)平均。因此,我们得到Ω(n²)
的运行时间