編程珠璣《Programming Pearls》---再不讀經典就鞋材了
閱讀計劃
這本書的前言已經叮囑了,對于這本書讀起來要
盡量的慢,讀精讀頭才可以。這也正好符合我懶的作風。
正好,[慢慢磨這本書,計劃在一個月內讀完。]
因為是在圖書館借的,目前我有個計劃是在畢業之前
把圖書館的經典書籍都看完,不論是技術類還是什么,
而且做好筆記,筆記不做也要做好書單的記錄。
let us do IT! 不用點英語沒有逼格,下面這本書簡稱Pears,
具體原因是linux下的輸入法很難用,珠璣很難打。
第一章
關于排序的反思
一直在學習排序,基本的排序比如二叉樹,堆,歸并,塊排,
大都了解,但排序的哲學在于當齊面對上G大小的數據時的性能如何,
對于我們初學者來說,我們重點方錯了位置,我們以為會用排序
排一個10個數字的數組就算完成了,其實更加需要注意的是如何在大數據的面前利用排序算法更加有效的進行大數的排序,所以1G的數據如何生成也是我們需要研究的。
如何生成1G的數據?
1.隨機生成一個文件。
2.在網上down一個二進制文件
Pears的第一個問題描述
如何給磁盤文件排序?
輸入:一個最多包含n個正整數的文件,每個數都小于n,
其中n = 10^7。如果在輸入文件中有任何整數重復出現就是致命錯誤。
輸出:按排序排列的輸入整數的列表。
約束:最多有(大約)1MB的內存空間可用,有充足的磁盤存儲空間可用。運行時間最多
幾分鐘,運行時間為10s就不需要進一步優化了。
利用位圖排序
書中提到了利用歸并去實現。
但歸并的缺點在于需要輔助內存的不斷讀出寫入,所以數據大了之后效率會下降。
可以采用位圖來做。
代碼#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