Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sorting 存储具有重复键的自排序列表的正确数据结构是什么?_Sorting_Data Structures_Time Complexity - Fatal编程技术网

Sorting 存储具有重复键的自排序列表的正确数据结构是什么?

Sorting 存储具有重复键的自排序列表的正确数据结构是什么?,sorting,data-structures,time-complexity,Sorting,Data Structures,Time Complexity,我需要一些能够在O(log(n))复杂度下工作的东西,我考虑过AVL树,但问题是有些键可能会重复它们自己(例如某人的分数),所以我想不出如何将其作为树来实现。做这件事的正确方法是什么?有很多选择。大多数类型的二元搜索树可以很容易地修改,以允许具有重复值的节点,因为平衡操作(通常)纯粹由旋转组成,从而保持序列的有序性。对于这样的情况,您只需执行正常的BST插入,但每次看到重复的值时,您只需任意向左或向右移动并继续,就好像该值是不同的一样 SkipList特别容易更新以支持每个密钥的多个副本,因为它

我需要一些能够在O(log(n))复杂度下工作的东西,我考虑过AVL树,但问题是有些键可能会重复它们自己(例如某人的分数),所以我想不出如何将其作为树来实现。做这件事的正确方法是什么?

有很多选择。大多数类型的二元搜索树可以很容易地修改,以允许具有重复值的节点,因为平衡操作(通常)纯粹由旋转组成,从而保持序列的有序性。对于这样的情况,您只需执行正常的BST插入,但每次看到重复的值时,您只需任意向左或向右移动并继续,就好像该值是不同的一样

SkipList特别容易更新以支持每个密钥的多个副本,因为它们不会对插入或删除进行任何复杂的结构更新

如果没有与每个键关联的辅助信息,那么另一个更简单的选项是存储一个标准的二进制搜索树,但用一个“count”字段来增加每个节点,该字段指示该字段存在多少逻辑副本。每次插入时,如果密钥不存在,则使用计数1创建它。如果它已经存在,只需增加现有节点中的计数。删除将以类似方式执行


当然,如果您不想使用自己的数据结构,只需找到一个好的multimap或multiset实现,这将很好地完成您的工作。根据您选择的编程语言,您甚至可以在标准库中找到它们。:-)

您是否只需要将一些数据与密钥一起存储?关于二进制搜索树(不是AVL)可能会有所帮助。