arrays - 排序和选择几乎排序的数组

标签 arrays algorithm sorting time-complexity

给定一个长度为 n 的数组,其中每个项目与其在排序数组中的最终位置的距离最多为 log(n),我如何有效地排序它,以及如何找到 k-th 值项 (select-k)?

这是我的初步想法:

对于排序,使用比较模型我可以得到大约 O((logn)^n) 可能的排列,因此比较树的最大深度应该是 O(nloglogn)。此外,对于选择问题,我有一个直觉,如果我查看 k-th 项的每一侧的 logn 范围(2logn - 1 ),我可以在 O(logn) 中使用确定性选择算法,但是我不确定如何证明这种方法的正确性。

请注意,我不是在寻找代码(使用任何语言),而是寻找抽象算法的草图及其时间复杂度。

谢谢。

最佳答案

使用长度为 minHeap

x=log(n)

从头开始,将元素压入堆中,相应地,在 x 次插入后,您将找到最小的元素,然后继续扫描其他元素。

复杂性 -

O(n(log(x))) = x*log(x)(for heap operations for first x elements) + (n-x)(log (x))(for remaining elements)
x=log(n);

您可以通过跟踪有多少元素已经排序来确定排序过程中的第 k 个值......

关于arrays - 排序和选择几乎排序的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45367681/

相关文章:

php - 使用相同数组索引的不同值从 mysql 填充 php 数组

java - 计算二维数组中每行的平均值和标准差

JAVA:文字游戏查询

c++ - 以位计数递增顺序遍历整数的每个位掩码

javascript - 为什么 "sort"对所有数组进行排序?

Java 字符串分割/操作

algorithm - K-means 分割后如何对对象进行计数

c - Big-O 用于使用 for 循环插入 AVL

c# - 从数组中只选择最好的项目

php - WP - woocommerce 按订单列出产品类别