关闭

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

标签: PythonTopK最值算法排序
2379人阅读 评论(1) 收藏 举报
分类:

在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数组)进行降序排序也不是每一个数都触发,因此耗时是处于接受范围的。关键是,对比于网上的什么推排序、快速排序,反正我数据结构不好,记不住,难以理解~更关键的是,这些算法用到递归就好了。


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:1227966次
    • 积分:19587
    • 等级:
    • 排名:第427名
    • 原创:719篇
    • 转载:0篇
    • 译文:0篇
    • 评论:290条
    文章分类
    【备注】博文GIF动画的录制方法
    先用屏幕录制软件Freez Screen Video Capture录制屏幕,再把得到的AVI,利用GIF Movie Gear转化成GIF
    【友情链接】亲笔小说