我正在寻找一个非常具体的数据结构。假设最大元素数是已知的。所有元素都是整数。允许重复。 操作是:
查询。如果插入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 ++编写代码。
答案 0 :(得分:3)
我相信这样的数据结构不存在。不断查找任何元素(例如,索引)都需要连续的内存,如果要保持范围排序,则插入操作无法在少于O(n)
的范围内进行。
散列表和散列表周围的包装都有参数,但是在提及它们时要记住两点:
哈希表在O(1)
中具有平均访问权限(插入,删除,查找),但是假设哈希冲突很少。如果您希望满足有关悲观复杂性的要求,则不建议使用哈希表,因为它们的悲观访问时间为O(n)
。
哈希表本质上是无序。在大多数情况下,它们确实具有用于存储(例如)数据桶的内部数组,但是元素本身既不是全部在连续内存中,也不是按某种属性排序(除了可能对其哈希进行模运算之外,其自身应产生非常大的哈希值) (相似对象的不同值)。
不要单枪匹马-如果您希望尽可能地接近自己的要求,则需要指定为实现其他目标而牺牲的复杂性。我想提出std::priority_queue
或std::multiset
。
std::priority_queue
仅提供对顶部元素的访问-可以确保该元素将是集合中的最小元素或最大元素(取决于用于指定关系的比较器)。插入和删除都可以在O(log_n)
时间内完成。
std::multiset
*提供对其中每个元素的访问,但费用更高-O(log_n)
。它还可以实现O(log_n)
的插入和删除。
* 小心-不要与std::set
混淆,后者不允许重复的元素。