updated: 2012.5.10
上個星期天(2012.5.6)中午去華科參加了百度的筆試,試卷的最後一題是問百度搜尋方塊的suggestion提示功能如何?,用什麼資料結構和演算法。
我簡單地提及了一下Top K。
前段時間看過演算法大牛JULY部落格中的一些面試題,其中有講到Top K演算法。且《編程之美》中也有一節專門講解Top K。現如今百度也考到了,說明Top K演算法真的是太重要了。可惜之前都只是粗淺地看了一遍,沒有徹底領悟。現在正在著手於Top K的學習,代碼寫好了需要海量測試資料,上哪找呢?哼哼,當然是自己寫程式產生啦。下面將介紹一種方法來隨機產生1000萬個隨機數,並將資料儲存到檔案data.txt中,方便我們隨時進行測試。
精華部分:
srand(unsigned(time(0));//隨機種子,為了提高不重複的機率
rand()%(MAX-MIN + 1) + MIN; //產生的隨機數值在MIN和MAX之間(包含MIN,MAX)
請直接看代碼,所有重要訊息均在上面。
/*本程式實現的功能:產生1000萬個可能重複的隨機數,用作測試資料 並計算產生這些資料所用的時間 */#include <iostream>#include <ctime> // time.h也可,用於計算程式已耗用時間和產生隨機種子數 using namespace std;#define SELF_RAND_MAX 0x7FFFFFFFint main(){ //typedef long clock_t clock_t start_time = clock();//計時開始 srand(unsigned(time(0)));//產生時間種子 //產生的數值在1000到1000萬之間 const int MAX = 10000000; const int MIN = 1000; /*讀入資料 freopen("in.txt","r",stdin); //寫入資料 freopen("out.txt","w",stdout); //fclose(stdin);//關閉檔案 //fclose(stdout);//關閉檔案 把標準輸入資料流stdin重新導向到in.txt檔案中, 這樣在用scanf或是用cin輸入時便不會從標準輸入資料流讀取資料, 而是從in.txt檔案中擷取輸入。 只要把輸入資料事先粘貼到in.txt,調試時就方便多了。 */ freopen("data.txt","w",stdout); //cout << "---Generate 10,000,000 random numbers\ // which maybe repeated---" << endl; for(int i = 0; i < 10000000; ++i){ //#define RAND_MAX 0x7FFF //較標準unsigned long data = ( MAX * rand() )/ ( RAND_MAX + MIN)+ 1; //unsigned long data = (MAX - MIN + 1 ) * rand() + MIN; //unsigned long data = ((MAX - MIN + 1 ) * rand() + MIN) % 10000000; unsigned long data = rand() % (MAX - MIN + 1) + MIN;//較標準 cout << data << ' '; //輸出資料到data.txt } fclose(stdout); freopen("time.txt","w",stdout); cout << endl << "---the end---" << endl; //CLOCKS_PER_SEC控制精度,在windows環境下是1000,linux下是多少完了 //簡單地說windows下是毫秒級,而linux下是納秒級 cout << "elapsed time:" << double(clock() - start_time) / CLOCKS_PER_SEC << 's' << endl; // fclose(stdout);}
運行結果:
time.txt中
---the end---
elapsed time:5.171s
產生的data.txt有55M之多。共有1000萬個資料,通過下面的測試程式可以斷定,這1000萬個資料的值均在1000-10000000之間。
#include <iostream>#include <ctime>//#include <boost/timer.hpp>//using namespace boost;using namespace std;int main(){unsigned long data;//timer t;int len = 0;freopen("data.txt","r",stdin); while(cin >> data){ if(data >= 1000 && data <=10000000) { //cout << data << endl; len++; } } cout << len << endl; // cout << t.elapsed() << endl;}
運行結果為10000000
另外如何產生不重複的1000萬個數?這是個非常大的挑戰,待日後解決。
好吧,繼續投入Top K的學習。