今日是今日毕
今天需要学习内容
- 手写快速选择算法
- 手写最大堆数据结构
A. 快速选择算法
A.1 对应问题
前k大/小数字,第k大/小数字。
A.2 算法原理及步骤
举例:
输入对于未知顺序的数组arr{0,2,...,n-1}
输出第k小数字
- 初始化
l=0,r=arr.length-1,index=k-1 - 对
arr[l~r]数组进行随机划分,返回索引q,满足arr[l~q-1]<=a[q]<=arr[q+1~r] - 对返回值
q进行判断:
若q=index,执行步骤4
若q>index,说明第k小数字在l~q-1中,更新r=q-1,重复步骤2
若q<index,说明第k小数字在q+1~r中,更新l=q+1,重复步骤2 - 输出
arr[index]
A.3 伪代码
-
quickSelect()Inputdata arrayarr{},intleft,intright,intindex
Outputdataarr[index]- get initial: left=arr.begin, right=arr.end(), index=k // only for the first function call
- index_r $\leftarrow$ randomPartition(arr{},left,right)
- if index_r $\leq$ index,then:
right $\leftarrow$ index_r - 1
return quickSelect(arr{},left,right,index)
else if index_r $\leq$ index, then
left $\leftarrow$ index_r + 1
return quickSelect(arr{},left,right,index)
else if index_r $=$ index, then
return arr[index]
randomPartition()
输入数组arr{},左索引left,右索引right
输出数值arr[index]partition()
A.4 复杂度计算
期望复杂度为O(n),空间复杂度O(log(n))
A.5 C++代码
B. 最大堆数据结构
B.1 对应问题
前k大/小数字,第k大/小数字。