为什么使用双向链表删除哈希表的元素是O(1)?

Joh*_*ang 22 algorithm hashtable doubly-linked-list

在CLRS的教科书"算法导论"中,有关于pg的这一段.258.

如果列表是双重链接,我们可以在O(1)时间内删除一个元素.(注意,CHAINED-HASH-DELETE将元素x作为输入而不是其键k,因此我们不必首先搜索x.如果哈希表支持删除,则其链表应该双重链接,以便我们可以快速删除一个项目.如果列表只是单链接,那么要删除元素x,我们首先必须在列表中找到x,以便我们可以更新x的前一个属性的下一个属性.使用单链表,两个都删除并且搜索将具有相同的渐近运行时间).

让我感到困惑的是这个大家伙,我无法理解它的逻辑.有了双链表,还是要找到x才能删除它,这与单链表有什么不同?请帮我理解一下!

Fez*_*vez 31

这里提出的问题是:考虑到你正在查看哈希表的特定元素.删除它的成本有多高?

假设您有一个简单的链表:

v ----> w ----> x ----> y ----> z
                |
            you're here
Run Code Online (Sandbox Code Playgroud)

现在,如果你删除x,你需要连接wy让你列表链接.您需要访问w并告诉它指向y(您希望拥有w ----> y).但你无法访问w,x因为它只是链接!因此,您必须遍历所有列表才能w在O(n)操作中找到,然后告诉它链接到y.那很糟.

那么,假设你是双重联系的:

v <---> w <---> x <---> y <---> z
                |
            you're here
Run Code Online (Sandbox Code Playgroud)

很酷,你可以从这里访问w和y,所以你可以w <---> y在O(1)操作中连接两个()!

  • 我不知道如何在不搜索链表的情况下获取元素x.这里的上下文是我们试图删除具有密钥k的对象v,并且哈希表使用链接作为其冲突解决机制.如果我有元素x(包装对象v和指向它的前一个和下一个元素的指针),那么它是有用的但实际上我们只有v,所以删除仍然需要O(n)在最坏的情况下因为你必须先找到x .我不知道我错过了什么,但我没有看到双重链表帮助. (4认同)
  • 虽然我认为这个答案是有道理的.我仍然认为教科书在这里做得不好.各方面都不清楚,让人感到困惑.想想我们在哈希表中有键值x对(键,值x).元素X可以是任何东西,它不一定是指针或包含链表的指针.教科书假定元素是"链表中的一个元素",但在任何地方都没有提到.教科书实际上将元素x的数据结构定义为不仅包含值而且包含指针的结构,这将是一件好事. (3认同)
  • 在你的解释中,你假设你知道指向 x 的指针,而不仅仅是 x,但教科书没有这么说!还是在教科书的某个地方暗示了它? (2认同)
  • `注意,CHAINED-HASH-DELETE将元素x而不是其键k作为输入。是的,教科书上说您已经在这里=)。假设您知道指向“ x”的指针。这就是为什么我在回答的第一行中重新编写了该问题的原因,因为我认为您忽略了这一点。(这也意味着您通常是正确的,如果您不知道`x`,则将花费O(n)操作来查找“ x”(单链或双链)) (2认同)