计算思维、解决问题和编程
计算机科学有时被定义为对算法及其在计算机中的高效实现的研究。现在的重点是它们在解决问题中的作用、开发它们的策略、遵循和测试它们的技巧。由于算法对数据进行操作,我们研究了对数据进行结构化以便更有效地处理它的方法。
4.1.1 确定解决问题的适当程序。
一般来说,所有问题都从一个想法开始。找到这些信息与解决方案之间的联系是解决问题的核心。为此,可以利用以下策略。
提出问题
当口头给出一个问题或任务时,通常会提出问题,直到完全清楚地了解需要什么。一般来说,询问何时、为何和何地,直到任务完全明确。如果指令是书面的,可能会在页边空白处打问号;下划线一个词、一组词或一个句子;或者以其他方式指示不清楚的任务部分。也许问题会在后面的段落中得到解答,或者可能需要与给出任务的人讨论。如果任务是自定的,这种提问可能不是口头的,而是发生在潜意识层面。
- 在这种情况下,应该考虑的一些典型问题是
- 我应该了解问题的什么?
- 解决方案是什么样的?
- 存在哪些特殊情况?
- 我如何才能认出我已经找到了解决方案?
不要重新发明轮子。利用以前解决问题的相似之处。这是一种模式识别形式。
4.1.2 评估执行活动的顺序是否会产生所需的结果。
我们不断地将一个大问题分解成我们可以处理的更小的单元。打扫房子或公寓的任务可能看起来很可怕。由打扫客厅、餐厅、厨房、卧室和浴室组成的任务似乎更容易管理。这个原则对计算特别重要。
4.1.3 解释子程序在解决问题中的作用。
不要重新发明轮子。如果存在解决方案,请使用它。如果你以前解决过相同或类似的问题,只需重复成功的解决方案。我们通常不会有意识地想,“我以前见过这个,我知道该怎么做”——我们只是去做。人类擅长识别类似的情况。我们不必学习如何去商店买牛奶,然后买鸡蛋,然后买糖果。我们知道去商店总是相同的,只有我们买的东西不同。
在计算中,识别熟悉的情况特别有用。在计算中,你会反复看到某些问题以不同的形式出现。一个优秀的程序员会看到一个任务,或者可能是一个任务的一部分(子任务),它以前被解决过,并插入解决方案。例如,在温度列表中找到每日最高和最低温度与在测试分数列表中找到最高和最低分数完全相同的问题。你想要在一组数字中找到最大和最小值。
4.1.4 确定在特定情况下需要决策时。
4.1.5 确定解决特定问题的所需决策。
4.1.6 确定特定问题中给定决策相关的条件。
4.1.7 解释系统决策和条件之间的关系。
4.1.8 推断现实世界情况的逻辑规则。
4.1.9 确定解决方案中所需的输入和输出。
4.1.10 确定建议的问题和解决方案中的预先计划。
4.1.11 解释执行算法时需要先决条件的原因。
4.1.12 概述特定问题的先决条件和后置条件。
4.1.13 确定需要在特定问题解决方案中考虑的例外情况。
4.1.14 确定解决方案中可以并发执行的部分。
4.1.15 描述如何使用并发处理来解决问题。
4.1.16 评估在解决问题时使用并发处理的决定。
并发处理允许更快的计算,因为多个任务同时运行。但是,并发处理的编程难度要大得多。
4.1.17 识别抽象的例子。
4.1.18 解释为什么在为特定情况推导出计算解决方案时需要抽象。
4.1.19 从特定情况构建抽象。
4.1.20 区分现实世界实体及其抽象。
4.2.1 描述线性数组上标准算法的特征。
在计算机科学领域存在着大量算法,但排序和搜索是最重要的两种类型。
顺序搜索,或线性搜索,是最简单的搜索算法;它是暴力搜索的一种特殊情况。其最坏情况下的成本与列表中元素的数量成正比;如果所有列表元素都等可能地被搜索,则其预期成本也是如此。因此,如果列表包含多个元素,其他方法(如二分搜索或哈希)将更快,但它们也施加了额外的要求。
二分搜索
这依赖于线性数组按顺序排序。假设我们要查找 X。
- 从中间元素开始。
- X 大于或等于该元素吗?
- 如果是,则从总体中移除所有小于该元素的元素。
- 移动到新总体的中间并重复。
注意“中间”始终是偶数集合中较大的元素。
冒泡排序
假设我们正在将数字列表从最低到最高排序。
- 从左边开始,将该数字 X 与其右边的数字 Y 进行比较。
- 如果 X>Y,则交换 X 和 Y 的位置。
- 重复整个列表。
- 重复整个过程,直到在完整遍历中不需要任何切换。
选择排序
从低到高排序的最简单方法。
- 遍历整个总体,找到最小的。
- 将最小的移动到最左边。
- 忽略已排序的元素,以相同的方式遍历总体中的其余部分。
4.2.2 概述集合的标准操作。
4.2.3 讨论解决特定问题的算法。
4.2.4 分析作为流程图呈现的算法。
4.2.5 分析作为伪代码呈现的算法。
4.2.6 构建伪代码来表示算法。
4.2.7 建议合适的算法来解决特定问题。
4.2.8 推断算法在其使用环境中的效率。
4.2.9 确定对于给定的输入数据,算法中的某个步骤将执行的次数。
4.3.1 陈述计算机的基本操作。
4.3.2 区分计算机的基本操作和复合操作。
4.3.3 解释计算机语言的基本特征。
4.3.4 解释需要高级语言的原因。
4.3.5 概述从高级语言到机器可执行代码的翻译过程的必要性。
4.3.6 定义术语:变量、常量、运算符、对象。
4.3.7 {{{2}}}
4.3.8 分析算法中变量、常量和运算符的使用。
4.3.9 使用循环、分支构建算法。
4.3.10 描述集合的特征和应用。
4.3.11 使用集合的访问方法构建算法。
4.3.12 讨论在程序化解决方案中需要子程序和集合的原因。
4.3.13 使用预定义的子程序、一维数组和/或集合构建算法。