【问题标题】:Why is strand sort O(n sqrt n) in the average case?为什么在平均情况下链排序 O(n sqrt n)?
【发布时间】:2011-06-02 13:28:36
【问题描述】:

我发现strand sort 在恒定空间中对单链表进行排序非常有吸引力,因为它比插入排序要快得多。

我明白为什么它在最好的情况下是O(n)(列表已经排序)而在最坏的情况下是O(n^2)(列表是反向排序的)。但是为什么在一般情况下O(n sqrt n)?如果算法不是基于二分法并且具有多项式的最佳情况和最坏情况性能,那么平均情况就是O(n^m),其中m 是最佳情况和最坏情况指数的算术平均值(m = (1 + 2) / 2 = 3/2,@ 987654328@)?

【问题讨论】:

  • 看这个问题。我也想知道它是如何'n sqrt(n)'
  • 不,平均情况分析通常要复杂得多。 (例如,困难的情况可能很少见或很常见。)
  • Comb Sort 应该能够以 O(n log n) 时间复杂度对常数空间中的单链表进行排序。
  • 普通的旧合并排序对链表使用 O(1) 空间(与需要 O(n) 工作空间的数组不同)。当然是 O(n log n)。您还可以在链表上使用快速排序,它需要 O(log n) 堆栈空间并且具有 O(n^2) 最坏情况,但只有 O(n log n) 最佳和平均情况复杂度。
  • @j_random_hacker 感谢您指出合并排序可以使用 O(1) 空间来实现列表。

标签: algorithm sorting complexity-theory time-complexity


【解决方案1】:

在您链接到的 Wikipedia 页面上,平均案例性能为 O(n lg n),并引用了此 Stack Overflow 页面。这很奇怪,因为这个页面上没有任何地方这么说。

无论如何,为了进一步说明 Ulrich 的说法,平均案例分析很复杂,因为它必须考虑数据的平均表示方式,这并非易事。

来自维基百科:

确定平均输入的含义很困难,而且通常平均输入具有难以从数学上表征的特性(例如,设计用于对文本字符串进行操作的算法)。同样,即使可以对特定的“平均情况”(可能仅适用于算法的某些用途)进行合理的描述,它们也往往会导致更难以分析方程。

【讨论】:

  • 对于比较排序算法,“平均复杂度”是指比较次数的预期值,对于作为输入的均匀随机排列。这是完美定义的,但可能很难计算。比预期值更有趣的是比较次数定律。
  • 真的吗?我不认为平均情况分析使用随机排列。它更多地基于情境输入。
  • 视情况而定。例如,在 CLR(S) 中,快速排序的平均案例性能首先通过选择直观的“坏”案例并显示它具有 O(n lg n) 性能来讨论。随后进行严格的分析,确定在某些假设下的预期性能。
  • “情境”意味着任意的、主观的和计算上难以处理的。幸运的是,这不是“平均”的意思:请参阅 en.wikipedia.org/wiki/Average-case_complexity:“平均案例复杂度是计算复杂度理论的一个子领域,它研究随机输入上算法的复杂性。”
【解决方案2】:

链排序的原始引用是http://groups.google.com/group/fido7.ru.algorithms/msg/26084cdb04008ab3 ...据此,它是 O(n^2)。链排序是作为 J 排序的一个组成部分提出的,它声称是 O(n lg n)。平均复杂度为 O(n^2) 是有道理的,因为在随机数据中,一半的链长度为 1,并且 O((n/2)^2) = O(n^2)。

【讨论】:

  • 感谢您的资源。平均随机输入中的一半链长度为 1 对我来说似乎不正确。至少根据维基百科的定义,串不必是连续的。因此,对于一个链来说,长度为 one 意味着它的第一个元素大于所有尚未被一条链消耗的后续元素,但不会大到已经成为另一条链本身的尾部。
  • 你是对的,股线不必是连续的——我误读了参考资料。我将不得不重新考虑复杂性问题,但参考确实表明它是 n 平方的。
猜你喜欢
  • 2013-06-07
  • 2011-12-09
  • 1970-01-01
  • 2019-11-19
  • 2020-09-26
  • 1970-01-01
  • 2012-07-13
  • 2021-06-12
  • 2020-12-05
相关资源
最近更新 更多