你如何实现有序哈希表?

问题描述

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

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

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

解决方法

这个问题的通用、高性能解决方案是将链表与哈希表结合起来。您将拥有一个节点的双向链接列表,每个节点都通过哈希表进行索引。您可以在恒定时间内从任一方向查找内容。大体上,操作实现如下,

  1. 插入 - O(1)* - 在链表的末尾插入一个节点,并通过哈希映射通过其键引用该节点。
  2. key Retrieve - O(1)* - 使用哈希表,找到对应的节点并返回其值。
  3. 键删除 - O(1)* - 使用哈希表,找到相应的节点,并通过删除其邻居对其的引用来删除它。
  4. Traverse - O(n) - 遍历链表。在这种情况下,n 是节点数,而不是哈希表的全部容量。

* 实际的插入/检索/删除时间取决于哈希表实现的最坏情况。通常这是 O(n) 最坏情况,O(1) 平均值。

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

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