随笔分类 -  已迁移至(博客园_穆晨)

均为个人整理,非官方答案。
第 3 章 第 2 题 求级数问题 递归法实现
摘要:问题分析 输入:阶数 k,级数前 k 项 a1 - ak,常系数 c1 - ck+1,要求到的级数项 m 输出:1 - m 项级数 a1 -am 约束:无思路分析 首先要明白 m 肯定是大于 k 的,不然这题不用解答。 然后要理清这里面存在的递归关系,可以假设 k = 3,c1 - c4 为 1-4,那么就有如下的递归式: an = an-1 + 2an-2+ 3an-3 +4 因此,可以使用递归法求出第 k+1 至 第 m 项级数,但要注意的是管理好动态数组以存取求解阶段需要用到的各个数据,这也是本题考察的重点。代码实现 说明:不使用数组的方法会很复杂,暂不实现这种方法。 1... 阅读全文

posted @ 2014-04-09 16:09 空山悟 阅读(690) 评论(0) 推荐(0) 编辑

第 3 章 第 1 题 精简冗余 if 语句问题 使用数组实现
摘要:问题分析 输入:用户个人收入 输出:该用户要缴纳的个人所得税 约束:不允许使用过多的 if 语句解答思路 最简单的方法是根据不同的税率区间,创建多个 if 语句来求解。但如此一来便会有 25 个 if 语句段,代码就显得太过冗余。 可以通过将判定条件都存入数组,编写统一性的代码来达到精简程序的目的。代码实现 说明:为了描述简单,只列举了 5 个税率区间的情况。 1 #include 2 3 using namespace std; 4 5 // 定义税率区间数组元素 6 struct tax_u { 7 int income_t; 8 int base; 9 ... 阅读全文

posted @ 2014-04-09 11:31 空山悟 阅读(177) 评论(0) 推荐(0) 编辑

第 2 章 第 10 题 测量电灯泡体积问题
摘要:解答 爱迪生将灯泡放进一个小的长方体水槽,观察其水位线的增量后,乘以水槽底面积得到结果。小结 研究员直接用微积分去算,有似于蛮力法。虽然可以达到目的,但时间,空间开销往往都挺大。我们应当尽量地避免蛮力法,采用更巧妙的算法。 阅读全文

posted @ 2014-04-09 09:41 空山悟 阅读(230) 评论(0) 推荐(0) 编辑

第 2 章 第 9 题 顺序 & 二分搜索效率分析问题
摘要:问题分析 顺序搜索的时间复杂度是O( n ),二分搜索的时间复杂度级别是O( lgn )。但这并不代表二分的时间开销就一定比顺序的小,因为二分搜索有个前提:元素必须要是有序的。如果仅仅为了二分搜索几个元素,就将整个数组重新排序,显然是不值得的。解答思路 此题用理论计算非常复杂,应当结合具体问题分析不同搜索次数下程序的时间开销情况,并绘制表格做出决策。小结 程序的效率,往往要结合具体情况( 数据情况,查询次数等等 )来分析。 阅读全文

posted @ 2014-04-09 09:33 空山悟 阅读(216) 评论(0) 推荐(0) 编辑

第 2 章 第 8 题 最小子集和问题 排序法实现
摘要:问题分析 输入:一个 n 元数组,元素和 t,元素个数 k。 输出:存在 or 不存在 k 个元素其和小于 t 约束:无解答思路 将数组按从小到大的顺序进行排序,然后判断这 k 个元素的和于 t 的大小关系。若其和小于 t 则此数组存在 k 个元素其和小于 t,否则不存在。代码实现#include #include #include #include using namespace std;// 输出数组void print(vector &v);// 判断数组中是否存在 k 个元素小于 tbool judge(vector v, int k, int t);int main(){ . 阅读全文

posted @ 2014-04-08 16:13 空山悟 阅读(610) 评论(0) 推荐(0) 编辑

第 2 章 第 7 题 矩阵的转置问题 排序法实现
摘要:问题分析 输入:磁带中的 4000 x 4000 矩阵 输出:转置后的矩阵 约束:无解答思路 常见的思路是遍历上/下三角矩阵,交换 a[i][j] 和 a[j][i] 进行转置。但由于 a[i][j] 和 a[j][i] 在磁带中不是存放在一起的,因此交换这两个元素会很容易引发磁盘IO中断。 因此,对于处理磁盘中的数据,最好是连续的进行处理。( 事实上对内存中的数据也是如此 这样可以充分利用内存预读技术 ) 故可采用以下思路对磁盘中的矩阵进行转置: 1. 给矩阵文件中的每个元素附加上其行号和列号 2. 对矩阵以行为关键字进行排序 形成矩阵 3. 对矩阵以列为关键字... 阅读全文

posted @ 2014-04-02 15:54 空山悟 阅读(290) 评论(0) 推荐(0) 编辑

第 2 章 第 6 题 通讯录模糊检索问题 标识法实现
摘要:问题分析 输入:名字的数字标识 输出:通讯录中所有和该标识匹配的记录 约束:错误匹配的概率不能太高解答思路 1. 给通讯录中的记录附加上标识字段( 数字 ) 2. 将通讯录中的记录按照标识字段进行排序 3. 用户输入要查找的人的名字的标识字段( 这里的标识字段类型要经过整理才能转换为 1 中的标识字段类型 详见下面代码的相关部分注释 ) 4. 顺序输出所有和 3 中标识字段匹配的记录代码实现 1 #include 2 #include 3 #include 4 #include 5 6 using namespace std; 7 8 // 初始化通讯... 阅读全文

posted @ 2014-04-02 15:37 空山悟 阅读(194) 评论(0) 推荐(0) 编辑

第 2 章 第 5 题 非相邻内存块建模问题
摘要:问题分析 两种情况很相似,故可以重用之前数组旋转所使用的代码。解答思路 1. 将 abc 旋转 a 个单位,得到 bca 。 2. 将 bca 的 bc 部分旋转 b 个部分,得到 cba。小结 这对交换非相邻内存块的问题进行了建模。 阅读全文

posted @ 2014-04-01 21:36 空山悟 阅读(128) 评论(0) 推荐(0) 编辑

第 2 章 第 4 题 几种数组旋转算法效率分析
摘要:问题分析 本题考察的是分析算法性能的能力。解答思路 初步思路: 杂技算法应当( 下面的报表将说明不是 )是时间效率最高的算法,一个元素只读取并移动了一次。 翻转算法每个元素读取并移动了两次。故时间消耗是前者的两倍。 平移算法的时间复杂度应当(下面的报表将说明不是 )和杂技算法相同。但空间消耗最大。运行测试 分析 由于平移算法使用了硬件/操作系统提供的缓冲机制,其效率反而是所有算法中最高的。小结 1. 分析一个算法的效率时,能否更大程度利用系统的性能,是要考虑的一个重要因素。 2. 要想真正准确地获取到一个算法的性能信息,还得通过具体执行获取效率信息从而生成最终报表。 阅读全文

posted @ 2014-04-01 21:28 空山悟 阅读(130) 评论(0) 推荐(0) 编辑

第 2 章 第 3 题 数组旋转问题 翻转算法实现
摘要:问题分析 输入:目标数组,旋转位数。 处理:将目标数组旋转指定的位数。 约束:无解答思路 将对象数组拆分成 a b 两个部分:a 表示要移动到尾端的部分 b表示要移动到前端的部分。 根据翻转算法的思想,可以按如下步骤完成旋转操作: 1. 将 a 部分逆置 2. 将 b 部分逆置 3. 将整个数组逆置代码实现#include using namespace std;// 数组旋转函数void rotate(int *array, int n, int r);// 逆置函数void reverse(int *array, int n);int main(void){ // 建... 阅读全文

posted @ 2014-04-01 21:08 空山悟 阅读(724) 评论(0) 推荐(0) 编辑

第 2 章 第 3 题 数组旋转问题 杂技算法实现
摘要:问题分析 输入:目标数组,旋转位数。 处理:将目标数组旋转指定的位数。 约束:无解答思路 见P13页底部,一种类似杂技演员表演的移动元素的技巧。 PS:控制每次" 杂技 "的结束是实现这个算法的关键所在,也是回答本题的第二问,请参考下面代码的注释部分。代码实现 1 #include 2 3 using namespace std; 4 5 // 数组旋转函数 6 void rotate(int *array, int n, int r); 7 // 最大公约数函数 8 int gcd( int a, int b); 9 10 int main(void)11 {12 /.. 阅读全文

posted @ 2014-04-01 17:33 空山悟 阅读(284) 评论(0) 推荐(0) 编辑

第 2 章 第 3 题 数组旋转问题 平移算法实现2
摘要:问题分析 输入:目标数组,旋转位数。 处理:将目标数组旋转指定的位数。 约束:无解答思路 建立一个旋转 1 位的函数,这样,要旋转多少位就连续调用这个函数多少次即可。代码实现 1 #include 2 3 using namespace std; 4 5 // 数组旋转函数 6 void rotate(int *array, int n, int r); 7 void rotate_1(int *array, int n); 8 9 int main(void)10 {11 // 建立并初始化,输出测试数组。12 int array[10];13 int... 阅读全文

posted @ 2014-03-27 22:17 空山悟 阅读(180) 评论(0) 推荐(0) 编辑

第 2 章 第 3 题 数组旋转问题 平移算法实现1
摘要:问题分析 输入:目标数组,旋转位数。 处理:将目标数组旋转指定的位数。 约束:无解答思路 设数组长度 n,旋转位数 r。 首先将数组前 r 个元素暂存,然后将数组后面的 n-r 个元素移动到前端,最后将暂存的这 r 个元素填充到数组尾部。代码实现 1 #include 2 3 using namespace std; 4 5 // 数组旋转函数 6 void rotate(int *array, int n, int r); 7 8 int main(void) 9 {10 // 建立并初始化,输出测试数组。11 int array[10];12 in... 阅读全文

posted @ 2014-03-27 17:18 空山悟 阅读(331) 评论(0) 推荐(0) 编辑

第 2 章 第 2 题 找“ 重数/漏数 ”问题 二分法实现
摘要:问题分析 输入:一个包含了4 300 000 000个32位整数的文件( 已排序 其中可能有重复出现的数字 ) 输出:一个在这个文件中重复出现过了的数字 约束:内存消耗应尽量小解答思路 分析题目,可以得知: 1. 32位整数最多能包含4294967296个整数 2 #include 3 #include 4 5 using namespace std; 6 7 // 正式版修改: N改为2150000000 8 #define N 4 9 10 /* 11 * 该函数将文件流io对应文件覆盖拷贝到文件流iot所对应文件 12 * 最后再重置文件流 1... 阅读全文

posted @ 2014-03-27 15:33 空山悟 阅读(374) 评论(0) 推荐(0) 编辑

第 2 章 第 2 题 找" 重数/漏数 "问题 位向量实现
摘要:问题分析 输入:一个包含了4 300 000 000个32位整数的文件( 其中可能有重复出现的数字 ) 输出:一个在这个文件中重复出现过了的数字 约束:无解答思路 第一章中,我们学习了如何用位向量进行一个空间代价很小的排序。在第一章的一些习题中,位向量的每一位代表的数就是该位的位序:位为1时表示存在这个数,0则表示不存在。本题也可以建立一个类似的位向量。但,本题的位向量又有所不同:因为要体现出重复的数据,因此一个数至少要两个位才能表示。故在这个新的位向量中,a ( 位表示的数 )和b ( 位序的关系 )不是a = b而是a * 2 = b1以及a*2 + 1 = b2 ( b1表示a对... 阅读全文

posted @ 2014-03-27 15:23 空山悟 阅读(200) 评论(0) 推荐(0) 编辑

第 2 章 第 1 题 同位词问题 下问 Multimap实现
摘要:问题分析 输入:一个任意的单词和一个内含多个乱序单词的字典文件 输出:该单词在字典中的所有同位词 约束:允许事先对字典进行预处理解决思路 上问的程序有个缺点 - 我们必须遍历完整个字典文件才能输出所有结果。现在下问允许我们事先对字典文件进行预处理,那么可以先对字典文件的单词按其标识符排序,这样相同标识符的单词都聚集在了一起,从而避免了对整个文件的检索。下面的代码用C++中的关联容器Multimap实现了这个思想。代码实现 1 #include 2 #include 3 #include 4 #include 5 6 using namespace std; 7 8 #def... 阅读全文

posted @ 2014-03-27 15:13 空山悟 阅读(215) 评论(0) 推荐(0) 编辑

第 2 章 第 1 题 同位词问题 上问 数组实现
摘要:问题分析 输入:一个任意的单词和一个内含多个乱序单词的字典文件 输出:该单词在字典中的所有同位词 约束:无解决思路 一一比对输入单词和字典中各个单词的标识符,如果相同则输出字典中的单词。标识符为一个内含26个整型元素数组,数组中的各个元素表示其对应的字母在其对应单词中出现的次数。比如 aabc 的标识符就是{ 2,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }。代码实现 1 #include 2 #include 3 #include 4 5 using namespace std; 6 7 #define MAX 26... 阅读全文

posted @ 2014-03-27 15:09 空山悟 阅读(153) 评论(0) 推荐(0) 编辑

第 1 章 第 12 题 太空环境的书写问题
摘要:问题解答 前苏联用铅笔解决了这个问题。 作者是想通过本题告诉读者,处理问题要灵活分析各种不同思路后作出决定,虽说条条道路通罗马,但是有的路很近并且好走,有的路很崎岖偏偏还很长。我们要认真分析各种“ 道路 ”以作出最佳决策。 阅读全文

posted @ 2014-03-26 23:28 空山悟 阅读(146) 评论(0) 推荐(0) 编辑

第 1 章 第 11 题 图纸传递问题
摘要:问题解答 随着如今网络的快速发展,我们可以建立两点之间专门的网络连接,或者直接订购宽带服务进行数据传递。传输成本几乎可以忽略不计。 阅读全文

posted @ 2014-03-26 23:27 空山悟 阅读(129) 评论(0) 推荐(0) 编辑

第 1 章 第 10 题 主键查找问题 哈希表实现
摘要:问题分析 本题考察的是客户订单数据库中主键的存放,我们需要构想一种索引方法以实现用户订单信息的快速存取。解决思路 可以定义一个 10x10 二维数组Array[10][10],以用户电话号码的最后两位作为索引( 具有很高的随机性 )构建哈希表。比如电话是 132******14的用户A的信息就存放在Array[1][4]里。至于处理冲突的方法可以采用拉链法,即如果又有电话为138******14的用户B的信息送达,可以在A用户信息的末尾设置个指针指向B用户的信息。这样比直接顺序存放所有数据的效率高了很多。 阅读全文

posted @ 2014-03-26 23:26 空山悟 阅读(187) 评论(0) 推荐(0) 编辑

导航

点击右上角即可分享
微信分享提示