为一般起见,本章将围绕三个问题进行展开,在继续阅读之前请尝试回答这些问题。
A.给定一个包含32位整数的顺序文件,它至多只能包含40亿个这样的整数,并且
整数的次序是随机的。请查找一个此文件中不存在的32位整数(至少必有一个遗漏,为
什么? )。在有足够主存的情况下,你会如何解决这个问题?如果你可以使用若干外部临
时文件但可用主存却只有上百字节,你会如何解决这个问题呢?
B.请将一个具有n个元素的一维向量向左旋转i个位置。例如,假设n=8, i=3,那
么向量abcdefgh旋转之后得到向量defghabc。简单编码使用一个具有n个元素的中间向
量分n步即可完成此作业。你可以仅使用几十字节的微小内存,花费与n成比例的时间
来旋转该向量吗?
C.给定一本英语 单词词典,请找出所有的变位词集。例如,因为“pots”、“stop"、“tops"
相互之间都是由另一个词的各个字母改变序列而构成的,因此这些词相互之间就是变位词。
排序。排序最明显的用法就是生成已排序的输出,这既可作为系统规范的-部分,
也可作为另一个程序(多半是使用二分查找法的程序)的准备条件。但在变位词这个问
题中,排序是极其烦人的:我们进行排序时要将相等的元素( 在这种情况下是签名)整
理到-起。那些签名还可应用在另-排序应用场合:对单词内的字母进行排序,这为变
位词类之内的各个单词提供了一个规范形式。通过在每条记录上放置一一个额外的键,然
后按照那些键进行排序,排序函数可以被当成-匹驮马一样,不知疲倦地重新排序礅盘
文件中的数据。我们在第3部分将多次返回到排序这个话题。
二分查找。在已排序表中查找某个元素的算法非常有效,可以在主存和磁盘中使用:
其惟一的缺点就是整个表必须是已知的,并且还必须预先进行排序。这个简单算法下面
所隐含的策略也常用在众多其他的应用场合。
签名。等价关系定义了各个类时,定义一个签名是很有帮助的,这样类中的每一个
项都具有相同的签名,而其他项则没有。对单词内的各个字母进行排序可为变位词类产
生一个签名:其他签名则通过排序并计数表示字母重复次数的方式给出(所以
“missippi"的签名可能是“i4mlp2s4",如果省略1的话就成为“i4mp2s4"),或者通
过保存一一个具有26个整数的数组以指示每个字母出现次数的方式给出。签名的其他应用
还包括美国联邦调查局用于索引指纹的方法以及对于识别那些听起来类似但是拼写起来
不一样的名字具有启发作用的Soundex探测法。
个人感受:算法的魅力是无穷的,它可以使一个程序的效率变得相当高,我之前并没有好好
认识和学习算法,书上讲的算法我感觉很好用,我以后要认真学习算法。
解决方案:认真学习算法,去网上找一些题练习。