微软面试百题005——SBT再解第K数问题

1.题目描述:

求一组数组中的第K大或者第k小的数

2.算法:

上一期我们通过了二叉堆来进行该问题的求解,非常的高效,我们通过O(n)就可以解决问题
这一期我们通过SBT来解决: SBT详解
我们通过SBT的select来解决问题会变得非常高效,如果不考虑剑术的时间,时间复杂度是O(logn),如果考虑建树是O(logn+n*logn)

附上select函数代码:
int SBT::select(int& p,int k)  //选择第k大的元素 
{
	if(size[left[p]]+1==k) return p;
	else
	{
		if(size[left[p]]+1<k) return select(right[p],k-size[left[p]]-1);
		else return select(left[p],k);
	}
}
SBT正因为有了size域,所以说在查找该问题方面会变的非常的快
当然这是查找第k小问题
如果是查找第k大问题,我们只要用O(1)求出数组长度
再用O(1):length-k就可以了,问题是没有变化的

一般的时候,我们都是不会考虑建树的时间的,这样的情况下,SBT的查找效率明显快于堆的操作

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值