編程珠璣《Programming Pearls》---再不讀經(jīng)典就鞋材了
閱讀計(jì)劃
這本書的前言已經(jīng)叮囑了囊陡,對于這本書讀起來要
盡量的慢捆等,讀精讀頭才可以降铸。這也正好符合我懶的作風(fēng)住拭。
正好潭袱,[慢慢磨這本書宰睡,計(jì)劃在一個(gè)月內(nèi)讀完酿愧。]
因?yàn)槭窃趫D書館借的声邦,目前我有個(gè)計(jì)劃是在畢業(yè)之前
把圖書館的經(jīng)典書籍都看完挽牢,不論是技術(shù)類還是什么,
而且做好筆記彤悔,筆記不做也要做好書單的記錄嘉抓。
let us do IT! 不用點(diǎn)英語沒有逼格,下面這本書簡稱Pears晕窑,
具體原因是linux下的輸入法很難用抑片,珠璣很難打。
第一章
關(guān)于排序的反思
一直在學(xué)習(xí)排序杨赤,基本的排序比如二叉樹敞斋,堆截汪,歸并,塊排植捎,
大都了解衙解,但排序的哲學(xué)在于當(dāng)齊面對上G大小的數(shù)據(jù)時(shí)的性能如何,
對于我們初學(xué)者來說焰枢,我們重點(diǎn)方錯(cuò)了位置蚓峦,我們以為會(huì)用排序
排一個(gè)10個(gè)數(shù)字的數(shù)組就算完成了,其實(shí)更加需要注意的是如何在大數(shù)據(jù)的面前利用排序算法更加有效的進(jìn)行大數(shù)的排序济锄,所以1G的數(shù)據(jù)如何生成也是我們需要研究的暑椰。
如何生成1G的數(shù)據(jù)?
1.隨機(jī)生成一個(gè)文件拟淮。
2.在網(wǎng)上down一個(gè)二進(jìn)制文件
Pears的第一個(gè)問題描述
如何給磁盤文件排序干茉?
輸入:一個(gè)最多包含n個(gè)正整數(shù)的文件谴忧,每個(gè)數(shù)都小于n很泊,
其中n = 10^7。如果在輸入文件中有任何整數(shù)重復(fù)出現(xiàn)就是致命錯(cuò)誤沾谓。
輸出:按排序排列的輸入整數(shù)的列表委造。
約束:最多有(大約)1MB的內(nèi)存空間可用,有充足的磁盤存儲(chǔ)空間可用均驶。運(yùn)行時(shí)間最多
幾分鐘昏兆,運(yùn)行時(shí)間為10s就不需要進(jìn)一步優(yōu)化了。
利用位圖排序
書中提到了利用歸并去實(shí)現(xiàn)妇穴。
但歸并的缺點(diǎn)在于需要輔助內(nèi)存的不斷讀出寫入爬虱,所以數(shù)據(jù)大了之后效率會(huì)下降。
可以采用位圖來做腾它。
代碼#include<回來寫跑筝,打球去了>
#include <iostream> // std::cout
#include <algorithm> // std::for_each
#include <vector> // std::vector
using namespace std;
void fun(int i){
cout << i << ' ';
}
int main(int argc, char const *argv[])
{
//
int i{};
int bit[10];
for(i = 0;i < 10;++i){
bit[i] = 0;
}
bit[0] = 0;
bit[2] = 1;
bit[3] = 1;
bit[4] = 1;
bit[6] = 1;
bit[7] = 1;
// for_each(bit,bit+10,fun);
for(i = 0;i < 10;++i){
if(bit[i] == 1){
cout << i << ' ';
}
}
cout << endl;
return 0;
}
root@fangzhenhua-Lenovo-G510:/home/kevin/ProgrammingPearls# ./a.out
2 3 4 6 7