algorithm - 使用附加数据结构的线性排序(查找集合中值的时间复杂度为 O(1),添加元素的时间复杂度为 O(1))

标签 algorithm sorting data-structures median

假设我们在数组和 magic DS 中有任意元素(我们可以在 O(1) 中比较它们),其中我们可以在 O(1) 中添加元素并在 O(1) 中找到 DS 中元素的中位数。我们无法从 DS 中删除元素,并且数组中没有相等的元素。此外,我们可以根据需要创建任意数量的此类 DS。

问题:有没有办法使用这个 DS 在 O(n) 内对数组进行排序?

最佳答案

是的,如果这个数据结构存在,那么它可以用来在 O(n) 时间内排序。

  1. 扫描数组以查找最小和最大元素。将此称为minmax
  2. 以任意顺序将所有数组元素插入到数据结构中。
  3. 插入 n - 1 个 min - 1 副本。中位数现在是原始数组中的最小元素。
  4. 重复 n - 1 次:
    • 插入 max + 1 的两个副本。
    • 读取中位数,它现在将成为原始数组中按升序排列的下一个元素。

这个过程需要 O(n) 时间,因为

  1. 求最小值和最大值的时间复杂度为 O(n),
  2. 插入n个元素是n * O(1) = O(n),
  3. 插入 n-1 个元素的时间为 (n - 1) * O(1) = O(n),
  4. 插入两个元素并读取中位数的时间复杂度为 O(1),因此执行 n - 1 次的时间复杂度为 O(n)。

关于algorithm - 使用附加数据结构的线性排序(查找集合中值的时间复杂度为 O(1),添加元素的时间复杂度为 O(1)),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59095262/

相关文章:

algorithm - 为什么找到最大切割 NP-hard?

python - 如何在不创建临时文件的情况下从文件 'in-place' 中删除行?

Javascript:将对象数组过滤为两个

c++ - 如何 list.sort(member Function);?

c++ - 如何创建/设计数据结构?

java - 改进 Mitchell 的最佳候选算法

java - 为 A* 搜索计算 f_score[neighbor]

java - 这个链表是循环实现的吗?

java - 有效的选择排序算法?

java - 我应该使用什么数据结构来实现下一次剩余到期时间最少的调度