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

本文介绍了一种在Python中求解数组中最大K个数的简单算法,通过洗牌数组和动态维护Top-K数组的方法,时间复杂度在最优情况下为O(n),适用于大规模数据。与快速排序和堆排序相比,代码更短易懂,适合扩展。
摘要由CSDN通过智能技术生成

在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个数,我认为这种耗时,完全在可操作范围,最重要的,我认为代码短是重点。

26c6aa12c9c98a5da8045d89f5c8f504.png

具体代码如下,我们先用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;

最终的运行结果如下:

a22f6246b178b35906fc39af7b94af43.png

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

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

而且上面对于最大值数组(TopK数组)进行降序排序也不是每一个数都触发,因此耗时是处于接受范围的。关键是,对比于网上的什么推排序、快速排序,反正我数据结构不好,记不住,难以理解~更关键的是,这些算法用到递归就好了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值