您的位置:首页 > 编程语言 > Python开发

【Python】求数组(list)中最大的X个数,不递归,尽可能减少代码量

2015-11-21 16:47 645 查看
在Python中求数组中最大值、最小值直接有max(list),min(list)这个没什么好说的, 就算不知道有这个封装好的方法,直接用C语言那种求一个数组的最大值、最小值也是没问题的。然而,求数组(list)中最大的X个数,这就麻烦大了,这涉及了所谓的TOP-K算法。网上对于TOP-K算法的解决主要有快速排序与堆的处理,个人认为这都不是好方法。这两个方法,时间复杂度、空间复杂度绝对是传世经典,然而,其中的代码过于复杂,一个小小的求数组(list)中最大的X个数,这么简单的功能,写这么长的代码。

个人认为一来不好记,二来不好扩展。下面推荐一种自己写的,一种时间复杂度最好情况为O(n),最坏情况为O(k^2n)的求数组(list)中最大的X个数,空间复杂度为k的算法。当然,这不是重点,如下图,一个千万级别的数组,3.8s能够找到最大的10个数,我认为这种耗时,完全在可操作范围,最重要的,我认为代码短是重点。



具体代码如下,我们先用Python的洗牌算法,搞一个1-100乱序的数组,需要找到最大的10个数,显然是91-100,然而此数组是乱序的,所以怎么找到其中的91-100就是本文研究的问题:

#-*-coding:utf-8-*-
import random
#产生一个1-100的数组,并且打乱顺序
k=10;
arraylist=[];
for i in range(1,101):
arraylist.append(i);
random.shuffle(arraylist);
print arraylist;

#求其中的最大的10个数
maxlist=[];#最大值数组(TopK数组),也就是最后的结果存放地方
for i in range(0,k):#先将目标数组前10个数放到TopK数组
maxlist.append(arraylist[i]);
maxlist.sort(cmp=None, key=None, reverse=True);#对这个存有10个最大值数组(TopK数组)进行降序排序

for i in range(k,len(arraylist)):#对目标数组之后的数字
if arraylist[i]>maxlist[k-1]:#如果你大于最大值数组(TopK数组)的最后一个数,因为进行过排序,也就是其中的最小值
maxlist.pop();#那最大值数组(TopK数组)最后一个数,因为进行过排序,也就是其中的最小值滚出
maxlist.append(arraylist[i]);#那你这个数就进入这个最大值数组(TopK数组)
maxlist.sort(cmp=None, key=None, reverse=True);#之后,我们再对最大值数组(TopK数组)进行降序排序

print maxlist;

最终的运行结果如下:



上面打印的,确实是打乱了的一个从1-100的数组,

最终找出来的数确实是100-91。

而且上面对于最大值数组(TopK数组)进行降序排序也不是每一个数都触发,因此耗时是处于接受范围的。关键是,对比于网上的什么推排序、快速排序,反正我数据结构不好,记不住,难以理解~更关键的是,这些算法用到递归就好了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: