Data structures 如何实现有序哈希表?

Data structures 如何实现有序哈希表?,data-structures,linked-list,hashmap,hashtable,Data Structures,Linked List,Hashmap,Hashtable,我在寻找,但什么也没找到 我想创建一个哈希表,您可以对其进行迭代,并根据定义或插入键的顺序提供元素。一般来说,你是如何做到这一点的?这是如何实现的?如果必须选择一种语言作为示例,我正在考虑使用JavaScript来实现这一点。例如,我知道JavaScript对象哈希映射是有序哈希映射,但我不知道它们是如何实现的。我想学习如何从零开始为自定义编程语言实现同样的东西 例如,假设您列出了一个语言名称的本机脚本版本,如希伯来语的עִברִית,作为键,您希望创建一个从本机语言到英语语言的映射,但希望它们

我在寻找,但什么也没找到

我想创建一个哈希表,您可以对其进行迭代,并根据定义或插入键的顺序提供元素。一般来说,你是如何做到这一点的?这是如何实现的?如果必须选择一种语言作为示例,我正在考虑使用JavaScript来实现这一点。例如,我知道JavaScript对象哈希映射是有序哈希映射,但我不知道它们是如何实现的。我想学习如何从零开始为自定义编程语言实现同样的东西


例如,假设您列出了一个语言名称的本机脚本版本,如希伯来语的עִברִית,作为键,您希望创建一个从本机语言到英语语言的映射,但希望它们保持定义的顺序。如何实现这一点?

解决这个问题的一般有效方法是将链表与哈希表相结合。您将拥有一个双链接的节点列表,每个节点都通过哈希表进行索引。你可以在固定的时间内从任意方向查找。大致而言,这些行动的实施如下:

Insert-O1*-在链表的末尾插入一个节点,并通过哈希映射通过其键引用该节点。 使用哈希表按键-O1*-检索,找到相应的节点并返回其值。 通过键-O1*-删除-使用哈希表,找到相应的节点,并通过删除其邻居对该节点的引用将其删除。 遍历-打开-遍历链接列表。在本例中,n是节点数,而不是哈希表的全部容量。 *实际的插入/检索/删除时间取决于哈希表实现的最坏情况。通常这是最坏的情况,平均值为O1

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


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

此问题的一般性能解决方案是将链表与哈希表相结合。您将拥有一个双链接的节点列表,每个节点都通过哈希表进行索引。你可以在固定的时间内从任意方向查找。大致而言,这些行动的实施如下:

Insert-O1*-在链表的末尾插入一个节点,并通过哈希映射通过其键引用该节点。 使用哈希表按键-O1*-检索,找到相应的节点并返回其值。 通过键-O1*-删除-使用哈希表,找到相应的节点,并通过删除其邻居对该节点的引用将其删除。 遍历-打开-遍历链接列表。在本例中,n是节点数,而不是哈希表的全部容量。 *实际的插入/检索/删除时间取决于哈希表实现的最坏情况。通常这是最坏的情况,平均值为O1

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


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

因为您正在考虑用Javascript实现它,所以想到的一件事可能是分配一个列表和一个空对象。添加项时,将键添加到列表中,并在dict[key]=value的对象/字典中添加值。然后,我们可以通过循环键列表并从对象/字典中获取值,在哈希表中按顺序进行迭代。我想实现一个有序的对象/字典,您正在使用内置字典来实现它,这很简单,因为您正在考虑用Javascript实现它,我想到的一件事可能是分配一个列表和一个空对象。添加项时,将键添加到列表中,并在dict[key]=value的对象/字典中添加值。然后,我们可以通过循环键列表并从对象/字典中获取值,在哈希表上按顺序进行迭代。我想实现一个有序的对象/字典,您正在使用内置字典来实现它,这是欺骗,hahaI无法想象这意味着什么:您将有一个双链接的节点列表,每个节点都通过哈希表进行索引如何从一个节点到另一个索引?给定一个节点有一个字符串键,我将其传递到一个哈希函数中,它将如何给我索引?无论哈希表的实现是什么,它都可以像字符串哈希的模一样简单。基本上,它不是哈希表的值类型,而是结构的值而是一个节点。键的行为
这很正常。我无法想象这意味着什么:“你将有一个双链接的节点列表,每个节点都通过哈希表进行索引。”你如何从一个节点到另一个索引?给定一个节点有一个字符串键,我把它传递到一个散列函数中,它将如何给我索引?以传统的方式,不管你的散列表的实现是什么。它可以像字符串散列的模一样简单。基本上,哈希表的值类型不是结构的值,而是节点。该键的行为正常。