算法设计第5次作业

题目如下:
Problem 1: DC for selecting the k-th smallest
For the given algorithm below 1 for selecting the k-th smallest from array, prove that
its average time complexity is Θ(n)
1 template T;
2 T QuickSelect (T a [ ] , int left , int right , int k )
3 {
4 if (right < left)
return a [left] ;
5 m=partition ( a , left , right ) ;
6 i f (m−left==k−1) return a [m] ;
7 else if (m−left >= k )
8 return QuickSelect (A, left , m ‒ 1 , k ) ;
9 else return QuickSelect (A,m+1,right , k ‒ (m+1 ‒ left ) ) ;
10 }
证明该算法的时间复杂度为Θ(n)
partion函数应该是二分
那么第一步 找到a[]中的中间的元素(利用一次快排),现在比m小的都在左边,比m大的都在右边。如果m-left = k-1,那么a[m]即是第k大的元素。如果m-left>=k,那么第k大的元素会在m的左边的数组里,那么递归调用(A,left,m-1,k);否则的话第k大的元素会在m右边的数组里,且为第k-(m+1-left)个大的元素,此时递归调用右边即可。
可见这个函数是个递归调用的函数,分析时间复杂度的关键在于partition函数
int partition(a,left,right){
j=left,i= a[j],x=right; // Θ(1)
while(j < x){
while(j < x && a[x]>i)
x–;
if(j < x ) swap(i,a[x])
while(j < x &&a[j] < i)
j++;
if(j < x)swap(i,a[j]);
}
这个函数复杂度为Θ(n)
T(n) = T(n/2) + cn
= T(n/4) + (1+1/2)cn

= T(1) + (2-1/n)cn
所以 T(n) = Θ(n)

猜你喜欢

转载自blog.csdn.net/l_searcing/article/details/80050096