编程珠玑 Chap 2

第二章的三个问题

A问题:给定一个包含40亿个随机排列的32位整数的文件,找出一个不在文件中的32位整数。在具有足够内存的条件下,怎么解决?如果仅有几百字节的内存,但有几个外部临时文件可用,又怎么解决?

不得不说,这个问题A看得我真心DT,也许译者的翻译水平太差,多处歧义的地方。。后来看答案才恍然大悟。。

内存足够的话解决方法很简单,采用第一章位图的方法,复杂度O(n)。

内存不足但有外部文件,可以采取二分查找:首先遍历整个序列,对最高位进行0/1探测,将为0的归为一个文件,将为1的归为另一个文件,然后取元素数目较少的那个文件(32 bits可存储的整数超过40亿个,必有不存在的),若两个文件大小相等(存在重复元素),则随便取其中一个,遍历该文件,对次高位进行0/1探测,将为0的归为一个文件,将为1的归为一个文件。。。。循环执行,直到获取一个不存在的元素(即当前较小的文件大小为0,通过追寻0/1路径得到该元素的值)。复杂度为n+n/2+n/4+...=O(n)涉及到磁盘存取,不能这样算复杂度。

B问题:将一个n元一维向量向左旋转i个位置,如n=8,i=3时,abcdefgh旋转为defghabc

直接移位的复杂度为O(n),但需要借助额外n元的内存。如何利用额外几个字节的空间,以O(n)的复杂度完成旋转?

方案一:移动x[0]到临时变量tmp中,移动x[i]到x[0],移动x[2i]到x[i],直到n对当前i的倍数取模为0,把tmp移到该位置。然后移动x[1],循环执行,直到x[i-1]。复杂度为O(n)。

方案二:采用矩阵求逆的思想,以递归的方式实现。设A=abc,B=defgh,先对A求逆为cba,然后对B求逆为hgfed,当前为cbahgfed,继续求逆,为defghabc(BA)。用到矩阵中A逆B逆的逆为BA。整个过程是一个递归求解的过程。

C问题:给定一本英文字典,找到所有的变位词分类。

方法:首先给同类的变位词一个唯一的标识(基于单词顺序),然后按照标识对整个字典排序。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值