编程珠玑 第二章 算法

来源:互联网 发布:excel填表软件 编辑:程序博客网 时间:2024/05/18 02:29

本章一开始提出了三个问题:

A、给定一个最多包含40亿个随机排列的32为整数的顺序文件,找出一个不存在文件中的32位整数(在文件中至少缺失一个这样的数——为什么?)。在具有足够内存的情况下,如何解决该问题?如何有几个外部的“临时”文件可用,但是仅有几百字节的内存,又该如何解决问题?

问题解析:

      该问题包含三个子问题。

      1.在文件中至少缺失一个这样的数?为什么呢?这是因为32为表示能表示232-1个数,这个数>4*10的九次方=40亿大的数,因此肯定在文件中缺失一个这样的数。

      2.在具有足够内存的情况下如何解决这个问题?根据前一篇介绍的位向量表示法,可以判断该数是否存在。不过要一次性将所有数都映射到内存中,大约所需要40 0000 0000/8Byte=500MB的内存。

      3.如何有几个外部的“临时”文件可用,但是仅有几百字节的内存,该问题有该如何解决呢?书中建议使用二分搜索技术。普通的二分搜索技术在建立有序序列上的。如何建立搜索条件呢?必须定义一个范围、在这范围内表示元素的方式以及用来确定哪一半范围存在缺失整数的探测方法。(书中写的还没搞明白!!)

B.将一个n元一维向量向左旋转i个位置。例如,当n=8且i=3时,向量abcdefgh旋转为defghabc。简单的代码使用一个n元的中间向量在n步内完成该工作。你能否仅适用数十位额外字节的存储空间,在正比于n的时间内完成向量的旋转?

      问题很明确,向量左旋。在没有看他的分析之前,做了以下思考:

      1.最简单的做法是做i次的向量的左旋1次的运算,最后得到向量左旋i个位置。代码很简单。这里就不贴出了。没有借助外存,但是时间复杂度高O(in);

      2.借助外存,先将前i个元素存储起来,后将向量从i位置开始移位,最后将外存存贮的那部分向量加到尾部。借助外存,时间复杂o(n+i).

      书中给出两种巧妙的解法,一种是杂技式,一种是逆式。这里主要是说明逆式。假设旋转向量分为两部分ab,要得到ba。首先对a求逆,得到arb,后对b求逆,得到arbr。然后再对整个结果求逆得到(arbr)r,即ba。

      代码:

 

 

算法复杂是O(n),并没有借助外存。思想很巧妙。

C、给定一个英语字典,找出其中的所有变位词的集合。例如,"pots","stop"和"tops"互为变位词,因为每一个单词都可以通过改变其他单词中字母的顺序来得到。

 

     我的想法是对每次单词的副本按照字母表的顺序排序,然后再按照副本进行聚类。即相同的副本聚在一起,当然变相也是排序。

     书中提到的是先一中方式排序(水平翻手),再用另一种排序方式排序(垂直翻手)。意思差不多。

后记:

     本章习题较难,现正在努力研究中。书的前言中提到:阅读本书的一个提示:不要读得太快。要仔细阅读,一次读一章。要尝试解答书中提到的问题——有些问题需要集中精力思考一两个小时才会变得容易。然后,要努力解答每章末尾的习题:当读者写下答案时,从本书学到的大部分知识就会跃然纸上。才是真正的懂得!

     书到用时方恨少!努力!

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 软件与系统不兼容怎么办 软件与手机系统不兼容怎么办 qq和手机不兼容怎么办 来个软件不兼容怎么办 安卓8.0不兼容app怎么办 两条内存不兼容怎么办 王者荣耀软件不兼容怎么办 冒险岛不兼容win7怎么办 百度网盘手机号换了怎么办 破解版游戏闪退怎么办 安卓手机软件不兼容怎么办 安卓8.0软件闪退怎么办 游戏与手机系统不兼容怎么办 耳机和手机不兼容怎么办 软件和手机不兼容怎么办 小米6开关键失灵怎么办 同步助手下载不了微信旧版本怎么办 闲鱼退货卖家拒收怎么办 闲鱼把联系人删了怎么办 闲鱼付款了卖家不发货怎么办 红米4c卡怎么办 如果买鞋子买到假的怎么办 猎趣永久封号钱怎么办 支付宝换绑定手机后怎么办 为什么回收站的删除键不见了怎么办 微信在异地登录怎么办 支付宝帐号被冻结怎么办 进不了路由器设置页面怎么办 支付宝支付密码忘记了怎么办 淘宝忘记登录密码了怎么办 手机换卡了微信怎么办 淘宝退款成功后收到货怎么办 没收到货退款商家不处理怎么办 没收到货申请退款卖家不处理怎么办 京东已收到货却不处理退款怎么办 货退了卖家不退款怎么办 淘宝退了货卖家不退款怎么办 手机淘宝不显示图片怎么办 京东申请退款卖家不处理怎么办 企业网银冻结了怎么办 农行k宝坏了怎么办