Python算法——查找数组前三名

要求:

        在数组中找出前k大的值(如k=3)

分析:

       最大的三个数比数组中其他数都大,因此可以利用类似求最大值的方法求前三名,具体思路为:初始化前三名(r1:第一名,r2:第二名,r3:第三名)为最小整数,然后遍历数组:

(1)如果当前值tmp大于r1:r3=r2,r2=r1,r1=tmp;

(2)如果当前值tmp大于r2且不等于r1:r3=r2,r2=tmp;

(2)如果当前值tmp大于r3且不等于r2:r3=tmp;

代码实现:

# -*- coding:utf-8 -*-
def findTop3(arr):
    if arr == None or len(arr) < 3:
        print("参数不合法!")
        return
    r1 = r2 = r3 = -2**31
    i = 0
    while i < len(arr):
        if arr[i] > r1:
            r3 = r2
            r2 = r1
            r1 = arr[i]
        elif arr[i] > r2 and arr[i] != r1:
            r3 = r2
            r2 = arr[i]
        elif arr[i] > r3 and arr[i] != r2:
            r3 = arr[i]
        i += 1
    print("前三名分别为:"+str(r1)+","+str(r2)+","+str(r3))

if __name__ == "__main__":
    arr = [4,7,1,2,3,5,3,6,3,2]
    findTop3(arr)

      运行结果:

前三名分别为:7,6,5

性能分析:

       此方法虽可以在O(N)时间复杂度求出前三,但是当k取值很大时,这种方法就不是很好了。这时候可以维护一个大小为K的堆来保存最大的k个数,具体思路为:维护一个大小为k的小顶堆用来存储最大的k个数,堆顶保存了堆中最小的数,每次遍历一个数m,如果m比堆顶元素小,那么说明m肯定不是最大的k个数,因此,不需要调整堆,如果m比堆顶元素大,则用这个数替换堆顶元素,替换后重新调整为小顶堆。这种方法时间复杂度为O(N*log2k),适用于数据量大的情况。

 

 

你可能感兴趣的:(算法)