具有快速排序插入,排序删除和查找的数据结构

时间:2019-06-04 20:39:02

标签: algorithm sorting data-structures

我正在寻找一个非常具体的数据结构。假设最大元素数是已知的。所有元素都是整数。允许重复。 操作是:

查询。如果插入n个元素,则a[0]是最小的元素,a[a.length - 1]是最高的元素。 a[k]是第k个最小元素。所需的运行时:O(1)

插入。进行排序插入,insert(b),其中b是整数。所需的运行时:O(log n)

删除。 delete(i)删除第ith个元素。所需的运行时:O(log n)

我想要这种数据结构吗?我的问题是语言无关,但是我用C ++编写代码。

1 个答案:

答案 0 :(得分:3)

我相信这样的数据结构不存在。不断查找任何元素(例如,索引)都需要连续的内存,如果要保持范围排序,则插入操作无法在少于O(n)的范围内进行。

散列表和散列表周围的包装都有参数,但是在提及它们时要记住两点:

  • 哈希表在O(1)中具有平均访问权限(插入,删除,查找),但是假设哈希冲突很少。如果您希望满足有关悲观复杂性的要求,则不建议使用哈希表,因为它们的悲观访问时间为O(n)

  • 哈希表本质上是无序。在大多数情况下,它们确实具有用于存储(例如)数据桶的内部数组,但是元素本身既不是全部在连续内存中,也不是按某种属性排序(除了可能对其哈希进行模运算之外,其自身应产生非常大的哈希值) (相似对象的不同值)。

不要单枪匹马-如果您希望尽可能地接近自己的要求,则需要指定为实现其他目标而牺牲的复杂性。我想提出std::priority_queuestd::multiset

  • std::priority_queue仅提供对顶部元素的访问-可以确保该元素将是集合中的最小元素或最大元素(取决于用于指定关系的比较器)。插入和删除都可以在O(log_n)时间内完成。

  • std::multiset *提供对其中每个元素的访问,但费用更高-O(log_n)。它还可以实现O(log_n)的插入和删除。


* 小心-不要与std::set混淆,后者不允许重复的元素。