【问题标题】:Counting inversions to see if an array is partially sorted计数反转以查看数组是否部分排序
【发布时间】:2015-07-04 17:55:37
【问题描述】:

以下排序数组的定义来自 Robert Sedgewick 和 Kevin Wayne 的算法书。

如果反转次数为 ,则数组部分排序

不应该限制c可以达到多高吗?我不能在技术上使 c = 1000000000 并且现在许多未排序的数组在不应该被计算为部分排序时?我知道设置高 c 并不聪明,但不应该是某种范围?

这是最坏情况的示例。

D C B A

反转计数

1 (d, c)

2 (d, b)

3(d,a)

4 (c, b)

5 (c, a)

6 (b, a)

对于大小为 4、6 项的数组。如果 c = 2 和 6 ,这完全是线性的

我们什么时候达到 N^2 范围?

【问题讨论】:

    标签: arrays algorithm sorting


    【解决方案1】:

    嗯,从技术上讲,c 有一个上限,因为你只能有这么多的反转(即N(N-1)/2)。

    该算法被推广为Nc 不是N 的函数,它是一个常数。您需要根据您的要求确定c。即使对于N 的某些值它是N^2 的数量级,它仍然是一个常数,并且对于更高的值将无法与N^2 相提并论。因此,一般来说没有办法限制c

    每当您想将c 提高到建议的N^2 订单以获得N 的特定值时,请执行此操作。然后保持c 不变并将N 提高几个数量级。然后享受将常数称为常数的奢侈,无论它有多大。

    更新

    将最大反转输入为N(N+1)/2 而不是N(N-1)/2。现已修复。

    【讨论】:

    • 感谢您对我的重复答案的评论!
    • 我更喜欢你的回答,因为我刚开始学习算法时,我更了解你的回答。 “您需要根据您的要求确定 c”这句话对我来说意味着没有一些固定的公式,而是您在查看上下文时决定的。
    【解决方案2】:

    随机排列中的预期反转次数为 ~n2 / 4(例如,参见 this question)。

    Sedgewick 的书涉及渐近复杂性,其中的想法是“事情开始按照足够大的尺寸规定的方式行事”。因此,即使从您的问题中获取较大的 c 值,c 也可以获得足够大的 n 值。

    然后你问小数组呢。问题是,你可以问这个领域的任何部分,而不仅仅是排列。比如基于比较的排序是Ω(n log(n)),而说对于某些具体的实现,正好是30 n log(n) + 400 .但是,对于足够小的 n 值,*30 n log(n) + 400

    【讨论】:

    • +1 因为这是分析性的,而且更好。我需要学习如何进行分析。我的下一个答案需要至少三打0s。
    • @galactocalypse 让你的答案中的 0 数量 Theta(n) 怎么样? :-)
    猜你喜欢
    • 2013-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-08
    • 2015-07-08
    • 1970-01-01
    • 2020-06-04
    • 2018-04-10
    相关资源
    最近更新 更多