### 知识点总结 #### 一、算法设计与分析基础习题解析 **1.1 习题解析** **题目5:证明等式 gcd(m,n)=gcd(n,m mod n) 对每一对正整数 m,n 都成立** **解析:** 本题要求证明对于任意正整数 \(m\) 和 \(n\),最大公约数 \(\text{gcd}(m, n)\) 等于 \(\text{gcd}(n, m \mod n)\)。 **证明思路:** 我们需要了解最大公约数(Greatest Common Divisor,简称GCD)的概念。\(d\) 是 \(u\) 和 \(v\) 的一个公约数,当且仅当 \(d\) 同时整除 \(u\) 和 \(v\)。最大的公约数即指能同时整除 \(u\) 和 \(v\) 的最大整数。 **证明步骤:** - **Step 1:** 假设 \(d\) 能整除 \(m\) 和 \(n\)。 - **Step 2:** 根据除法的性质,\(r = m \mod n = m - qn\),其中 \(q\) 是 \(m\) 除以 \(n\) 的商。 - **Step 3:** 若 \(d\) 能整除 \(n\) 和 \(r\),则 \(d\) 也能整除 \(m = r + qn\) 和 \(n\)。 - **Step 4:** 由以上分析可知,\((m, n)\) 和 \((n, r)\) 具有相同的公约数集合,其中也包括了最大公约数。 - **结论:** 因此,\(\text{gcd}(m, n) = \text{gcd}(n, m \mod n)\) 成立。 **题目6:对于第一个数小于第二个数的一对数字, 欧几里得算法将会如何处理?该算法在处理这种输入的过程中,上述情况最多会发生几次?** **解析:** - **处理方式:** 对于任意一对数字 \(0 \leq m < n\),欧几里得算法会在第一次迭代时进行交换,即 \(\text{gcd}(m, n) = \text{gcd}(n, m)\)。 - **交换次数:** 这种交换只发生一次。 **题目7:** 对于所有 \(1 \leq m, n \leq 10\) 的输入, 欧几里得算法最少要做几次除法?最多要做几次除法? **解析:** - **最少除法次数:** 当 \(m = 1, n = 2\) 时,只需要进行一次除法运算即可得到结果。 - **最多除法次数:** 当 \(m = 5, n = 8\) 时,最多需要进行五次除法运算才能得到结果。 #### 二、算法设计案例解析 **1.2 习题解析** **题目1:(农夫过河)P—农夫 W—狼 G—山羊 C—白菜** **解析:** 这是一道典型的“农夫过河问题”。农夫需要将狼、山羊和白菜都安全地送到河对岸,但不能让狼和山羊独处,也不能让山羊和白菜独处。 **题目2:(过桥问题)1,2,5,10---分别代表 4 个人, f—手电筒** **解析:** 这是一个经典的组合优化问题。目标是在最短时间内让所有人过桥。每个人过桥的速度不同,且每次只能两个人一起过桥,并且必须携带手电筒。 **题目4:对于任意实系数 a,b,c, 某个算法能求方程 ax^2+bx+c=0 的实根,写出上述算法的伪代码** **伪代码:** ```plaintext 算法 Quadratic(a,b,c) //求方程 ax^2+bx+c=0 的实根的算法 //输入: 实系数 a,b,c //输出: 实根或无解信息 if a ≠ 0 then D ← b*b - 4*a*c if D > 0 then temp ← 2*a x1 ← (-b + sqrt(D)) / temp x2 ← (-b - sqrt(D)) / temp return x1, x2 else if D = 0 then return -b / (2*a) else return "no real roots" else if b ≠ 0 then return -c / b else if c = 0 then return "infinite solutions" else return "no real roots" ``` **题目5:描述将十进制整数表达为二进制整数的标准算法** **文字描述:** 将十进制整数转换为二进制整数的方法如下: - 输入:一个正整数 \(n\)。 - 输出:正整数 \(n\) 相应的二进制数。 - 步骤: 1. 将 \(n\) 除以 2,余数赋给 \(K_i(i=0,1,2...)\),商赋给 \(n\)。 2. 如果 \(n=0\),则到第三步;否则重复第一步。 3. 将 \(K_i\) 按照 \(i\) 从高到低的顺序输出。 **伪代码:** ```plaintext 算法 DectoBin(n) //将十进制整数 n 转换为二进制整数的算法 //输入: 正整数 n //输出: 该正整数相应的二进制数,该数存放于数组 Bin[1...n]中 i ← 1 while n ≠ 0 do { Bin[i] ← n % 2 n ← (int)n / 2 i ← i + 1 } while i ≠ 0 do { print Bin[i] i ← i - 1 } ``` **题目9:考虑下面这个算法,它求的是数组中大小相差最小的两个元素的差** **解析:** 这是一个寻找数组中两元素之间最小差值的问题。为了提高效率,可以通过先对数组进行排序,然后遍历数组比较相邻元素之间的差值来解决这个问题。 **1.3 习题解析** **题目a:应用该算法对列表“60,35,81,98,14,47”排序** **解析:** 这是一种基于计数排序的思想的排序算法,通过计算每个元素的排名来进行排序。 **排序过程:** - 对列表“60,35,81,98,14,47”进行排序。 - 计算每个元素比其小的元素个数,根据这个数量将元素放入最终的位置上。 **排序结果:** 排序后的结果为:“14,35,47,60,81,98”。 **题目b:该算法稳定吗?** **解析:** 稳定性是指相同值的元素在排序前后相对位置不变。根据该算法的特点,它不是稳定的排序算法。 **题目c:该算法在位吗?** **解析:** 在位性指的是排序过程中不需要额外的空间。由于该算法需要额外的空间存储临时数据,因此它不是在位的排序算法。 **1.4 习题解析** **题目1:请分别描述一下应该如何实现下列对数组的操作,使得操作时间不依赖数组的长度。** **a. 删除数组的第 i 个元素(1<=i<=n)** **解析:** - **操作方法:** 将第 \(i\) 个元素替换为数组的最后一个元素,然后减少数组的大小 1。 **b. 删除有序数组的第 i 个元素(依然有序)** **解析:** - **操作方法:** 将第 \(i\) 个元素替换为一个特殊符号,例如 \(\text{NULL}\) 或者 \(-1\)。
剩余66页未读,继续阅读
- 粉丝: 802
- 资源: 2940
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助