编程珠玑第一章开篇 总结

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

 看这本书时,心里默默告诉自己,要好好琢磨,不可求速度,要看自己吸收了多少。

 现在把第一章总结下:

当遇到一个问题时,解决的一般原理为:

第一:正确的问题。明确问题,这场战役就成功了90%。对问题进行形式化的描述是很关键的,把输入、输出和约束亲手写下来。

    输入:一个最多包含n个正整数的文件,每个数都小于n,其中n=10^7。如果在输入文件中有任何整数重复出现就是致命错误。没有其他数据和该整数相关联。

    输出:按升序排列的输入整数的列表

    约束:最多有(大约)1MB的内存空间可用,有充足的磁盘存储空间可用。运行时间最多几分钟,运行时间为10秒就不需要进一步优化了。

第二:程序设计。该问题用到位图数据结构。

        位图 位向量图 作为一个集合, 表示的这样的一个数据结构:

          用字符串 0 1 1 1 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 表示集合 {1,2,3,5,8,13}.位图 位向量图 作为一个集合, 表示的这样的一个数据结构:

          int a[10000000]a[i]只保留了一个整型值01,如果我们把每一个元素包含的内容扩充,使之保留尽可能多的号码是否存在的信息,那么数组范围会得到明显的下降。

       事实上,我们是用每一个元素表示一个32位的二进制字符串这样这个元素可以保留相邻32个号码是否存在的信息,数组范围就下降到了10000000/32了,例如对于号码89256,由于89256 mod 32=2789…8,这样我们应该             置a[2789]32位字符串的第8(从低位数起)1现在问题的关键是,如何用位逻辑运算来表示这种操作。

#define BITSPERWORD  32

#define MASK SHIFT 5   //移动5个位,左移相当于乘以32,右移相当于除以32取整

#define MASK 0x1F  //十六进制下的31

#define N 10000000

// 置位函数----用“|”操作符,I & MASK相当于mod操作

//m mod n 运算,当n = 2 X次幂的时候,m mod n = m & n-1

void setint i

{

      a[i>>SHIFT] |= 1<<(i & MASK));

}

 

//清除位操作民用&~操作符

void clr (int i)

{

      a[i>>SHIFT]  &= ~(1<<(I & MASK))

}

 

//测试位操作用&操作符

int test(int i) {return a[i>>SHIFT] & (1<<(i&MASK))}


编程珠玑》习题练习In Python——第一章 开篇 问题:如何给磁盘文件排序 输入一个包含最多n个正整数文件每个小于n,其中n=10^7。如果在输入文件中有任何整重复出现就是致命错误。没有其他据与该据相关联。 输出:按升序排列的输入的列表。 约束:最多有(大约)1MB内存空间可用,有充足的磁盘存储空间可用。运行时间最多几分钟,运行时间为10秒就不需要进一步优化了。 阅读详情

相关推荐

编程珠玑——第一章

问题描述 输入一个最多包含n个正整数文件每个小于n,其中n=10^7。如果在输入文件中有任何整重复出现就是致命错误。没有其他据与该整相关联。 输出:按升序排列的输入的列表。 约束:最多有(大约)1MB的内存空间可用,有充足的磁盘空间可用。运行时间最多几分钟,运行时间为10秒就不需要进一步优化了。 程序设计 在这里书中给出了三种解决方案: (1

love_bluesky的专栏 809

编程珠玑_第一章_ 开篇

问题: 输入:给出至多10,000,000个正整数的序列 特征:每个小于10,000,000、据不重复 且 据之间不存在关联关系(相互独立) 输出:增序输出序列 约束:内存容量1MB,磁盘空间充足,运行时间至多几分钟,10是最适宜的时间 分析:我们需要10,000,000个表示10,000,000个位。1MB的包含8*1024*1024个位 则,所需要的内存容量为:10,00

思考,思考,再思考~ 1630

编程珠玑ch01

笔记问题描述: 输入一个文件,至多包含n个正整数每个正整数都要小于n,n=10710^7,如果输入时某一个出现了两次,就会产生一个致命的错误。这些整与其他任何据都不关联。 输出:以增序形式输出经过排序的整列表。 约束:至多只有1MB的可用主存;但是可用磁盘空间非常充足。运行时间至多允许几分钟;10秒钟是最适宜的运行时间。 分析: 方案一: 每个32位,在1MB空间中保存2

luo359651204lxj282的博客 319

编程珠玑第一章开篇

问题描述:如何给磁盘文件排序? 输入一个最多包含n个正整数文件每个小于n,其中n=107。如果在输入文件中有任何整重复出现就是致命错误。没有其他据与该整相关联。 输出:按升序排列的输入的列表。 约束:最多有(大约)1MB的内存空间可用,有充足的磁盘存储空间可用。运行时间最多几分钟,运行10秒就不需要进一步优化了。 实现概要: 这个样的题目咋一看就会想到外部排序的方法。

东方吹雪的专栏 1312

编程珠玑第一章 开篇

编程珠玑第一章 开篇 一. 题目       如何给磁盘文件排序?      问题描述:      输入一个最多含有n个不重复的正整数(也就是说可能含有少于n个不重复正整数)的文件,其中每个小于等于n,且    n=10^7。      输出:得到按从小到大升序排列的包含所有输入的整的列表。      条件:最多有大约1MB的内存空间可用,但磁盘空间足够。且要求运行时间在5

chenglinhust的专栏 1010

编程珠玑》学习记录第一章开篇

开篇提出了一个排序问题 问题描述:在一个磁盘文件中存在10000000左右个正整数,不存在重复元素,每个在区间[1, 10000000]中。 输出:将这些整升序排列,并存到一个磁盘文件里。 约束:大约有1M的内存空间可用,运行时间在10秒左右。 分析:对于1千万左右的字,我们至少要用4个字节来存储。如果同时将1千万个这样的字读入内存,大约需要38M左右的内存, 这远远超过题目要求。这种情况下,需要对磁盘文件进行多趟的排序,这样的话代码会很复杂,而且很难满足时间要求。 解决方法:文中提出.

请叫我少爷的博客 197

编程珠玑第一章 开篇

1.问题描述 输入一个最多包含n个整文件文件中的每个小于n,其中n=10^7输入文件中没有重复的整。 输出:按升序排列的整列表 约束:最多有大约1MB的内存空间,有充足的磁盘存储空间可用。 (1)采用外排序;每次读入一部分据至内存进行排序,然后对各部分进行归并。 (2)采用位图法;用一个一千万位的bit串来表示所有的整,从左到右每一位分别代表整1,2,3

韦远科的专栏 952

编程珠玑第一章开篇——排序

为什么80%的码农都做不了架构师?>>> ...

weixin_34290390的博客 161

编程珠玑第一章开篇

习题 1. 如果不缺内存,如何使用一个具有库的语言来实现一种排序算法以表示和排序集合?

Code for Yun 1382

编程珠玑 第一章 开篇

习题 1. 如果不缺内存,如何使用一个具有库的语言来实现一种排序算法以表示和排序集合?       由于目前只学习了C和C++,所以只讨论C和C++中具有排序算法的库。对于C,有stdlib.h中的快速排序qsort函;对于C++,其STL中的algorithm包含一个排序算法sort函。    #include void qsort( void *buf, size_t nu

ChallenChenZhiPeng的专栏 957

编程珠玑】读书笔记 第一章 开篇

2013-07-10 18:39:25 【编程珠玑】读书笔记第一章   本书以一个排序的问题开篇,讨论了排序的最佳方法,并引入了位图排序的算法。实际上,此处的位图排序本质就是计排序(关于计排序,此处不再赘述),只不过由于此处问题的特殊性——据没有重复,可使用更加节省空间的方法,对每一个据,使用1bit的空间进行计。   书中还给出了用标准库函qsort、以及模板类set排序的提议...

weixin_34122604的博客 95

编程珠玑_第一章开篇

<br />遇到一个提问<br /> <br />我们需要提出更多的细节问题,准确的把问题描述清楚,其次才是对问题进行设计解决<br /> <br />位图/位向量-------<br />适用于:输入据限制在相对较小的范围内;据没有重复;而且对于每条记录而言,除了单一据外,没有任何其他关联据。但是依然可以灵活应用。<br /> <br /> <br />原理总结:<br />1. 对小问题的仔细分析有时可以得到明显的实际益处;<br />2. 结构简单,部件很少,易于维护,非常坚固。(用于程序依通

jeiwt的专栏 595

第一章 开篇 - 编程珠玑 - 读书笔记

在朋友的推荐下开始读这本书。读技术类的书有个习惯,先看下目录并决定要精读还是泛读。感觉不错,值得精读。其中一个不错的方法就是写读书笔记,并坚持每一篇多多少少写一些完整的代码。比如开篇的问题便是掌握和应用位运算的一个很好的例子。作者巧妙地通过填充位图(位向量)作为整集合并遍历完成排序的方式达到的时间和空间的双赢。问题描述如下:输入一个最多包含n个正整数文件每个小于n,其中

简约 715
上一篇: 一些重要的算法
下一篇: 海量数据处理---题目
DeepIT
博客等级 码龄16年 26粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值