如何解决是否有 O(1) 插入时间的数据结构也保持排序顺序?
哈希表可以在 O(1) 中插入,但它们没有排序。
BST 维护一个排序(可以使用预序遍历来遍历),但插入是 O(logN)。
是否有任何数据结构:
- 保证 O(1) 插入
- 保持对元素的排序?
如果不是,是否有证据表明这样的数据结构不存在? 谢谢
解决方法
在一般情况下,这样的数据结构是不可能的,因为您可以使用它对具有 O(n) 次比较操作的序列进行排序,只需将序列元素一一插入即可。很容易证明 Ω(n log n) 是 number of comparisons required to sort a list 的下限,因此插入到“保持排序顺序”的数据结构中每个元素必须至少花费 Ω(log n) 时间。
这里我假设可以遍历数据结构以输出排序列表,而无需进行任何额外的比较。如果只是为了迭代数据结构的内容而需要额外的比较,那么可以说数据结构在内部不会“维护”排序顺序。如果您不介意花费 O(n log n) 时间来遍历大小为 n 的集合,那么您可以使用未排序的列表作为数据结构,插入时间为 O(1)。
,您可以为此O(1)交换更多空间。如果值域是整数,比如从 0 到 N-1, 那么你可以有一个
// (In Java)
int[] valueToFrequency = new int[N];
void insert(int value) {
++valueToFrequency[value];
}
对于 N 值:O(N)。
困难(除了值映射和基于 0 的索引)是数组是稀疏的:许多零。 因此输出很慢。
对于唯一值(如“哈希表”所建议的),可以在 Java 中使用 BitSet。这在输出 (nextSetBit) 上也快了一点。
// (In Java)
BitSet valueToFrequency = new Bitset(N);
void insert(int value) {
valueToFrequency.set(value);
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。