Algorithm 排序数据结构:随机输入,最低输出

Algorithm 排序数据结构:随机输入,最低输出,algorithm,sorting,data-structures,Algorithm,Sorting,Data Structures,我需要一个数据结构,它支持插入键值对,并提取具有最低键的键值对。插入和提取可以随时发生,因此数据结构必须保持连续排序,提取包括从列表中删除对。此外,正在插入的新对的键值不能低于最近提取的对的键值。随着时间的推移,插入对的键的值也会增加 要求: 关键字:64位无符号整数 一次列出的最大条目数:~10^6 每秒插入(和提取)的条目数:~10^5 提取时有效地删除条目 插入对的键:当前最低键>键>当前最低键+10^7 内存需求是不相关的,计算复杂性不是 某些对可以具有相同的密钥 一个选项是满足您要求

我需要一个数据结构,它支持插入键值对,并提取具有最低键的键值对。插入和提取可以随时发生,因此数据结构必须保持连续排序,提取包括从列表中删除对。此外,正在插入的新对的键值不能低于最近提取的对的键值。随着时间的推移,插入对的键的值也会增加

要求:

  • 关键字:64位无符号整数
  • 一次列出的最大条目数:~10^6
  • 每秒插入(和提取)的条目数:~10^5
  • 提取时有效地删除条目
  • 插入对的键:当前最低键>键>当前最低键+10^7
  • 内存需求是不相关的,计算复杂性不是
  • 某些对可以具有相同的密钥

一个选项是满足您要求的随机输入,最低输出,它执行插入和删除(pop)操作。

一个选项是满足您要求的随机输入,最低输出,它执行插入和删除(pop).

您所描述的内容听起来非常像a,优先级由键比较决定

理想的实现是a,因为这会导致插入和删除
O(logn)
,总的来说,这比一个是
O(1)
和另一个是
O(n)
要好。如果希望很少插入或删除,那么可以使用排序或未排序的序列来实现,但我仍然不太愿意这样做


就插入元素的键大于最后移除元素的要求而言,这只需要额外的成员变量来指示最后移除键的值;每次删除时都要更新此文件。这样做不会影响渐近运行时。或者,您可以在代码中设置一个变量,在调用插入方法之前对照插入候选变量进行检查。无论哪种方式,您都需要存储最后一个删除元素的键,并在调用insert方法之前将其与要插入的元素进行比较。

您所描述的内容听起来非常像a,优先级由键比较决定

理想的实现是a,因为这会导致插入和删除
O(logn)
,总的来说,这比一个是
O(1)
和另一个是
O(n)
要好。如果希望很少插入或删除,那么可以使用排序或未排序的序列来实现,但我仍然不太愿意这样做


就插入元素的键大于最后移除元素的要求而言,这只需要额外的成员变量来指示最后移除键的值;每次删除时都要更新此文件。这样做不会影响渐近运行时。或者,您可以在代码中设置一个变量,在调用插入方法之前对照插入候选变量进行检查。无论哪种方式,您都需要存储最后一个删除元素的键,并在调用insert方法之前将其与要插入的元素进行比较。

正如其他人所建议的,二进制堆是一个很好的选择。我发现他们在大多数情况下都表现得很好。A(d为3或4)可以在增加很少的实现复杂性的情况下,将性能提高10%。在我对您所说的大小的堆进行的实验中,3元堆明显比二进制(2元)堆快


另一个选项是a,它将为您提供O(logn)插入和O(1)删除最低值。实现跳过列表比二进制堆稍微复杂一些,它需要更多的内存,常数因子更高。插入速度可能会比堆中的稍慢,但删除速度会明显加快。它的速度是否足够快,以弥补额外的内存成本和增加的实现复杂性,您必须自己回答。

正如其他人所建议的,二进制堆是一个很好的选择。我发现他们在大多数情况下都表现得很好。A(d为3或4)可以在增加很少的实现复杂性的情况下,将性能提高10%。在我对您所说的大小的堆进行的实验中,3元堆明显比二进制(2元)堆快


另一个选项是a,它将为您提供O(logn)插入和O(1)删除最低值。实现跳过列表比二进制堆稍微复杂一些,它需要更多的内存,常数因子更高。插入速度可能会比堆中的稍慢,但删除速度会明显加快。您必须自己回答它是否足够快以弥补额外的内存成本和增加的实现复杂性。

到目前为止,我还没有尝试过任何解决方案,但我对此有一些想法:@user1062874很好。。。您的想法是什么?将其实现为一个小数组的循环缓冲区,然后简单地遍历循环缓冲区并对数组进行排序以获得有序的元素+非常快的插入-可能很慢地检索最后一个元素-使用自平衡二叉搜索树限制键的最大值也可以做到这一点,但是使用O(logn)插入时,跳转问题是离题的:)到目前为止,我还没有尝试过任何解决方案,但我对此有一些想法:@user1062874那么。。。您的想法是什么?将其实现为一个小数组的循环缓冲区,然后简单地遍历循环缓冲区并对数组进行排序以获得有序的元素+非常快的插入-可能很慢的检索最后一个元素-有限的m