首先在c++**的檔案下新建乙個txt檔案,命名為test.txt
,然後在generate_random.cpp
中寫如下**:
先讀取txt檔案中生成的100萬個隨機數,這個量是很大的(其實可以生成更多,這裡用100w為例),如果完整排序後輸出前100大,這樣非常耗時!所以選擇如下演算法:
構造乙個容量為100的小頂堆,將隨機生成數中前100個存進去,然後遍歷剩下的n-100個資料,如果比堆頂大,那麼和堆頂交換,然後執行一次構造小頂堆的函式(所以選擇把構造小頂堆的函式分離出來寫);如果這個數不比堆頂大,那麼捨棄這個數,也就是接著遍歷後面的數…遍歷完剩下的數之後,這個小頂堆也就是儲存的前100大的數了,直接輸出結果即可。
#include
const
long
long n =
1000001
;using
namespace std;
long
long x[n]
,tree[
101]
;void
find_largest_100
(long
long a,
long
long tree)
;void
creat_minheap
(long
long a)
;int
main()
in.close()
;for
(i=1
;i<=
100;i++
)creat_minheap
(tree)
;find_largest_100
(x,tree)
;for
(i=1
;i<=
100;i++
)return0;
}//取前100個數構造小頂堆
void
creat_minheap
(long
long a)
}}}//找前100大的數
void
find_largest_100
(long
long a,
long
long tree)
}
找出N個資料中的最大的K個資料 堆排序
從n個資料中找出最大的k個資料,而且這裡有乙個限制 記憶體裡存不下所有的n個資料,但是可以存下k個資料。這就讓我們打消了用排序的方法來解的念頭。在這裡我們使用堆排序來完成。因為我們只能有k個資料那麼大的空間,所以我們建乙個k大的堆,將n的前k個資料插入到堆中,然後調整堆。對於堆結構不了解的可以檢視我...
堆排序 在n個數中找出K個最大的數
主要思想 在n個數中找k個最大 小 的數,肯定要用到最小堆 最大堆的思想,而這種思想在c中stl中的優先佇列 priority queue 中體現比較明顯,優先佇列底層實現就是運用了最大堆 最小堆原理,如果要求用c實現的話,可以直接用。如果用c語言實現的話,就需要自己定於堆的一系列操作,自己實現最大...
100億資料找出最大的1000個數字
這是網際網路領域乙個比較經典的演算法問題 top k 如何在巨大的資料中找出最大,或者訪問量最高的前10個,前100個或者前1000個資料。比如在2億使用者記錄中找出信用等級最高的,在上億個搜尋詞彙中找出被搜尋次數最高的10個關鍵字。前提是資料儲存在檔案中 一般遇到這個問題,第一反應會想到排序,但是...