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

原创 2015年11月21日 16:47:54

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


版权声明:本文为博主原创文章,未经博主允许,欢迎随意转载,标好作者+原文地址就可以了!感谢欣赏!觉得好请回个贴!

相关文章推荐

如何寻找数组中的最大值和最小值

以下五种解法可以寻找到数组中的最大值和最小值; 1)问题分解法。     把本题看做两个独立的问题,而非一个问题,所以,每次分别找出最小值和最大值即可,此时,一共需要遍历两次数组,比较次数为2N次...

Numpy中找出array中最大值所对应的行和列

Python特别灵活,肯定方法不止一种,这里介绍一种我觉得比较简单的方法。 如下图,使用x == np.max(x) 获得一个掩模矩阵,然后使用where方法即可返回最大值对应的行和列。 wher...

numpy找出array中的最大值,最小值

在python中利用numpy创建一个array, 然后我们想获取array的最大值,最小值。可以使用一下方法: 一、创建数组 这样就可以获得一个array的最大值和最小值了。 并且可以利用np....

python寻找list中最大值、最小值并返回其所在位置

c = [-10,-5,0,5,3,10,15,-20,25] print c.index(min(c))  # 返回最小值 print c.index(max(c)) # 返...

python找出数组中第2大的数字

题目比较简单直接看实现即可,具体的注释在代码中都有: #!usr/bin/env python #encoding:utf-8 ''' __Author__:沂水寒城 功能:找出数组中第2...

python list最小值,位置,最小几个值

用过python很多次,结果每次写程序都需要去google,因为根本不认真记python的相关命令,于是乎开这个python板块,给自己做一些笔记,也加深自己对代码的理解与记忆! 首先,对于一个li...

python 找出序列中出现次数最多的元素方法。

怎样找出一个序列中出现次数最多的元素呢?1:超极简单的方法from collections import Counterwords = [ 'look', 'into', 'my', 'eye...

寻找一个数组中的最大和最小数

工作一段快两年了,感觉之前学的数据结构和算法基本忘得差不多了,最近一段时间准备复习一下相关知识。有一个求数组中最大和最小数的题目,基本的思路是遍历一遍数组,然后每个一个元素都和最大值和最小值比较,时间...

旋转数组的最小数字 python

题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个...

从一个数组里面获取最大的几个数字代码实现

从一个数组里面获取最大的n个算法思路 首先获取前n个数字,进行排序,之后遍历原数组,与新数组中最小的进行比较,如果大于新数组中的最小值,则进行替换,并将新数组再次排序,一次类推 go语言实现 pa...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【Python】求数组(list)中最大的X个数,不递归,尽可能减少代码量
举报原因:
原因补充:

(最多只允许输入30个字)