大数据算法的课程笔记,包括四种中值搜索算法。包括最简单的先搜索后检索,平均算法复杂度为O(N)的简单随机选取算法,确定性的中值的中值算法,大概率返回中值的one pass算法。
1. 最简单的方法:先排序再返回中值
排序算法是 O(NlogN) ,返回中值是 O(1) 。
整体算法复杂度是 O(NlogN) 。
2. 随机选取算法:RANDOM SELECT
算法简单,并且平均和最好的时间复杂度为 O(N) ,最差的时间复杂度是 O(N2) 。
2.1. 算法
算法的目的是寻找长度为 N 的序列array的第
具体的操作是随机选取一个数字,然后将序列分为比其小和比其大的两个序列,然后递归。
def find_kth_number(array,N,k):
if N < 5:
sort(array)
return array[k]
index = random_pick_from(0...N)
divide the array into array_L and array_R, where
for al in array_L, al <= array[index]
for ar in array_R, ar > array[index]
array_L + array_R + {array[index]} = array
if |array_L| > k
return find_kth_number(array_L,|array_L|,k)
else
return find_kth_number(array_R,|array_R|,k-|array_L|-1)
2.2. 算法复杂性
先给出结论: T(N)=O(N) 。注意这个是平均值,即 T(N) 的期望。接下来采用两种证明方式对其进行证明:
2.2.1. 课上方法:直接通过公式推算
从上面的算法可以得到如下公式:
T(N,k)=O(N)+1N∑i=0kT(N−i−1,k−i−1)+1N∑i=k+1NT(i,k)
设 T(N)=maxkT(N,k)=T(N,N/2) ,则有
T(N)≤O(N)+2N∑i=N2+1NT(i)
假设 T(n)≤Cn for all n<N ,则有
T(N)≤O(N)+2N∗N2∗C34N<