国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

最大K個數問題的Python版解法總結

2019-11-25 16:43:28
字體:
來源:轉載
供稿:網友

TopK問題,即尋找最大的K個數,這個問題非常常見,比如從1千萬搜索記錄中找出最熱門的10個關鍵詞.
方法一:
先排序,然后截取前k個數.
時間復雜度:O(n*logn)+O(k)=O(n*logn)。
這種方式比較簡單粗暴,提一下便是。

方法二:最大堆

我們可以創建一個大小為K的數據容器來存儲最小的K個數,然后遍歷整個數組,將每個數字和容器中的最大數進行比較,如果這個數大于容器中的最大值,則繼續遍歷,否則用這個數字替換掉容器中的最大值。這個方法的理解也十分簡單,至于容器的選擇,很多人第一反應便是最大堆,但是python中最大堆如何實現呢?我們可以借助實現了最小堆的heapq庫,因為在一個數組中,每個數取反,則最大數變成了最小數,整個數字的順序發生了變化,所以可以給數組的每個數字取反,然后借助最小堆,最后返回結果的時候再取反就可以了,代碼如下:

import heapqdef get_least_numbers_big_data(self, alist, k):  max_heap = []  length = len(alist)  if not alist or k <= 0 or k > length:    return  k = k - 1  for ele in alist:    ele = -ele    if len(max_heap) <= k:      heapq.heappush(max_heap, ele)    else:      heapq.heappushpop(max_heap, ele)  return map(lambda x:-x, max_heap)if __name__ == "__main__":  l = [1, 9, 2, 4, 7, 6, 3]  min_k = get_least_numbers_big_data(l, 3)

方法三:quick select

quick select算法.其實就類似于快排.不同地方在于quick select每趟只需要往一個方向走.
時間復雜度:O(n).

def qselect(A,k):   if len(A)<k:return A   pivot = A[-1]   right = [pivot] + [x for x in A[:-1] if x>=pivot]   rlen = len(right)   if rlen==k:     return right   if rlen>k:     return qselect(right, k)   else:     left = [x for x in A[:-1] if x<pivot]     return qselect(left, k-rlen) + right  for i in range(1, 10):   print qselect([11,8,4,1,5,2,7,9], i) 
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 城口县| 拜城县| 益阳市| 清流县| 齐齐哈尔市| 禹州市| 文山县| 锡林浩特市| 宁海县| 玉山县| 浦县| 温泉县| 江都市| 延长县| 大宁县| 桃园县| 新乡县| 广平县| 泸水县| 合肥市| 申扎县| 来安县| 江达县| 山阴县| 清丰县| 宣汉县| 都安| 阳城县| 娱乐| 镇原县| 文安县| 滁州市| 固原市| 徐水县| 泾源县| 柳河县| 龙川县| 昭苏县| 定日县| 永清县| 宁晋县|