第一章 开篇
本章主要提了一个问题
-
问题:一个最多包含 n 个正整数的文件,每个都小于 n ,其中 n = 10^7。如果在输入文件中有任何整数重复出现就是致命错误。没有其他数据与该整数相关联。
-
方法:
- 直接想到的方法应该是外部归并排序。
- 更好的方法是位图法(伪代码如下):
/*步骤一:初始化一个长度为 n 的数组为 0 */ for i = [0, n) bit[i] = 0 /*步骤二:凡是出现过的数字 i 令 bit[i] 为 1*/ for each i in the input file bit[i] = 1 /*步骤三:有序打印出所有数字*/ for i = [0,n) if bit[i] == 1 write i on the output file
-
我的思考(对应习题7部分):
- 在本章中的问题强调了所有数字只出现一次,若对于数字出现的次数没有规定,使用这种方法可以在步骤二中将:
改为bit[i] = 1
则输出时的代码为:++bit[i]
即某个数字出现几次则将该数字打印几次。for i = [0, n) if bit[i] != 0 for j = [0, bit[i]) write i on the output file
- 若出现负数了该怎么办?
- 首先我们可以直接认为出现的负数为错误数据,按数据异常处理。
- 其次我认为若是认为负数是合理的,则可以再设置一个数组用来对应出现负数的情况,即使用两个数组分别对应正负数处理。
- 在本章中的问题强调了所有数字只出现一次,若对于数字出现的次数没有规定,使用这种方法可以在步骤二中将: