摘要:问题分析 本题考察的实质是如何在不初始化数组的情况下使用数组。实现的关键是如何判断访问位是已经初始化了还是未初始化的,这里,我们必须可以使用辅助空间来记录下访问信息,在具体访问时进行单独的初始化操作。解决思路 先做以下工作: 1. 定义一个top变量,记录当前已经被访问了( 初始化了 )的元素个数。 PS:重复访问的不算 2. 定义一个名为from的辅助数组,和数据数组各位相应,记录数据数组各位置元素被访问( 初始化 )的次序。 PS:重复访问的不算 3. 定义一个名为to的数组,也和数据数组各位相应,其下标表示元素被访问的次序,值表示访问次序对应的访问下标( 数据数组的 )。PS:...
阅读全文
摘要:问题分析 本题解法和第 5 题我给出的解法思路上是一样的 --- 可以分几次排序,这里不再具体实践了。
阅读全文
摘要:问题分析 本题考察的是异常处理。优质的程序必须具备良好的异常处理机制,切不可马虎了事,这将直接决定程序的质量。问题解答 先贴出分析目标代码: 1 #include 2 #include 3 #include 4 5 using namespace std; 6 7 // 每个整数的位数 8 #define BITSPERWORD 32 9 // 每次位移量10 #define SHIFT 511 // 取模掩码12 #define MASK 0x1F13 // 位向量的元素个数14 #define N 1000000015 16 // 模拟数组17 int a[1 + N/BIT...
阅读全文
摘要:问题分析 在之前的情形中,我们都是用一个位来表示一个整数。而对于这题,需要存储的还有整数的位数。解决方案 可用四位来表示一个整数以及它的位数。我们可以使用1000万 * 4 / 8 字节空间,也即4.8 MB左右的容量一次排序完,也可以使用4.8 / p ( MB )左右的容量p次排序完。具体实现起来位向量控制函数也需要进行改动。具体代码略
阅读全文
摘要:问题分析 此前实现的位向量排序需要一个有1000万位的位向量,也就是要占用大概1.2MB的存储空间。本题要求将内存需求从1.2MB限制到1MB。也就是说要用800多万位存放大约1000万个数字并完成排序( 注意是存放1000万个数字而不是表示这些数字中的某一个 )。结合实际情况分析可知,美国的电话号码不会以0或者1开头,因此0 - 1999999这个范围内的数字不用在位向量中占据位置,这样就节省了0.23 - 0.24MB的容量,满足要求。下面我们对本章第 3 题的代码进行改进,使其内存消耗严格固定在1MB之内。代码实现 1 #include 2 #include 3 #inclu...
阅读全文
摘要:问题分析 假若要产生0 - 9范围内的无重复随机数字,可按照如下思路实现: 1. 定义存放10个整数元素的数组,其中每个元素的值为其下标值。 2. 遍历数组,让当前遍历位的元素和某个位( 随机产生 )的元素交换。代码实现 1 #include 2 #include 3 4 using namespace std; 5 6 #define N 10 7 8 /* 9 * 交换数组元素10 */11 void change(int &a, int &b) {12 int temp;13 temp = a;14 a = b;15 b = a;16 }...
阅读全文
摘要:问题分析 本题解答分成以下几个步骤: 1. 创建一个用来测试的数据文件( 内含10000000个整数 ) 2. 编写位向量版的排序程序 3. 测试2中排序程序所用时间和本章第 1 题排序所用时间第一步:创建一个用来测试的数据文件( 内含10000000个整数 ) 这里我编写了一个小程序来创建这个数据文件,代码如下: 1 #include 2 #include 3 #include 4 #include 5 6 using namespace std; 7 8 #define N 10000000 9 10 int main()11 {12 string filen...
阅读全文
摘要:问题分析 在上篇文章中,给出了使用C语言中经典位运算符来实现位向量的方法。而本文,将介绍使用C++中的bitset容器来实现位向量的方法。实现 1 // 请包含bitset头文件 2 #include 3 4 // 定义一个有100个成员的bitset容器( 位向量 ) 5 bitset b; 6 7 // 将位向量第i位置为1 8 b.set(i); 9 10 // 将位向量第i位置为011 b.reset(i);12 13 // 查看位向量第i位14 b.test(i);15 16 // 在屏幕上打印位向量17 cout << b << endl;小结 使用容器,很
阅读全文
摘要:问题分析 位向量可以定义为一个模拟数组(整型数组)。所谓的“ 实现位向量 ”也就是定义函数,实现对模拟数组中指定【位】的设置,清空,以及测试。函数实现 1 // 每个整数的位数 2 #define BITSPERWORD 32 3 // 每次位移量 4 #define SHIFT 5 5 // 取模掩码 6 #define MASK 0x1F 7 // 位向量的元素个数 8 #define N 10000000 9 10 // 模拟数组11 int a[1 + N/BITSPERWORD];12 13 /*14 * 函数功能:置位向量第i位为115 * 函数说明:" i>>
阅读全文
摘要:问题分析 依题意,所需程序不用过多考虑效率且暗示使用库,自然想到用高级语言实现(个人选择C++)。可用顺序容器暂存数据,用标准算法解决排序问题。代码实现 1 #include 2 #include 3 #include 4 #include 5 #include 6 7 using namespace std; 8 9 int main()10 {11 /*12 * 获取数据文件名并打开文件13 */14 string filename;15 cout > filename;17 fstream io;18 io.ope...
阅读全文