【问题标题】:how many operation is need for sorting?排序需要多少操作?
【发布时间】:2016-12-03 10:05:33
【问题描述】:

这是一道 2016 年入学考试题:

我们有 N 个重量不同且未知的球,标签为 1n。我们有一个两盘天平,想用它来成对称重这些球并将它们写在纸上,以便对所有这些球进行分类。 在最坏的情况下,需要多少次称重操作?选择最佳答案。

a) Ceil[ n log2 n ]
b) 楼层[ n log2 n ]
c) n − 1
d) Ceil[ log2 n! ]

根据答题卡,正确答案是:Ceil[ log2 n! ]

我的问题是:这个解决方案是如何实现的(这个算法是如何工作的,有没有伪代码?)?

【问题讨论】:

  • 你试过找出正确的答案是什么吗?您给出的解决方案也不是选择之一(尽管我认为是d))。
  • 我更正了对不起@Module
  • 没有一个可能的答案是正确的:答案 (d) 假设总是有一个算法在k 比较中排序,其中k 是满足2^k > n! 的最小整数。但还不清楚情况是否如此,OEIS sequence A036604 建议在n=12 的情况下需要30 比较,而在这种情况下ceil(log2(n!))29
  • 这个界限实际上是无法实现的。它只是渐近正确,但如果我们谈论渐近,那么 ceil 将是多余的,我们会看到大 O 表示法。
  • @user355834:有一个明显且错误的推理链导致了答案 (d),因此,无论是谁提出问题,似乎 预期 的答案都是 (d )。但无论如何,我认为这并不是最好的答案。特别是,(a)和(b)可能真实答案的实际上限,而(d)不是。

标签: algorithm sorting data-structures time-complexity decision-tree


【解决方案1】:

如果您查看 Number of Comparisons in Merge-Sort,您会发现我的回答是,合并排序(已知具有良好的渐近行为)的比较总数是

n ⌈log2 n⌉ − 2⌈log2 n⌉ + 1

当然 n ⌈log2 n⌉ = ⌈n log2 n⌉ 和 2⌈log2 n⌉ ≥ n 所以对于 n ≥ 1 这确认了答案 (a) 作为一个上限。

(b) 是更严格的上限吗?如果你写 ⌈log2 n⌉ = log2 n + d for some 0 ≤ d n (log2 n + d) - 2d n + 1 = n (log2 n + d - 2d) + 1 = (n log2 n) + n (d − 2d + 1/n)
如果你写 m := ⌈log2 n⌉ 和 n = 2m − d 最后一个括号变成 (d − 2d + 2d − m)。 Plotting this 对于某些 m 值表明,对于整数 m ≥ 1,这将 非常 可能为零。对于 n = 1,您得到 m = 0,这意味着 d = 0,因此整个括号变为零。因此,当您计算出证明的细节时,这将表明 (b) 确实是归并排序的上限。

(c) 怎么样? n = 3 有一个简单的反例。如果您知道球 1 比 2 轻且小于 3,这并不能告诉您如何对 2 和 3 进行排序。您可以证明您不能选择次优通过比较 1 与 2 和 3 的算法,由于问题的对称性,这是一种一般情况。所以 (c) 不是一个上限。它可以是一个下限吗?当然,即使要确认球已经订购,您也必须对每一对连续的球进行称重,从而进行 n − 1 次比较。即使使用最好的算法,你也不能比猜测正确的顺序然后确认你的猜测做得更好。

(d) 是更严格的下限吗? Plots 再次建议它至少与 (c) 一样大,但没有整数值的小区域除外。因此,如果它是一个下限,它会更紧。现在想想决策树。排序这 n 个球的每个算法都可以写成二叉决策树:您比较在给定节点中命名的两个球,并根据比较的结果继续执行两个可能的后续步骤之一。该决策树必须有 n!叶子,因为每个排列都必须是一个不同的叶子,所以一旦你到达叶子,你就知道确切的排列。和一棵有 n! 的二叉树!叶子的深度必须至少为 ⌈log2 n!⌉。所以是的,这也是一个下限。

总结所有这些,您有 (c) ≤ (d) ≤ x ≤ (b) ≤ (a),其中 x 表示最佳算法需要对所有球进行排序的比较次数。正如 Mark Dickinson 的评论所指出的,A036604 on OEIS 给出了一些 n 的明确下界,对于 n = 12,不等式 (d)

顺便说一句(并回答你的“这个算法是如何工作的”),找到给定 n 的最优算法相当容易,至少在理论上是这样:计算那些 n 的所有可能的决策树!排序,并选择一个深度最小的。当然,这种方法很快就会变得不切实际。

既然我们知道没有一个答案给出了最佳排序算法的正确计数,那么哪个答案是“最好的”?这在很大程度上取决于上下文。在许多应用中,知道最坏时间行为的上限比知道下限更有价值,因此 (b) 将优于 (d)。但显然,创建解决方案表的人有不同的意见,并选择了 (d),要么是因为它更接近最优值(我假设但尚未证明),要么是因为下限对手头的应用程序更有用.如果您愿意,您可能会质疑整个问题,理由是“最佳”在问题范围内没有得到充分定义。

【讨论】:

  • 很好的答案,我认为最坏的情况是什么,选择最好的答案,意思是下限,不是吗?
  • @user355834:我认为只有提出问题的人才能告诉你“最佳答案”是什么意思。
  • so 1) 如果我们认为答题纸是正确的,那么根据下限或至少更接近下限,'d' 是正确的,不是吗?你能给我小费吗? @MarkDickinson
  • 是的。最坏情况下的决策数 = 决策树的高度,决策树的高度 >= ceil(log2(叶子数)),这种情况下的叶子数是 n!。因此,对于任何(确定性)算法,ceil(log2(n!)) 是该算法的最坏情况加权操作计数的下限。但正如 MvG 指出的那样,最坏情况的下限并不是特别有用的东西:您通常需要一个上限。
  • 你确定 n ceil(log n) = ceil(n log n) 吗?一般来说,一个 ceil(b) != ceil(ab);例如,2 ceil(1.5) = 4 和 ceil(2 * 1.5) = 3。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-21
  • 1970-01-01
  • 2023-03-31
  • 1970-01-01
相关资源
最近更新 更多