Python笔试题目:求最大的K个数子,解法二,适合小型数据集的情况

题目:

Givena array of 10,000 random intergers, select the biggest 100 numbers.



1)The order of the result numbers does not matter;

2)Take care about the algorithm performance and big O complexity.

我的解答:

#coding=utf-8

## generate random numbers
from random import randint
# low and high limit of the numbers of the random number
low = -10000000
high = 10000000

# total_number of the numbers
total_number = 10000
# the number of beggest number we need
max_number = 100

# use  () for [] will be more efficient ?
numbers = [randint(low,high) for elem in xrange(total_number)]
#print numbers



"""
   when the dataset is not large, we still consider the method of "sort and then select"
   take quick sort for example, its average complexity is O(N*logN),
   then take the K beggest numbers with complexity O(K). So 
   time complexity is O(N*logN) + O(K) = O(N*logN) in total.

   If we only find the biggest K numbers and let the N-K number alone,
   the complexity is O(N*K) using part_sorting.

   comparing O(N*logN) and O(N*k), we can find that quick sort algorithm is more efficient that the latter one 
   when k > logN and vice versa. 
"""
from math import log

def  quick_sort(numbers):    
    return [] if numbers == [] else quick_sort([y for y in numbers[1:] if y < numbers[0]]) +  \
           [numbers[0]] + quick_sort([y for y in numbers[1:] if y >= numbers[0]]) 


def selection_sort_part(numbers):
    size = len(numbers)
    # the range is [0...max_number-1] ,rather than [0,len(numbers)]. so the selection performs only K times,
    for i in range(max_number):  
        k = i 
        for j in range(i + 1, size):
            #   
            if numbers[j] > numbers[k]:  
                k = j  
                  
        if k is not i:  
            numbers[i], numbers[k] = numbers[k], numbers[i]
            
    return numbers


def main():
    if max_number >= log(total_number,2):
        print 'result from quick_sort algorithm:',quick_sort(numbers)[-max_number:]
    else:
        print 'result from selection_sort_part algorithm:',selection_sort_part(numbers)[:max_number]


if __name__ == '__main__':
    main()


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值