编程珠玑:第二章,3个问题
2013-06-26 17:19
218 查看
时间复杂度:
T(n) = a*T(n/b)+c*n^k;
if (a > b^k) T(n) = O(n^(logb(a)));
if (a = b^k) T(n) = O(n^k*logn);
if (a < b^k) T(n) = O(n^k);
一、给定一个最多包含40亿个随机排列的32位整数的顺序文件,找出一个不在文件中一32位整数。
1、如果有足够的内存,如何处理?
2、如果内存不足,可以放在几个临时文件中,内存仅可以用几百字节来进行处理,如何处理?
答案:
1、采用位数思想来存放,32位数需要2^32个位,2^23是1MB,则一共需要2^9,即512MB的内存。
3、内存不足,可以采用如下思想:
1、按最高位分为两段,没有出现的那个数,肯定在比较小的段里面。
如果比较少的段最高位为1,那么缺少的那个数的最高位也为1.
如果比较少的段最高位为0,那么少的那个数的最高位也是0.
依次按以上方法去处理每个位。
测每个整数的每个bit是0还是1,读取n=40亿个整数,第1个bit为0或为1的放到不同的文件中(每个至多为n/2亿),少于N/2个数的那组 必定缺少某个数,接着探测第2个bit是0还是1,输入至多n/2亿,输出至多n/4亿,少于N/4个数的那组 必定缺少某个数,以此类推,总的运行时间和n成正比。通过对某组排序扫描可以得到缺失的数,这样运行时间变为o(logn)。
二、将一个n元一维向量向左旋转(循环左移)i个位置,能否仅适用数十个额外字节存储空间,在O(n)的时间内完成
1. 将a[0] 放在临时数b里,将a[i]移到a[0],a[2i]移到a[i], 再b放到a[n-i]中,如此,再对a[1]进行处理,直到所有元素都一定为止。这种方法所耗时间为n
2. 比较巧妙,分析题意,实际上是将ab反转成ba,则考虑将b分成cd两部分,d与a的长度相等。将d与a进行互换,问题转化成把dca变成cda,如此递归计算。时间复杂度也为n
3. 根据上一个方法进行改进,要将ab变成ba,假设有一个反转函数,可以对一个数组进行反转。arbr,之后再对整个进行一次反转(arbr)r就得到了ba。整个算法时间复杂度为2n,但是它的优势在于代码短,不容易出错。
三、给定一个英语字典,找出其中变位词集合,例如“stop”、“pots”、“tops”互为变位词
1. 要找到所有的变位词,如果一个一个比对,耗时太长。对每一个词产生一个额外的标志,这个标志是这个词按照字母顺序排列的结果(可使用计数排序),“stop” 为opst,“pots”也为opst
T(n) = a*T(n/b)+c*n^k;
if (a > b^k) T(n) = O(n^(logb(a)));
if (a = b^k) T(n) = O(n^k*logn);
if (a < b^k) T(n) = O(n^k);
一、给定一个最多包含40亿个随机排列的32位整数的顺序文件,找出一个不在文件中一32位整数。
1、如果有足够的内存,如何处理?
2、如果内存不足,可以放在几个临时文件中,内存仅可以用几百字节来进行处理,如何处理?
答案:
1、采用位数思想来存放,32位数需要2^32个位,2^23是1MB,则一共需要2^9,即512MB的内存。
3、内存不足,可以采用如下思想:
1、按最高位分为两段,没有出现的那个数,肯定在比较小的段里面。
如果比较少的段最高位为1,那么缺少的那个数的最高位也为1.
如果比较少的段最高位为0,那么少的那个数的最高位也是0.
依次按以上方法去处理每个位。
测每个整数的每个bit是0还是1,读取n=40亿个整数,第1个bit为0或为1的放到不同的文件中(每个至多为n/2亿),少于N/2个数的那组 必定缺少某个数,接着探测第2个bit是0还是1,输入至多n/2亿,输出至多n/4亿,少于N/4个数的那组 必定缺少某个数,以此类推,总的运行时间和n成正比。通过对某组排序扫描可以得到缺失的数,这样运行时间变为o(logn)。
二、将一个n元一维向量向左旋转(循环左移)i个位置,能否仅适用数十个额外字节存储空间,在O(n)的时间内完成
1. 将a[0] 放在临时数b里,将a[i]移到a[0],a[2i]移到a[i], 再b放到a[n-i]中,如此,再对a[1]进行处理,直到所有元素都一定为止。这种方法所耗时间为n
2. 比较巧妙,分析题意,实际上是将ab反转成ba,则考虑将b分成cd两部分,d与a的长度相等。将d与a进行互换,问题转化成把dca变成cda,如此递归计算。时间复杂度也为n
3. 根据上一个方法进行改进,要将ab变成ba,假设有一个反转函数,可以对一个数组进行反转。arbr,之后再对整个进行一次反转(arbr)r就得到了ba。整个算法时间复杂度为2n,但是它的优势在于代码短,不容易出错。
三、给定一个英语字典,找出其中变位词集合,例如“stop”、“pots”、“tops”互为变位词
1. 要找到所有的变位词,如果一个一个比对,耗时太长。对每一个词产生一个额外的标志,这个标志是这个词按照字母顺序排列的结果(可使用计数排序),“stop” 为opst,“pots”也为opst
相关文章推荐
- 编程珠玑:第二章 啊哈,算法三个问题
- 编程珠玑第二章问题B: n元一维向量旋转问题之java实现
- 向量abc转换为cba(如何交换非邻接内存块的问题) 编程珠玑 第二章 问题 5
- 《编程珠玑 》第二章 问题A 总结
- 《编程珠玑》第二章问题C:找出相同的英文单词(单词改变顺序可以互相转化即为相同)
- 《编程珠玑》第二章三个问题A---查找40亿个32位整数中缺失的某个整数
- 编程珠玑第二章问题A,B,C
- 编程珠玑之第二章questionC: 求变位词问题
- 编程珠玑-第二章问题A
- 位图法;海量数据处理之位图技巧;位图技巧;海量数据;编程珠玑第二章问题A;40亿整数;腾讯面试题
- 问题二十六: 输入3个学生3门课的成绩,计算每个学生的总分和平均分成绩。(用数组)
- 职场上这些操作都不会?3个excel操作技巧帮你轻松解决问题
- 使用spring websocket stomp遇到的3个问题总结:路径匹配/自动注入/activemq连接超时
- 旧的vs2005或2008工程项目转换成vs2010更高版本时遇到的3个问题
- 微信小程序3个关于字体和图片的小问题
- 想拿了年终奖走人?小心这3个问题!
- 编程珠玑第一章、第二章
- 编程珠玑第一章,电话号码排序问题
- 《编程珠玑》第二章 aha算法
- Note on <Zend Framework - A Beginner's Guide> - 02 ZF原理;继续解决第二章的问题