微软面试百题005——SBT再解第K数问题
来源:互联网 发布:城市智能交通大数据 编辑:程序博客网 时间:2024/03/29 01:40
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的查找效率明显快于堆的操作
1 0
- 微软面试百题005——SBT再解第K数问题
- 微软面试百题005——堆实现求前k大/小的数
- 微软面试百题011——找数
- 微软面试:k-th string
- 电话面试----关于前k个最小数的问题
- 微软面试百题006——八皇后变种
- 微软面试百题007——链表相交
- (微软面试100题)查找最小的K个元素
- 微软面试100题—自做
- 微软面试 第四题 路径和问题
- 递归-微软面试100题-台阶问题
- 微软面试问题
- microsoft微软——面试
- 寻找丑数 【微软面试100题 第六十四题】
- 面试算法——寻找第K大的数(快速排序的应用)
- 微软面试100题——第一题
- 微软面试中的怪问题
- 微软面试飞机加油问题
- binary
- 类似微博那种局部TableView
- 数值分析:矩阵求逆-奇异性、条件数
- 关于ARM的统一编制与内存映射机制
- ListView和Adapter Crash问题的分析和解决
- 微软面试百题005——SBT再解第K数问题
- 通过socket登陆MySQL
- 【Python】|JSON序列化与反序列化
- jquery change()时间
- 数据结构与算法题目集(中文)4-10 二分查找 (20分)
- android中的mvp模式(二)
- c++ 函数模板 类模板
- (*(volatile unsigned long *) 地址)
- Canvas裁剪和Region、RegionIterator