posts - 36,  comments - 0,  views - 4004

第7章 问题求解与算法设计
目标
学完本章之后,你应该能够:
·结合Polya提出的如何解决问题的列表,描述计算机问题求解的过程。
·区分简单类型与复合类型。
·描述三种复合数据结构机制。
·认识递归问题,编写一个递归算法解决该问题。
·区分无序数组与有序数组。
·区分选择排序与插入排序。
·描述快速排序算法。
·亲自对一个数组中的值进行选择排序、冒泡排序、插人排序与快速排序。
·使用二分检索算法。
·通过一些列数值进行手工模拟来证明你对本章中算法的理解。
7.1 如何解决问题
George Ploya 《How to Solve It:A New Aspect of Mathematical Method》(《如何解决它:数学方法的新视点》)

7.1.1 提出问题
7.1.2 寻找熟悉的情况
7.1.3 分治法
7.1.4 算法

7.1.5 计算机问题求解过程


7.1.6 方法总结
1.分析问题
2.列出主要任务
3.编写其余模块
4.根据需要进行重组和改写
7.1.7 测试算法
7.2 有简单变量的算法
简单(原子)变量是那些不能被分开的变量,是存储在一个地方的一个值。

7.2.1 带有选择的算法


7.2.2 带有循坏的算法
1.计数控制循环
可指定过程重复的次数 机制:简单记录过程重复的次数并且在重复再次开始前检测循环是否已经结束。
循环控制变量(loop control variable)
初始化;测试;增量
Set count to 0 Initialize count to 0
WHILE(count<limit) Test
Body of the loop
Set count to count+1 Increment
Statement(s) following loop
2.事件控制循环
循环中重复的次数是由循环体自身内发生的事件控制的循环。
时间必须初始化,时间必须被控制,事件必须更新。


3.平方根


7.3 复杂变量
7.3.1 数组
同构项目的有名集合,可通过单个项目在集合中的位置访问它们。
项目在集合中的位置叫做索引。
7.3.2 记录
异构项目的有名集合,可通过名字单独访问其中的项目。
所谓异构,即集合中的元素可以不必相同。
7.4 搜索算法
7.4.1 顺序搜索
依次查找每一个元素并将其与所需元素进行比较。不匹配则继续找下一个元素,
当我们发现了元素或查找所有元素都没找到匹配项就停止。

7.4.2 有序数组中的顺序搜索
数组中项目有序,查找时到了这个数可能在数组的位置就可停止。


7.4.3 二分检索
算法假设数组有序,每次操作可以找到要找项目或把数组减少一半。
从数组中间开始,搜索项目小于中间项,则可知其不在后半部分,只需搜索前半部分即可。反之亦然。


7.5 排序
所谓排序,就是按顺序排放东西。
7.5.1 选择排序Selection sort
找一张卡,抽出,继续看其他卡,找到更小(依某种规则,放在更上方或更下方)的就更换,然后依次类推。得到一定顺序的数组。

7.5.2 冒泡排序Bubble sort
从数组最后一个开始,相邻若下方元素小于上方,走交换位置,最小的元素会“冒”在数组顶部。

7.5.3 插入排序Insertion sort
数组有两个元素时,先进行比较和更换,据此把第三个元素置于合适位置。如果找到一个位置,要插入的元素比数组中这个元素更小,那么就将新元素插入这个位置。

7.6 递归算法
当在一个算法中使用它自己时,这样的算法就叫做递归算法。
在某种程度上调用自己,这个调用就叫递归调用。

~是另一种重复(循环)的控制结构。其使用一个选择语句来确定是否重复算法来调用一遍或停止,而不是用循环语句来执行一个算法。
每个递归算法至少有两种情况:基本情况(答案已知的情况)和一般情况(调用自身来解决问题的更小版本的解决方案)。

7.6.1 子程序语句

7.6.2 递归阶乘

7.6.3 递归二分检索

7.6.4 快速排序
其基本策略是分治法

7.7 几个重要思想
7.7.1 信息隐蔽

7.7.2 抽象


7.7.3 事物命名

7.7.4 测试
白盒测试基于代码本身
黑盒测试基于测试所有输入的可能值

posted on   20221417wzy  阅读(355)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示