������S��
����ҳ�һ��Ԫ��X���������Ϊ������Sa��Sb��Sa�е�Ԫ�ش��ڵ���X��Sb��Ԫ��С��X����ʱ�����������
1. Sa��Ԫ�صĸ���С��k����Sb�еĵ�k-|Sa|��Ԫ�ؼ�Ϊ��k����
2. Sa��Ԫ�صĸ�����ڵ���k����Sa�еĵ�k��
��
有个问题是:从一个无序的数组里面找出第k大的数。
对于这个问题,除了用堆解决之外,有一种用快排的思想的解法,如下:
从数组S中 随机找出一个元素X,把数组分为两部分Sa和Sb。Sa中的元素大于等于X,Sb中元素小于X。这时有两种情况:
这样递归下去,最终不用把整个数组排序就可以找到第k大数。
1. Sa中元素的个数小于k,则Sb中的第k-|Sa|个元素即为第k大数;
2. Sa中元素的个数大于等于k,则返回Sa中的第k大 数。
问题是,如何计算这种算法的平均时间复杂度?简单分析一下,把数组分2部分这种partition操作平均情况下要log(n)次。
每个partition需要移动的元素个数这个不好算,平均第一次是n个,第二次是 n/2 个。
那么,总的平均时间复杂度怎么算呢?
有个问题是:从一个无序的数组里面找出第k大的数。
对于这个问题,除了用堆解决之外,有一种用快排的思想的解法,如下:
从数组S中 随机找出一个元素X,把数组分为两部分Sa和Sb。Sa中的元素大于等于X,Sb中元素小于X。这时有两种情况:
这样递归下去,最终不用把整个数组排序就可以找到第k大数。
1. Sa中元素的个数小于k,则Sb中的第k-|Sa|个元素即为第k大数;
2. Sa中元素的个数大于等于k,则返回Sa中的第k大 数。
问题是,如何计算这种算法的平均时间复杂度?简单分析一下,把数组分2部分这种partition操作平均情况下要log(n)次。
每个partition需要移动的元素个数这个不好算,平均第一次是n个,第二次是 n/2 个。
那么,总的平均时间复杂度怎么算呢?
嗯,就是O(N),而且那个证明过特BT。。。我还写过一个泛型版的linear_selection。但是注意一个限制,原始数据得无重复,否则CLRS上那个算法(LZ的也一样)是得不到正确结果的。
有个问题是:从一个无序的数组里面找出第k大的数。
对于这个问题,除了用堆解决之外,有一种用快排的思想的解法,如下:
从数组S中 随机找出一个元素X,把数组分为两部分Sa和Sb。Sa中的元素大于等于X,Sb中元素小于X。这时有两种情况:
这样递归下去,最终不用把整个数组排序就可以找到第k大数。
1. Sa中元素的个数小于k,则Sb中的第k-|Sa|个元素即为第k大数;
2. Sa中元素的个数大于等于k,则返回Sa中的第k大 数。
问题是,如何计算这种算法的平均时间复杂度?简单分析一下,把数组分2部分这种partition操作平均情况下要log(n)次。
每个partition需要移动的元素个数这个不好算,平均第一次是n个,第二次是 n/2 个。
那么,总的平均时间复杂度怎么算呢?