【问题标题】:Reduction for positive number sorting task to prove nlogn complexity减少正数排序任务以证明 nlogn 复杂性
【发布时间】:2016-02-11 12:38:01
【问题描述】:

事实证明,基于比较的排序具有复杂性T(n)=nlogn。因此,如果我们有正整数数组(不是特定的,因此无法应用 countingradix 排序)如何确定从 SortSortPositiveNumbers 的适当减少(例如)以证明有是多项式和正确的变换,SortPositiveNumbers 也有 nlogn 的下限?

任何帮助将不胜感激。

【问题讨论】:

  • VtC 太宽泛了。或许 CS.SE 会帮你做作业……
  • 这不是作业。但考试准备的任务。

标签: algorithm sorting time-complexity reduction


【解决方案1】:

我们可以使用以下伪代码将 Sort 简化为 SortPositiveNumbers:

Sort(A[1..n])
   B[1..n]
   p <- n+1
   s <- 0
   for k <- 1 to n
       if A[k] > 0
          p <- p-1
          B[p] <- A[k]
       else if A[k] < 0
          s <- s+1
          B[s] <- -A[k]

   SortPositiveNumbers(B[1...s])
   SortPositiveNumbers(B[p...n])

   for k <- 1 to s
       A[k] <- -B[s+1-k]
   for k <- s+1 to p-1
      A[k] <- 0
   for k <-p to n
      A[k] <- B[k]

这里的归约是线性的(2n),所以它是多项式的,它是正确的,因为它使用 SortPositiveNumbers 仅对 A 中的正数进行排序(负数转换为正数),最后归约再次将正数转换为负数并将它们相加进入排序数组所需的索引。

【讨论】:

    【解决方案2】:

    假设您可以对复杂的正数进行排序C' &lt; nlogn。然后我可以通过将任意数组分成正数和负数 (O(N)) 将负数转换为正数 (O(N)) 对两个数组进行排序 (O(C') 乘以 2 来对它们进行排序,但这并不重要复杂度),反转负数组 O(N) 并连接两个数组 (O(N))。因此,即使总体而言,复杂度也是 O(N + C')(即 O(N) 和 O(C') 之间的最大值)。这低于nlogn,您已证明这是对任意数组进行排序的最低复杂度。这是一个矛盾,因此最初的假设(我们所做的唯一假设)是错误的。也就是说,有一种复杂度小于 nlogn 的 co 算法用于对正数进行排序。

    【讨论】:

      猜你喜欢
      • 2022-01-17
      • 2017-12-19
      • 2020-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-14
      相关资源
      最近更新 更多