标识

《编程珠玑》第二章:啊哈!算法——左旋转&&变位词

筅森魡賤 提交于 2020-03-19 13:28:25
3 月,跳不动了?>>> 本章讲解的是算法的作用,“看起来很困难的问题也可以有一个简单的、意想不到的答案。”在任何愿意在编程之前、之中和之后进行认真思考的程序员都有机会捕捉到这灵光一闪。 文章从三个问题展开,我独自先思考了一下,发现解决方法都是比较低效的,既浪费空间也浪费时间。 a. 给定一个最多包含40亿个随机排列的32位整数的顺序文件,找出一个不在文件中的32位整数(在文件中至少缺少一个这样的数,为什么? 就是2 32 > 40亿 所以就是有至少缺少一个 )。在具有足够内存的情况下,如何解决该问题?如果有几个外部的“临时”文件可用,但是仅有几百字节的内存,又该如何解决该问题? b. 将一个n元一维向量左旋转i个位置。例如,当n=8且i=3时,向量abcdefgh旋转为defghabc。简单的代码使用一个n元的中间变量在n步内完成该工作。你能否仅使用数十个额外字节的存储空间,在正比于n的时间内完成向量的旋转? c. 给定一个英语词典,找出其中的所有变位词集合。例如,“pots","stop"和“tops"互为变位词,因为每个单词都可以通过改变其他单词中字母的顺序来得到。 对于a题,第一时间应该是想到“ 二分搜索 ”这个方法。在log n时间内完成对顺序文件的搜索。但因为前提是要顺序,所以这也是二分搜索的一个弊端。因为要对非排序的整数排序,至少是需要n的正比时间。此题所提到的