【问题标题】:How do you implement an ordered hashtable?你如何实现一个有序的哈希表?
【发布时间】:2021-04-07 07:41:04
【问题描述】:

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

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

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

【问题讨论】:

  • 既然你正在考虑用 Javascript 来做这件事,想到的一件事可能是分配一个列表和一个空对象。添加项目时,将键添加到列表中,并将值添加到对象/字典中,其中 dict[key] = value。然后,我们可以通过遍历键列表并从对象/字典中获取值来按顺序遍历哈希表。
  • 我要实现一个有序的对象/字典,你是用内置的字典来实现的,这是作弊哈哈

标签: data-structures linked-list hashmap hashtable


【解决方案1】:

解决此问题的一般、高效的解决方案是将链表与哈希表相结合。您将拥有一个节点的双向链表,每个节点都通过哈希表进行索引。您可以在恒定时间内从任一方向查找事物。大致上,操作实现如下,

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

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

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

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

【讨论】:

  • 我无法想象这意味着什么:“你将拥有一个节点的双向链表,每个节点都通过哈希表进行索引。”你如何从节点到索引?给定节点有一个字符串键,我将它传递给一个哈希函数,它将如何给我索引?
  • 无论你的哈希表的实现是什么,都是传统的方式。它可以像字符串哈希的模一样简单。基本上,不是你的哈希表的值类型是你的结构的值,而是一个节点。键的行为正常。
猜你喜欢
  • 2013-08-21
  • 2023-03-17
  • 2010-09-06
  • 2012-06-03
  • 2016-03-25
  • 2011-10-14
  • 2011-09-15
  • 1970-01-01
相关资源
最近更新 更多