algorithm - 具有快速排序插入、排序删除和查找的数据结构
问题描述
我正在寻找一个非常具体的数据结构。假设元素的最大数量是已知的。所有元素都是整数。允许重复。操作是:
抬头。如果我插入n个元素,a[0]
是最小的元素,a[a.length - 1]
是最高的。a[k]
是第 k 个最小元素。所需的运行时间:O(1)
插入。进行排序插入,insert(b)
其中b
是一个整数。所需的运行时间:O(log n)
删除。delete(i)
删除第 i 个元素。所需的运行时间:O(log n)
我想要什么样的数据结构是这样的?我的问题与语言无关,但我使用 C++ 进行编码。
解决方案
我相信这样的数据结构不存在。对任何元素(例如索引)的持续查找需要连续的内存,这使得插入不可能在少于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
不允许重复元素的 混淆。
推荐阅读
- c++ - Cuda如何将char**从内核复制到主机
- java - 在 Java 中对 0 和 1 进行排序
- python - 检查函数是否包含 pass
- reactjs - 在查询上遇到子选择,但是存储没有对象引用 Apollo Link State
- django - 自定义迁移上的 Django evert 迁移
- javascript - 如何修复此错误无法调用类型缺少调用签名的表达式
- ruby-on-rails - 纸轨 Rails 控制器中的当前活动上下文
- javascript - 为什么在 ES6 语法中页面加载时会自动调用函数?
- javascript - React Router v4 多个动态路由
- java - 修剪文件名以用作字符串的正确方法?