编程珠玑《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