算法:线性时间选择

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]iE[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=1nXi(T(max(i1,ni))+O(n))=i=1n(XiT(max(i1,ni))+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=1n(XiT(max(i1,ni))+O(n))]=i=1n

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值