内容正文:
2.3 用算法解决问题的过程
班级:__________ 姓名:__________ 学号:__________ 得分:__________
【知识点梳理】
一、用算法解决问题的一般过程
用计算机算法解决问题一般需要经历以下三个主要阶段:
1. 抽象与建模:分析问题,明确问题的需求和约束条件,提取问题中的关键要素,并用数学语言或形式化的方法描述问题,建立问题的数学模型(计算模型)。
2. 设计算法:在建立的计算模型基础上,遵循算法的特征(有穷性、确定性、可行性等),围绕算法的要素(数据、运算、控制转移),设计出解决问题的具体步骤和方法。
3. 描述算法:选择合适的算法描述方式(自然语言、流程图、伪代码或程序设计语言),将设计好的算法清晰、准确地表达出来,便于交流、检查和实现。
此外,算法设计完成后,还需要对算法进行验证和测试,检查算法是否正确、是否高效,发现问题及时修正。
二、抽象与建模
抽象是指从具体问题中提取出本质的、关键的特征和要素,忽略非本质的细节。建模是指用数学语言、符号或形式化的方法来描述问题,建立问题的数学模型(计算模型)。
抽象与建模的一般步骤:
1. 明确问题:清晰地描述问题,明确已知条件(输入)和要求的结果(输出)。
2. 提炼核心要素:从问题中提取出关键的变量、常量和它们之间的关系。
3. 建立数学模型:用数学表达式、方程、不等式或其他形式化方法描述要素之间的关系。
例如:"鸡兔同笼"问题中,已知鸡和兔的总头数和总脚数,求鸡和兔各有多少只。我们可以设鸡有x只,兔有y只,建立方程组:x+y=总头数,2x+4y=总脚数。这就是抽象与建模的过程。
三、设计算法
设计算法是解决问题的核心环节。有了计算模型后,就需要设计具体的操作步骤来求解模型。
算法设计的总体思路:对任何数据的处理,总体上都需要经历三个步骤——①输入数据;②处理数据;③输出处理结果。
设计算法时需要注意:
1. 遵循算法的五个基本特征:有穷性、确定性、可行性、输入、输出。
2. 合理选择控制结构:根据问题的特点,选择合适的顺序、分支、循环结构来组织算法步骤。
3. 考虑算法的效率:在保证正确性的前提下,尽量设计出执行效率高、占用资源少的算法。
4. 考虑算法的可读性和可维护性:算法步骤应清晰、简洁,便于理解和修改。
四、描述算法
描述算法就是将设计好的算法用某种方式表达出来。常见的算法描述方式有四种:自然语言、流程图、伪代码和计算机程序设计语言。
选择算法描述方式时需要考虑:①描述的对象和目的(是给人看还是给计算机执行);②问题的复杂程度;③描述者的熟悉程度。
在算法设计和学习阶段,流程图因其直观、清晰的特点,是最常用的算法描述方式。在算法实现阶段,则需要使用具体的程序设计语言编写代码。
五、算法的验证与优化
算法设计完成后,需要进行验证和测试:
1. 正确性验证:用一些已知结果的测试数据运行算法,检查输出结果是否正确。需要测试正常情况、边界情况和异常情况。
2. 效率分析:分析算法的时间复杂度(运行时间)和空间复杂度(占用存储空间),评估算法的性能。
3. 算法优化:如果发现算法存在错误或效率不高,需要对算法进行修改和优化,提高算法的正确性和效率。
【课后练习】
一、单项选择题(每题2分,共30分)
1. 用计算机算法解决问题的一般过程,排序正确的是( )
A. 设计算法→抽象与建模→描述算法
B. 抽象与建模→设计算法→描述算法
C. 描述算法→设计算法→抽象与建模
D. 抽象与建模→描述算法→设计算法
2. 在"鸡兔同笼"问题中,设鸡有x只,兔有y只,列出方程组x+y=35,2x+4y=94。这一过程属于( )
A. 抽象与建模
B. 设计算法
C. 描述算法
D. 验证算法
3. 设计算法时,对数据处理的总体步骤通常是( )
A. 处理数据→输入数据→输出结果
B. 输入数据→处理数据→输出结果
C. 输出结果→输入数据→处理数据
D. 输入数据→输出结果→处理数据
4. 下列关于抽象与建模的说法,错误的是( )
A. 抽象是提取问题的本质特征,忽略非本质细节
B. 建模是用数学语言或形式化方法描述问题
C. 建模时需要考虑所有细节,不能忽略任何信息
D. 建立的数学模型应该能准确反映问题的本质
5. 在算法设计阶段,最常用的算法描述方式是( )
A. 自然语言
B. 流程图
C. 伪代码
D. 程序设计语言
6. 算法设计完成后,需要进行验证。下列不属于验证内容的是( )
A. 检查算法是否正确
B. 分析算法的执行效率
C. 检查算法是否美观
D. 测试边界情况是否正确
7. 某同学要设计一个计算班级平均分的算法,首先需要明确的是( )
A. 使用什么编程语言
B. 输入什么数据、输出什么结果
C. 画什么样的流程图
D. 用循环还是分支结构
8. 下列关于算法设计的说法,正确的是( )
A. 算法设计只需要考虑正确性,不需要考虑效率
B. 设计算法时应合理选择控制结构
C. 算法步骤越复杂越好
D. 设计好的算法不需要再修改
9. "百钱买百鸡"问题:公鸡5元一只,母鸡3元一只,小鸡1元三只,用100元买100只鸡,问各买多少只。解决这个问题最适合使用的算法策略是( )
A. 解析法(直接列方程求解)
B. 枚举法(逐一列举所有可能情况进行判断)
C. 排序法
D. 查找法
10. 在建立数学模型时,下列做法正确的是( )
A. 把问题的所有细节都纳入模型
B. 只提取关键要素和本质关系
C. 不需要明确已知条件和求解目标
D. 模型越复杂越好
11. 用自然语言描述算法的优点是( )
A. 形象直观
B. 通俗易懂
C. 不会产生歧义
D. 可以直接运行
12. 算法的时间复杂度是指( )
A. 算法运行所需要的时间
B. 算法代码的长度
C. 算法占用的存储空间
D. 算法的输入数据量
13. 设计一个求两个数最大公约数的算法,最经典的方法是( )
A. 枚举法
B. 辗转相除法(欧几里得算法)
C. 冒泡排序
D. 二分查找
14. 在算法验证阶段,测试边界情况的目的是( )
A. 检查算法在极端情况下是否正确
B. 测试算法的运行速度
C. 检查算法代码是否美观
D. 测试算法的输入是否方便
15. 下列关于算法优化的说法,错误的是( )
A. 算法优化可以提高执行效率
B. 算法优化可以减少资源占用
C. 优化后的算法一定比原来的算法正确
D. 算法优化需要在保证正确性的前提下进行
二、判断题(每题1分,共10分。正确打"√",错误打"×")
16. 用算法解决问题时,应该先设计算法,再进行抽象与建模。( )
17. 抽象与建模时,需要忽略非本质的细节,只保留关键要素。( )
18. 设计算法时,只需要考虑输入和输出,不需要考虑处理过程。( )
19. 流程图是算法设计阶段最常用的描述方式之一。( )
20. 算法设计完成后就可以直接使用,不需要验证和测试。( )
21. 建立数学模型是用算法解决问题的第一步。( )
22. 枚举法的基本思想是逐一列举所有可能情况,然后判断是否满足条件。( )
23. 算法的空间复杂度是指算法运行所需要的存储空间。( )
24. 用程序设计语言描述的算法可以直接在计算机上运行。( )
25. 算法优化时,可以牺牲正确性来换取更高的效率。( )
三、填空题(每空2分,共20分)
26. 用算法解决问题的一般过程是:________、设计算法、________。
27. 抽象是从具体问题中提取________的特征和要素,忽略________的细节。
28. 对数据处理的总体步骤通常是:输入数据→________→输出结果。
29. 常见的算法描述方式有自然语言、________、伪代码和________。
30. 算法验证包括________验证和________分析。
31. 逐一列举所有可能情况,然后判断是否满足条件的算法策略称为________法。
四、简答题(每题8分,共16分)
32. 请简述用算法解决问题的三个主要阶段及其主要任务。
33. 什么是枚举法?请举例说明在什么情况下适合使用枚举法,并说明枚举法的优缺点。
五、综合应用题(共14分)
34. 阅读材料,回答问题。
材料:某学校运动会要进行100米短跑比赛,共有n名选手参加。比赛结束后,裁判记录了每名选手的成绩(秒数)。现在需要编写一个算法,从这些成绩中找出跑得最快的选手(即成绩最小的选手)及其成绩。
(1)请对上述问题进行抽象与建模:明确输入是什么、输出是什么,并用数学语言描述问题。(5分)
(2)请设计一个解决该问题的算法,用自然语言描述算法步骤。(提示:可以使用"打擂台"的方法,先假设第一个人是最快的,然后依次与其他人比较)(6分)
(3)上述算法中需要使用哪种控制结构来实现逐个比较?(3分)
【参考答案】
一、单项选择题
1.B 2.A 3.B 4.C 5.B 6.C 7.B 8.B 9.B 10.B 11.B 12.A 13.B 14.A 15.C
二、判断题
16.×(先抽象建模,再设计算法) 17.√ 18.×(需要考虑处理过程) 19.√ 20.×(需要验证和测试) 21.√ 22.√ 23.√ 24.√ 25.×(不能牺牲正确性)
三、填空题
26. 抽象与建模;描述算法
27. 本质(关键);非本质
28. 处理数据
29. 流程图;计算机程序设计语言(顺序可互换)
30. 正确性;效率(或时间复杂度和空间复杂度)
31. 枚举
四、简答题
32. 参考答案:
用算法解决问题的三个主要阶段及任务:
①抽象与建模:分析问题,明确问题的需求和约束条件,提取问题中的关键要素,并用数学语言或形式化方法描述问题,建立问题的数学模型(计算模型)。这是解决问题的基础和前提。(3分)
②设计算法:在建立的计算模型基础上,遵循算法的特征,围绕算法的要素,设计出解决问题的具体步骤和方法。需要合理选择控制结构,考虑算法的正确性和效率。这是解决问题的核心环节。(3分)
③描述算法:选择合适的算法描述方式(自然语言、流程图、伪代码或程序设计语言),将设计好的算法清晰、准确地表达出来,便于交流、检查和实现。描述后还需要对算法进行验证和测试。(2分)
(共8分)
33. 参考答案:
枚举法(穷举法)是指将问题的所有可能答案一一列举出来,然后根据条件判断每个答案是否合适,保留合适的,舍弃不合适的,从而得到问题的解。(2分)
适用情况:当问题的可能解数量有限且可以逐一列举时,适合使用枚举法。例如:①"百钱买百鸡"问题,公鸡、母鸡、小鸡的数量都有一定范围,可以逐一列举所有组合进行判断;②找100以内的所有素数,可以逐一检查每个数是否为素数;③密码破解中,尝试所有可能的密码组合。(举1个例子即可,2分)
优点:①思路简单,容易理解和实现;②只要列举完整,一定能找到所有解,正确性有保证。(2分)
缺点:①当可能解的数量很大时,枚举的效率很低,需要花费大量时间;②不适合可能解数量无限或非常庞大的问题。(2分)
(共8分)
五、综合应用题
34. 参考答案:
(1)抽象与建模:
输入:n名选手的成绩,记为a₁, a₂, ..., aₙ(单位:秒),以及选手人数n。(2分)
输出:跑得最快的选手的编号(或姓名)及其成绩,即找出成绩最小的那个元素及其位置。(2分)
数学描述:在数列a₁, a₂, ..., aₙ中,找到最小值min(aᵢ)及其对应的下标i(i=1,2,...,n)。(1分)
(共5分)
(2)算法步骤(打擂台法):
第一步:输入选手人数n和n名选手的成绩,存入数组a中(a[1], a[2], ..., a[n]);
第二步:假设第1名选手是最快的,即设当前最好成绩min_score = a[1],最快选手编号min_index = 1;
第三步:设循环变量i=2;
第四步:判断i是否≤n,如果是,转到第五步;否则转到第八步;
第五步:判断a[i]是否小于min_score,如果是,转到第六步;否则转到第七步;
第六步:更新min_score = a[i],min_index = i(第i名选手更快,更新"擂主");
第七步:i = i + 1,转到第四步;
第八步:输出最快选手编号min_index和成绩min_score,算法结束。
(算法逻辑正确、步骤完整即可,6分)
(3)需要使用循环结构来实现逐个比较(同时还需要分支结构进行判断)。(3分)
学科网(北京)股份有限公司
$