笔试中遇到的一些算法问题
算法:删除一个字符串中的数字。
从n个数中取出m个最大的最好的算法是什么?
有很多算法,复杂度也不尽相同。以下简单举几个例子:
1. n×m遍扫描
【算法基本描述】n×m遍扫描
【算法思想】每次都扫描一遍数组,取出最大元素,这样扫描m遍就能得到m个最大的数
【算法复杂度】O(nm)
2.排序后取最大m个数
【算法基本描述】对n个数排序,对拍完序后的序列取m个最大的数
【算法复杂度】视排序的复杂度,一般为O(nlogn)或O(n^2)
3.最小堆
【算法基本描述】一遍扫描+最小堆
【算法伪代码】
00-建立一个最小堆(优先队列),最小堆的大小控制在m之内
01-for 每个数:
02-----if 这个数比最小堆的堆顶元素大:
03---------弹出最小堆的最小元素
04---------把这个数插入到最小堆
05-最小堆中的m个元素就是所要求的元素
06-其中最小堆的作用就是保持里面始终有m个最大元素,且m个元素中最小的元素在堆顶。
【算法复杂度】O(nlogm) 遍历O(n) 最小堆O(logm)
【其他】如果要求n个数中取最小的m个,只要把算法反一下即可
总结:当n与m差不多大时,采用复杂度较低的排序是比较可取的,因为简单。当m<<n时,排序是很浪费时间的,因为我们不需要后(n-m)个数,所以可以采用最小堆的方法。
我不敢说我的算法是最好的,但是它一定是一个复杂度较低的算法。
最小堆图片:
如果你喜欢本文, 请长按二维码,关注公众号 分布式编程.
作者:分布式编程
出处:https://zthinker.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。