《程式設計之美》 尋找最大的K個數

2021-09-30 04:19:51 字數 886 閱讀 4234

用於解決類似:10億個浮點數,找出當中最大的10000個之類的問題。《程式設計之美》上一共五種解法:

解法一:利用選擇排序和氣泡排序,這兩者的複雜度都屬o(n*k)

解法二:和stl中的nth_element(first, nth, last)思路一樣。首先在[first, last)上尋找乙個閾值(可採用三點中值法),根據這個閾值將[first, last)分成兩段,前一段所有值都小於等於(或大於等於)閾值,後一段所有數都大於等於(或小於等於)閾值。如果閾值所在的位置》nth,則說明第nth個數在前半段,否則nth個數的位置處於後半段。然後對子序列進行分割。直到子串行的長度小於等於3,然後對子序列進行插入排序。最後的結果是第nth個數一定是排好序的第nth個數,而且前段的數都比nth小(或大),後端的都比nth大(或小)。複雜度為o(n*logk)解法三:

解法四:

和stl中的partial_sort(first, middle, last)思路一樣。對[first, middle)部分進行排序。在[first, middle)構造乙個min_heap,然後遍歷[middle, last)。如果有比堆頂大的數,就和堆頂元素交換,然後調整堆。這樣,當遍歷完之後,[first, middle)就存放著前middle-first個大數。而且第乙個元素(堆頂)是第middle-first個數(從1開始算),如果從0開始算就是第middle-first個數。這種方法的複雜度為o(n*logk)解法五:需要知道最大數max,然後分配乙個max大小的空間count[max],用來記錄每乙個數出現的次數。然後從大到小的遍歷陣列,知道出現的次數總和加起來大於等於k的時候,那麼此時的數就是第k大的數。這種方法的複雜度是線性的。

程式設計之美 尋找最大的K個數

有很多個無序數,我們姑且假定他們各不相等,怎麼挑選出其中最大的若干個數呢?如果這個資料量很大,比如1億個,如果所存資料是浮點型呢?我們該怎麼處理呢?分兩部分,第一部分是我個人的解答,第二部分是書上的解答 第一部分 1,如果這個問題裡的資料都是整數,這個問題利用hash對映應該很簡單,就是在開闢乙個陣...

程式設計之美 尋找最大的K個數

有很多個無序數,我們姑且假定他們各不相等,怎麼挑選出其中最大的若干個數呢?如果這個資料量很大,比如1億個,如果所存資料是浮點型呢?我們該怎麼處理呢?分兩部分,第一部分是我個人的解答,第二部分是書上的解答 第一部分 1,如果這個問題裡的資料都是整數,這個問題利用hash對映應該很簡單,就是在開闢乙個陣...

程式設計之美 尋找最大的k個數

有很多無序的數,我們姑且假定它們各不相等,怎麼選出其中最大的若干個數呢?idea 1 先用快速排序或者堆排序進行排序,然後取出最大的k個數,時間複雜度為o nlogn o k o nlogn idea 2 進行k趟最大冒泡或者k次大頂堆的輸出,時間複雜度為o n k 根據k與logn的大小比較,選取...