首页 文章

为什么在一般情况下,链排序为O(n sqrt n)?

提问于
浏览
6

我发现strand sort非常有吸引力,可以在常量空间中对单个链表进行排序,因为它比例如插入排序要快得多 .

我知道为什么它是 O(n) 在最好的情况下(列表已经排序)和 O(n^2) 在最坏的情况下(列表反向排序) . 但为什么 O(n sqrt n) 在平均情况下呢?如果算法不是基于二分法并且具有多项式最佳情况和最差情况性能,那么平均情况是 O(n^m) ,其中 m 是最佳情况的算术平均值's and worst-case' s指数( m = (1 + 2) / 2 = 3/2O(n sqrt n) = O(n^(3/2)) )?

2 回答

  • 0

    对Strand排序的原始引用是http://groups.google.com/group/fido7.ru.algorithms/msg/26084cdb04008ab3 ...根据它,它是O(n ^ 2) . Strand sort作为J sort的一个组件呈现,它声称是O(n lg n) . 平均复杂度为O(n ^ 2)是有意义的,因为在随机数据中,一半的线将具有长度1,并且O((n / 2)^ 2)= O(n ^ 2) .

  • 3

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

    无论如何,为了进一步说明Ulrich的观点,平均案例分析很复杂,因为它必须考虑数据的平均表示方式,这不是微不足道的 .

    From Wikipedia:

    确定平均输入意味着什么是困难的,并且通常平均输入具有使得难以用数学表征的特性(例如,考虑设计用于对文本串进行操作的算法) . 类似地,即使对特定“平均情况”(可能仅适用于算法的某些用途)的合理描述是可能的,它们往往会导致更难以分析的方程式 .

相关问题