你如何实现一个有序的哈希表?

How do you implement an ordered hashtable?

我正在搜索 how to implement an ordered hash table 但没有找到任何内容。

我想创建一个散列 table,您可以对其进行迭代,并根据您定义或插入键的顺序为您提供元素。您通常如何以高效的方式执行此操作?这是如何实施的?如果必须选择一种语言作为示例,我正在考虑在 JavaScript 中这样做。我知道例如 JavaScript 对象(“哈希图”)是有序的哈希图,但我不知道它们是如何实现的。我想学习如何从头开始为自定义编程语言实现相同的东西。

例如,假设您要列出语言名称的本地脚本版本,例如“希伯来语”的“עִברִית”作为键,并且您想要创建本地语言到英语的映射,但您希望它们保持定义的顺序。你是如何实现的?

此问题的通用高效解决方案是将链表与散列相结合 table。您将有一个节点的双向链表,每个节点都通过散列索引 table。您可以在恒定时间内从任一方向查找内容。大体上,操作实现如下,

  1. 插入 - O(1)* - 将节点插入链表的末尾,并通过散列映射通过其键引用该节点。
  2. 按键检索 - O(1)* - 使用哈希 table,找到相应的节点和 return 它的值。
  3. 按键删除 - O(1)* - 使用哈希 table,找到相应的节点并通过删除其邻居对它的引用来删除它。
  4. 遍历 - O(n) - 遍历链表。 n 在这种情况下是节点数,而不是哈希的全部容量 table。

* 实际的 insert/retrieve/delete 时间取决于哈希 table 实现的最坏情况。通常这是 O(n) 最坏情况,O(1) 平均。

(另一种方法是在每个节点中存储一个“下一个键”,而不是直接指向下一个节点的指针。运行时是相同的,但遍历需要涉及哈希 table 而在直接指针实现中它可以被绕过。)

因此,如果您想自己实现它,您将需要一个哈希 table 和一些要在其中使用的节点。