Top K问题用Python求解

用Python写的Top K问题,一种是对N个数据直接排序,然后取出其最大的K个数。复杂度为N*logN。

一种是通过保留K个数的槽,然后不断去N个数中取数,如果取出的数比K个槽中的数的最小值要大,那么就替换这个最小值。所以时间复杂度为N*logK.以下为时间。

复杂度 N*logk N*logN
1W 0.0049101173134 0.00381023735085
10W 0.0173171225053 0.0491447920128
100W 0.125165655521 0.928009178781
1000W 1.51472073013 12.1190111173

K等于100


  
  
#coding=utf-8 ''' Created on Sep 21, 2015 @author: haoyifen ''' import time import random def left(i):     return 2*i+1 def right(i):     return 2*i+2 def min_heapify(a,heap_size,i):     l=left(i)     r=right(i)     if l<heap_size and a[l]<a[i] :         least=l     else:         least=i     if r<heap_size and  a[r]<a[least]:         least=r     if least!=i:         a[i],a[least]=a[least],a[i]         min_heapify(a, heap_size, least) def build_min_heap(a,heap_size):     for i in range((heap_size-1)/2,-1,-1):         min_heapify(a, heap_size, i) def heap_sort(a,heap_size):     build_min_heap(a, heap_size)     print a      for i in range(heap_size-1,0,-1):         a[i],a[0]=a[0],a[i]         #print a         heap_size-=1         min_heapify(a, heap_size, 0) def findMaxKInN(N, K):     All_Data = []     for i in range(N):         ele = random.randint(1, N)         All_Data.append(ele)     a = []     for i in range(K):         a.append(All_Data[i])     start = time.clock()     build_min_heap(a, len(a))     for i in range(K, N, 1):         if a[0] < All_Data[i]:             a[0] = All_Data[i]             min_heapify(a, K, 0)     end = time.clock()     print "N=",N,"K=",K     print "N*logK" + "复杂度所用的时间", end - start     start = time.clock()     All_Data.sort(cmp=None, key=None, reverse=True)     end = time.clock()     print "使用排序N*logN", end - start if __name__=="__main__":     N=10000     K=100     while(N<=10000000):         findMaxKInN(N, K)         N*=10;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值