我从The Design and Analysis of Computer Algorithms", by Aho, Hopcroft, Ullman, Addison-Wesley
这本书中读取了订单统计数据
算法3.6。查找第k个最小元素
步骤如下:
procedure SELECT(k, S):
1. if |S| < 50 then
begin
2. sort S:
3. return kth smallest element in S
end
else
begin
4. divide S into L|S|/5 J sequences of 5 elements each *lower bound*
5. with up to four leftover elements:
6. sort each 5-element sequence;
7. let M be the sequence of medians of the 5-element sets;
8. m <- SELECT(||M|/2|, M); *Upper bound*
9. let S1, S2 , and S3 be the sequences of elements in S less
than, equal to, and greater than' m, respectively;
10. if |S_1|>= k then return SELECT(k_1, S_1)
else ,
11. if (|S_1| + |S_2| >= k) then return m
12. else return SELECT(k- |S_1| - |S_2|, S_3)
end
第1行。为什么我们要考虑50美元?If |S|>这个算法是50个工作的呢?
在第4行,为什么我们划分|S|/5?如果我们除以|S|/4或|S|/6呢?
如果有人能澄清我的疑问,那将是很大的帮助。谢谢你。长版:我建议你阅读Introduction to Algorithms(Cormen), 3rd edition, Section 9.3,在那里他们详细解释了在最坏情况下的线性时间选择(你可以在那里找到数学)。
短版:关于为什么要选|S| <50可以看作是一个任意的数字。选择这种方式是为了满足函数的大O计算(如n0),根据步骤4的分割大小(当前大小为5,但可以是4,6,如您所述或任何其他固定的正数,它将在大O计算中显示为常数T(n) <= T(n/5) + T(7n/10 + 6) + O(n)[来自算法介绍])。