你如何实现一个有序的哈希表?
How do you implement an ordered hashtable?
我正在搜索 how to implement an ordered hash table 但没有找到任何内容。
我想创建一个散列 table,您可以对其进行迭代,并根据您定义或插入键的顺序为您提供元素。您通常如何以高效的方式执行此操作?这是如何实施的?如果必须选择一种语言作为示例,我正在考虑在 JavaScript 中这样做。我知道例如 JavaScript 对象(“哈希图”)是有序的哈希图,但我不知道它们是如何实现的。我想学习如何从头开始为自定义编程语言实现相同的东西。
例如,假设您要列出语言名称的本地脚本版本,例如“希伯来语”的“עִברִית”作为键,并且您想要创建本地语言到英语的映射,但您希望它们保持定义的顺序。你是如何实现的?
此问题的通用高效解决方案是将链表与散列相结合 table。您将有一个节点的双向链表,每个节点都通过散列索引 table。您可以在恒定时间内从任一方向查找内容。大体上,操作实现如下,
- 插入 - O(1)* - 将节点插入链表的末尾,并通过散列映射通过其键引用该节点。
- 按键检索 - O(1)* - 使用哈希 table,找到相应的节点和 return 它的值。
- 按键删除 - O(1)* - 使用哈希 table,找到相应的节点并通过删除其邻居对它的引用来删除它。
- 遍历 - O(n) - 遍历链表。
n
在这种情况下是节点数,而不是哈希的全部容量 table。
* 实际的 insert/retrieve/delete 时间取决于哈希 table 实现的最坏情况。通常这是 O(n) 最坏情况,O(1) 平均。
(另一种方法是在每个节点中存储一个“下一个键”,而不是直接指向下一个节点的指针。运行时是相同的,但遍历需要涉及哈希 table 而在直接指针实现中它可以被绕过。)
因此,如果您想自己实现它,您将需要一个哈希 table 和一些要在其中使用的节点。
我正在搜索 how to implement an ordered hash table 但没有找到任何内容。
我想创建一个散列 table,您可以对其进行迭代,并根据您定义或插入键的顺序为您提供元素。您通常如何以高效的方式执行此操作?这是如何实施的?如果必须选择一种语言作为示例,我正在考虑在 JavaScript 中这样做。我知道例如 JavaScript 对象(“哈希图”)是有序的哈希图,但我不知道它们是如何实现的。我想学习如何从头开始为自定义编程语言实现相同的东西。
例如,假设您要列出语言名称的本地脚本版本,例如“希伯来语”的“עִברִית”作为键,并且您想要创建本地语言到英语的映射,但您希望它们保持定义的顺序。你是如何实现的?
此问题的通用高效解决方案是将链表与散列相结合 table。您将有一个节点的双向链表,每个节点都通过散列索引 table。您可以在恒定时间内从任一方向查找内容。大体上,操作实现如下,
- 插入 - O(1)* - 将节点插入链表的末尾,并通过散列映射通过其键引用该节点。
- 按键检索 - O(1)* - 使用哈希 table,找到相应的节点和 return 它的值。
- 按键删除 - O(1)* - 使用哈希 table,找到相应的节点并通过删除其邻居对它的引用来删除它。
- 遍历 - O(n) - 遍历链表。
n
在这种情况下是节点数,而不是哈希的全部容量 table。
* 实际的 insert/retrieve/delete 时间取决于哈希 table 实现的最坏情况。通常这是 O(n) 最坏情况,O(1) 平均。
(另一种方法是在每个节点中存储一个“下一个键”,而不是直接指向下一个节点的指针。运行时是相同的,但遍历需要涉及哈希 table 而在直接指针实现中它可以被绕过。)
因此,如果您想自己实现它,您将需要一个哈希 table 和一些要在其中使用的节点。