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
Algorithm 具有快速排序插入、排序删除和查找功能的数据结构_Algorithm_Sorting_Data Structures - Fatal编程技术网

Algorithm 具有快速排序插入、排序删除和查找功能的数据结构

Algorithm 具有快速排序插入、排序删除和查找功能的数据结构,algorithm,sorting,data-structures,Algorithm,Sorting,Data Structures,我正在寻找一个非常具体的数据结构。假设已知元素的最大数量。所有元素都是整数。允许重复。 行动包括: 抬头看。如果我插入n个元素,a[0]是最小的元素,a[a.length-1]是最高的元素a[k]是k个最小元素。所需运行时:O(1) 插入。进行排序插入,insert(b)其中b是一个整数。所需运行时:O(日志n) 删除删除(i)删除第i个元素。所需运行时:O(日志n) 我想要一种数据结构,这是什么?我的问题是语言无关,但我用C++编写代码。 < P>我相信这样的数据结构是不存在的。任何元素的常量

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

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

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

删除<代码>删除(i)删除第i个元素。所需运行时:
O(日志n)


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

< P>我相信这样的数据结构是不存在的。任何元素的常量查找(例如索引)都需要连续内存,如果要保持范围排序,则在小于
O(n)
的时间内无法进行插入

关于哈希表和包装器,有一些参数,但在提到它们时,有两件事需要记住:

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

  • 哈希表本质上是无序的。大多数情况下,它们确实有用于存储(例如)数据桶的内部数组,但元素本身既不是都在连续内存中,也不是按某些属性排序的(除了它们的散列的模,散列本身应该为类似对象生成非常不同的值)

为了不让您两手空空——如果您希望尽可能接近您的需求,您需要指定您将牺牲哪些复杂性来实现其他复杂性。我想提议
std::priority\u queue
std::multiset

  • std::priority_queue
    仅提供对顶层元素的访问-保证它是集合中最小或最大的元素(取决于用于指定关系的比较器)。插入和删除都是在
    O(log\n)
    时间内完成的

  • std::multiset
    *提供对其中每个元素的访问,但成本较高-
    O(log\n)
    。它还实现了插入和删除中的
    O(log\n)



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

一般来说,我认为您正在寻找优先级队列,但已知的最大值除外。有很多方法可以通过STL或您自己的pet实现来实现。@jhill515优先级队列没有
O(1)
查找,是吗?因此
a[k]
是k个最小的元素。您是否需要
O(1)
访问所有
k
,而不仅仅是
0
length-1
?@jhill515队列有两个问题:1-它在设计上只提供对顶部元素的访问。2-它通常被实现为优化二叉树(红黑或AVL),这(如果你能实现的话)需要
log\n
时间来访问
k
-th元素。我想我从来没有听说过
O(1)
查找和
O(log n)
插入/删除的数据结构。这太好了,不可能是真的。所有数据结构在某些操作中都有权衡,以在其他操作中获得最佳结果。最接近的是,仅使用
O(1)
查找最小元素(其余为
O(n)
)和对数插入/删除
std::priority_queue
是上面提到的一个实现。是否可以设计具有这些要求的容器?还是理论上不可能?我相信理论上不可能,但我没有任何数学证明。我可以尝试通过扩展证明来计算一些东西,即如果使用比较的话,排序的时间不可能比
O(log\n)
更好,但我并不擅长于此。