【问题标题】:What is the lowest bound for the algorithm?算法的最低界限是多少?
【发布时间】:2015-02-16 17:43:16
【问题描述】:

让一个算法得到大小为n 的未排序数组。让一个号码k<=n。该算法打印从 1 到 k(升序)的 k 最小数字。算法的下限是多少(对于每个 k)?

  1. Omega(n)
  2. Omega(k*logn)
  3. Omega(n*logk)
  4. Omega(n*logn)
  5. #1,#2 都正确。

现在,据我了解,如果我们想找到算法的下限,我们需要查看最坏的情况。如果是这样,那么显然最坏的情况是k=n。我们知道对数组进行排序以Omega(nlogn) 为界,因此正确答案是#4。

很遗憾,我错了,正确答案是#5。

为什么?

【问题讨论】:

  • 我认为您将 Big OmegaBig O 混淆了。 Omega(...) 表示算法在最佳情况下运行得那么快,而不是最坏情况。
  • 观察 #1:对于每个k,算法都可以在Omega(n) 中运行,这是不正确的。例如,k=n 表示我们实际上是在对一个数组进行排序,并且以Omega(nlogn) 为边界。
  • @Jon Omega(...) 表示算法在最好的情况下运行得这么快,而不是最坏的情况。 这是不正确的。 Big Omega 说明了一个函数渐近地被另一个函数限制在下面,但这个概念同样适用于任何类型的渐近(最佳、最坏情况、平均等)。换句话说,Big O 和 Big Omega 与复杂性类型完全正交。
  • @AlonAlon Omega 是渐近下界,因此 n*logn 也是 Omega(n)。
  • @Jon 有最坏情况下的大欧米茄边界和最好情况下的大 O 边界。 O 与 Omega 指定曲线从哪一侧渐近有界,而不是在何种情况下该界限有效/实现。

标签: arrays algorithm sorting data-structures time-complexity


【解决方案1】:

可以在O(n + klogk)完成。

  • 运行选择算法以找到第 k 个最小元素 - O(n)
  • 迭代并返回低于/等于 k ​​- O(n) 的元素
  • 如果数组允许,可能需要再次迭代 重复,但仍然在 O(n) 中完成
  • 最后,您需要对O(klogk) 中的这些元素进行排序

很容易看出这个解决方案是最优的 - 不能比O(klogk) 因子更好,因为否则分配 k=n 您可以更好地对任何数组进行排序,并且至少必须进行线性扫描才能找到所需的元素打印出来。

【讨论】:

  • k个数字需要排序,所以如果只允许进行比较,就需要更多的时间了。
  • @interjay 错过了必须排序的数组部分。让我添加它。
  • @amit,我理解你的分析。但是,我不明白为什么答案是#5。你能解释一下吗?
  • 其实klogk排序是针对使用比较的排序算法。我相信正确的答案是一个,因为对于k 的每种组合,我们都需要Omega(n) 操作。有了k = 1,我们就需要这么多。
  • @AlonAlon 我不知道 Omega(klogn) 和 Omega(n) 是什么意思,它们的意思是 Omega(n + klogn) - 如果是这样,这是不正确的,因为我们找到了一个不在此的答案复杂度类
【解决方案2】:

让我们试试线性时间

  1. 为了找到第 k 个最小的元素,我们必须使用平均运行时间为 O(n) 的“随机选择”。并使用该元素作为快速排序的枢纽。
  2. 使用快速排序方法拆分array[i] <= karray[i]>k。这需要O(n) 时间
  3. 取未排序的左边array[i]<=k(有k个元素)并进行计数排序,显然需要O(k+K)
  4. 最后打印操作将占用O(k)

总时间 = O(n)+O(k+K)+O(k) = O(n+k+K)

这里,k是小于或等于K的元素个数

【讨论】:

  • 至少有一种算法允许点 1. - 它不是快速排序,其经典形式是 O(n²)。
  • @greybeard 快速排序的最坏情况是O(n^2),而预期的情况是O(nlogn),众所周知,如果我们使用快速排序对数组进行完全排序。但是只需一次迭代就足以将数组拆分为 2 以在一侧获得较小的元素而在另一侧获得较大的元素。所以运行一步快速排序的时间是Θ(n)
  • 你怎么知道k(因为你在回答中使用它,这与问题中介绍的方式不同)?
  • @greybeard 对答案进行了必要的编辑。它仍然可以用线性时间完成。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-27
  • 2011-01-01
  • 2011-02-09
  • 1970-01-01
相关资源
最近更新 更多