微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

是否有 O(1) 插入时间的数据结构也保持排序顺序?

如何解决是否有 O(1) 插入时间的数据结构也保持排序顺序?

哈希表可以在 O(1) 中插入,但它们没有排序。

BST 维护一个排序(可以使用预序遍历来遍历),但插入是 O(logN)。

是否有任何数据结构:

  1. 保证 O(1) 插入
  2. 保持对元素的排序?

如果不是,是否有证据表明这样的数据结构不存在? 谢谢

解决方法

在一般情况下,这样的数据结构是不可能的,因为您可以使用它对具有 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 举报,一经查实,本站将立刻删除。