我发现strand sort非常有吸引力,可以在常量空间中对单个链表进行排序,因为它比例如插入排序要快得多。
我知道为什么在最好的情况下(列表已经排序)是O(n)
而在最坏的情况下是O(n^2)
(列表是反向排序的)。但为什么O(n sqrt n)
在一般情况下呢?如果算法不是基于二分法并且具有多项式最佳情况和最差情况性能,则平均情况是O(n^m)
,其中m
是最佳情况和最坏情况指数的算术平均值({ {1}},m = (1 + 2) / 2 = 3/2
)?
答案 0 :(得分:3)
对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)。
答案 1 :(得分:0)
在您链接到的Wikipedia页面上,平均案例性能为O(n lg n),并引用此Stack Overflow页面。这很奇怪,因为在这个页面上没有任何地方可以这么说。
无论如何,为了进一步说明Ulrich的观点,平均案例分析很复杂,因为它必须考虑数据的平均表示方式,这不是一件容易的事。
来自维基百科:
确定平均输入意味着什么是困难的,并且通常平均输入具有使得难以用数学表征的特性(例如,考虑设计用于对文本串进行操作的算法)。类似地,即使对特定“平均情况”(可能仅适用于算法的某些用途)的合理描述是可能的,它们往往会导致更难以分析的方程式。