9-29算法实验报告
1. 随机时间选择-求算法复杂度
给定线性序集中n个元素和一个整数k,1≤k≤n,要求找出这n个元素中第k小的元素
template<class Type>
Type RandomizedSelect(Type a[],int low,int high,int k)
{
if (low==k) return a[p];
int i=RandomizedPartition(a,low,high),
j=i-low+1;
if (k<=j) return RandomizedSelect(a,low,i,k);
else return RandomizedSelect(a,i+1,high,k-j);
}
在最坏情况下,算法randomizedSelect需要O(n2)计算时间
但可以证明,算法randomizedSelect可以在O(n)平均时间内找出n个输入元素中的第k小元素。现求该算法的时间复杂度。
解:
设 T(n) 为RandomizedSelect 算法在输入 a[p…r] 时的运行时间。
又因为该算法为随机算法,所以 T(n) 为随机变量。
RandomizedPartition 以等概率返回任一元素作枢纽元素。因此,对于满足 1 <= i <= n
的每个 i,子数组 a[p…i]有 i 个元素都小于等于枢纽元素的概率为 1/n。对于 i = 1,2…n ,定义随机变量 Xi
X i = { 子 数 组 a [ p . . . r ] 只 有 i 个 元 素 且 E [ X i ] = 1 n } X_i = \{子数组a[p...r] 只有 i 个元素 且 E[X_i]=\frac{1}{n}\} Xi={
子数组a[p...r]只有i个元素且E[Xi]=n1}
假设 T (n) 单调递增,分析在最大可能输入的情况下递归调用所用的时间,即得到一个上界。第 k 个元素总是在具有最大个数的那个划分中。对于给定的调用RandomizedSelect,指示器随机变量 Xi 在只有一个 i 值时为 1;其他所有 i 值时则为 0。当 Xi=1 时,设递归调用的两个子数组大小分别为 i-1 和 n-i 。因此,递归方程为
T ( n ) ≤ ∑ i = 1 n X i ( T ( m a x ( i − 1 , n − i ) ) + O ( n ) ) = ∑ i = 1 n ( X i ∗ T ( m a x ( i − 1 , n − i ) ) + O ( n ) ) T(n) \leq \sum^{n}_{i=1} X_i(T(max(i-1,n-i)) + O(n)) \\ = \sum^{n}_{i=1}(X_i*T(max(i-1,n-i))+O(n)) T(n)≤i=1∑nXi(T(max(i−1,n−i))+O(n))=i=1∑n(Xi∗T(max(i−1,n−i))+O(n))
两边同时取期望,得:
E [ T ( n ) ] ≤ E [ ∑ i = 1 n ( X i ∗ T ( m a x ( i − 1 , n − i ) ) + O ( n ) ) ] = ∑ i = 1 n 1 n E [ T ( m a x ( i − 1 , n − i ) ) ] + O ( n ) E[T(n)] \leq E[\sum^{n}_{i=1}(X_i*T(max(i-1,n-i))+O(n))]\\ = \sum^{n}_{i=1}\frac{1}{n}E[T(max(i-1,n-i))]+O(n) E[T(n)]≤E[i=1∑n(Xi∗T(max(i−1,n−i))+O(n))]=i=1∑n