最大K個(gè)數(shù)問題的Python版解法總結(jié)
TopK問題,即尋找最大的K個(gè)數(shù),這個(gè)問題非常常見,比如從1千萬(wàn)搜索記錄中找出最熱門的10個(gè)關(guān)鍵詞.
方法一:
先排序,然后截取前k個(gè)數(shù).
時(shí)間復(fù)雜度:O(n*logn)+O(k)=O(n*logn)。
這種方式比較簡(jiǎn)單粗暴,提一下便是。
方法二:最大堆
我們可以創(chuàng)建一個(gè)大小為K的數(shù)據(jù)容器來(lái)存儲(chǔ)最小的K個(gè)數(shù),然后遍歷整個(gè)數(shù)組,將每個(gè)數(shù)字和容器中的最大數(shù)進(jìn)行比較,如果這個(gè)數(shù)大于容器中的最大值,則繼續(xù)遍歷,否則用這個(gè)數(shù)字替換掉容器中的最大值。這個(gè)方法的理解也十分簡(jiǎn)單,至于容器的選擇,很多人第一反應(yīng)便是最大堆,但是python中最大堆如何實(shí)現(xiàn)呢?我們可以借助實(shí)現(xiàn)了最小堆的heapq庫(kù),因?yàn)樵谝粋€(gè)數(shù)組中,每個(gè)數(shù)取反,則最大數(shù)變成了最小數(shù),整個(gè)數(shù)字的順序發(fā)生了變化,所以可以給數(shù)組的每個(gè)數(shù)字取反,然后借助最小堆,最后返回結(jié)果的時(shí)候再取反就可以了,代碼如下:
import heapq def 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算法.其實(shí)就類似于快排.不同地方在于quick select每趟只需要往一個(gè)方向走.
時(shí)間復(fù)雜度: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)
相關(guān)文章
使用python測(cè)試prometheus的實(shí)現(xiàn)
本文主要介紹了使用python測(cè)試prometheus的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02使用Python實(shí)現(xiàn)視頻轉(zhuǎn)音頻與音頻轉(zhuǎn)文本
這篇文章主要為大家詳細(xì)介紹了使用Python實(shí)現(xiàn)視頻轉(zhuǎn)音頻與音頻轉(zhuǎn)文本的相關(guān)知識(shí),文中的示例代碼簡(jiǎn)潔易懂,有需要的小伙伴可以參考一下2024-02-02opencv python 對(duì)指針儀表讀數(shù)識(shí)別的兩種方式
這篇文章主要介紹了opencv python 對(duì)指針儀表讀數(shù)識(shí)別的兩種方式,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01python 在某.py文件中調(diào)用其他.py內(nèi)的函數(shù)的方法
這篇文章主要介紹了python 在某.py文件中調(diào)用其他.py內(nèi)的函數(shù)的方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-06-06Python數(shù)據(jù)庫(kù)封裝實(shí)現(xiàn)代碼示例解析
這篇文章主要介紹了Python數(shù)據(jù)庫(kù)封裝實(shí)現(xiàn)代碼示例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09pytorch 一行代碼查看網(wǎng)絡(luò)參數(shù)總量的實(shí)現(xiàn)
這篇文章主要介紹了pytorch實(shí)現(xiàn)一行代碼查看網(wǎng)絡(luò)參數(shù)總量的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-05-05詳解Pandas如何高效對(duì)比處理DataFrame的兩列數(shù)據(jù)
我們?cè)谟?pandas?處理數(shù)據(jù)的時(shí)候,經(jīng)常會(huì)遇到用其中一列數(shù)據(jù)替換另一列數(shù)據(jù)的場(chǎng)景。這一類的需求估計(jì)很多人都遇到,當(dāng)然還有其它更復(fù)雜的。解決這類需求的辦法有很多,這里我們來(lái)推薦幾個(gè)2022-09-09