单元 2.1 计算思维的要素
外观
< A-level 计算机 | OCR
- 抽象 – 将思想与这些思想在工作中的具体实例分离的过程。计算结构由其含义定义,同时隐藏了它们如何工作的细节。抽象试图从通用模式中提取细节,以便程序员可以在接近人类思想的水平上工作,忽略在实践中很重要但与要解决的问题无关的细节。
- 抽象模型 – 任何从现实生活情况或问题中提取或基于(抽象)的系统模型。
- 递归 – 一种高级编程结构,其中代码块(通常是函数)能够调用自身。递归算法必须仔细设计,以便满足终止条件。
- 函数 – 在程序中赋予唯一可识别名称的代码块。函数在被调用时可以接受 0 个或多个参数,并且应该返回一个值。该函数应该被设计和编写为执行一项任务或操作,该任务或操作由其名称清楚地指示。
- 参数 – 在程序或函数最初被调用时传递给它的数据结构。
- 按值传递 – 如果一个参数按值传递,则子程序中使用的是数据的副本,该副本在子程序退出时被丢弃。
- 按引用传递 – 如果一个参数按引用传递,则使用的是变量的位置(在内存中)。这意味着任何更改都会影响主程序中的变量,因此在子程序退出后会保留。
- 并发处理 – 在系统设计或编程中,当您希望同时发生多件事时,任何情况。
- 流水线 – 同时解码两个或多个机器指令。当第一个指令的一部分(例如地址字段)被解码时,第二个指令的另一部分(例如操作码)也可以被解码。
- 分解 – 将问题分解成更小的、更容易解决的部分。较小的部分有时可以递归地解决 → 一遍又一遍地解决,直到问题得到解决。
- 面向对象编程 – 一个由相互交互的对象组成的程序。例如 Java。
- 兼容性 – 问题是否可以用算法解决。
- 速度 – 限制因素。随着更大功率的可用,我们可以使用计算机解决更多问题。
- 解决问题是人机之间的合作。
- 有些问题永远无法由计算机解决。
问题识别
- 首先识别问题很重要
- 使用计算和直觉方法,可能能够找到解决方案
回溯
一种解决问题的算法方法,其中问题的部分解决方案被构建为一条路径 → 如果路径在某一点失败,搜索将从最后一个潜在的成功点开始。
数据挖掘
- 遍历大量可能来自多个来源的数据
- 对搜索对偶然观察者来说并不明显的联系和事实很有用。
- 当数据来自未以相同方式结构化的数据集时使用。
- 例如,超市会员卡计划。
- 执行搜索以尝试查找模式。
- 将显示是否某些产品一起被同一个人或同一人口统计群体购买。
- 有助于解决问题的算法被称为“模式匹配”或“异常检测”。
数据挖掘之所以成为可能,是因为
- 大型数据库
- 更快的处理
流水线
- "当一条指令被获取时,之前的指令被解码,再之前的指令被执行,所有这些都同时发生"
- 一个过程的输出是另一个过程的输入
- 在 RISC 结构中很有用。
可视化解决问题
- 以易于理解的形式呈现数据。
- 最简单 → 将表格数据作为图表呈现
- 可以使以前未被注意的事实和趋势变得显而易见。
- 抽象是一个现实概念。
- 通常使用符号来代表问题的组成部分,以便人类思维或计算代理可以处理该问题。
- 关于找出在一个场景中什么重要,什么不重要。
- 通过让我们分离出组件并决定哪些重要,它有助于最大限度地提高我们解决问题的可能性。
抽象与现实世界问题
- 没有抽象,使用计算机来解决现实世界的问题是不可能的。
- 变量是抽象的。它们代表计算中的现实世界值或中间值。
抽象层次
- 在一个复杂系统中,通常使用抽象来表示一个大问题并创建更低级的抽象来处理组件部分。
- 这种方法的强大之处在于,每个抽象层中的细节都可以对其他层隐藏起来。
- 解放了解决过程,可以专注于一次解决一个问题,或者将不同的子问题发送给不同的员工或不同的公司来处理。
- 分层广泛存在于任何大型系统的构建中。
- 层是将系统功能划分为单独区域的一种方式。
- 相同的原则可以应用于物理物品(例如汽车)。
计算机科学家在编写系统时,会
- 确定所需的输出
- 确定实现输出所需的必要操作
- 确定防止程序崩溃的任何先决条件
- 考虑所需的资源
- 考虑用户的期望
任何人都可以使用这些策略来
- 决定要实现什么
- 确定先决条件
- 确定什么是可能的
计算机示例:缓存
人类示例:想要成为计算机专业人士的人需要确定
- 在 A 级别学习的科目
- 在所选 A 级别科目中获得的分数
- 他们有什么能力
- 他们需要投入多少工作
- 技能集的潜在需求 – 现在和将来
预取
- 预期的指令在需要之前被获取并放置在缓存中,可以从中快速获取,因此访问速度较慢的 RAM 时不会出现延迟。
对可重用程序组件的需求
- 从商业角度和支持未来发展的工具角度来看都很重要
- 大多数系统都是通过组合在其他系统中使用过的现有组件来设计的
- 在软件中越来越受欢迎。
好处
- 提高可靠性 – 比新软件更可靠(错误和故障已经确定)
- 降低过程风险 – 现有软件的成本已知,而开发成本是判断问题。
- 有效利用专家 – 避免专家重复做相同的工作。可以开发封装他们知识的可重用软件。
- 符合标准 – 一些标准(例如用户界面标准)可以实现为一组可重用组件。可以用来确保所有应用程序都具有相同的菜单格式。
- 加速开发 – 可以加快系统生产,因为开发和验证时间可以减少。
缺点
- 维护成本增加 – 由于可重用组件与系统更改可能不兼容,因此维护成本可能更高。
- 缺乏工具支持 – 不支持开发重用。将这些工具与计算机库系统集成可能很困难。
- 非我所创系统 – 宁愿重新编写,因为他们可以改进它们。
- 创建、维护和使用组件库 – 填充库并确保开发人员知道如何使用库可能很昂贵。已经开发出流程来确保库的使用。
- 查找、理解和调整可重用组件 – 必须在库中发现可重用组件,并理解和调整以适应新环境。
示例 – NASA 如何在新视野号任务中超前思考?
- 他们如何在无人值守的情况下维护设备。
- 成本与回报
- 他们将如何为其供电?
- 他们将如何将信息传回地球?他们如何收集信息?
- 需要多长时间?速度
- 飞越任务还是轨道任务?
- 潜在的未知因素
- 需要什么设备
- 未来的潜在任务
缓存
- 输入的数据可能会存储在 RAM 中,以备在进程关闭之前再次需要时使用。
- 如果需要,它不需要从磁盘再次读取 → 创建更快的响应时间。
- 预取 → 在指令需要之前从内存中请求指令,以加快处理速度。
优点
- 可以减少网络服务器的负载,因为可以预测所需的数据
缺点
- 实现起来可能很复杂
- 如果缓存了错误的数据,则很难重新建立正确的数据序列。
输入和输出
- 分析师首先要做的事情之一就是确定需要哪些输出。
- 系统的设计者需要确保在需要的时候有正确的输入,以确保能够实现输出。
关于分解 → 用于使问题更易于管理。
- 任何大型问题都被分解成更小的子问题。
- 最终它们将等同于一个程序模块或一组模块。
- 需要考虑执行顺序 - 可能需要在一个模块处理数据,然后另一个模块才能使用它。
- 有些需要以不可预测的方式访问。
- 大型人类项目也受益于同样的方法(例如建造房屋)。
顺序
- 在规划解决方案时,顺序可能重要也可能不重要。
- 事件驱动的场景 - 顺序可能不可预测。
- 在其他情况下,顺序可能很重要,因为有时你无法完成一项任务,除非先完成另一项任务。
.
在规划程序时,识别决策点是程序设计的关键部分。可以使用伪代码、结构化语句或流程图进行规划。
大多数现代计算机可以同时处理多个指令(得益于多核处理器和流水线技术)。
- 这意味着程序需要专门设计以利用这一点。
- 同时处理的模块应该是独立的。
- 设计良好的程序可以节省大量的处理时间。
- 人类活动也从中受益。
- 甘特图通常用于可视化同时进行的项目。
并行处理器
- 使程序的不同部分能够同时执行。
- 多核处理器也变得越来越普遍。
- 潜在优势 → 程序执行速度更快,并节省能源。
- 程序必须专门编写以利用并行处理,这可能使它们更长、更复杂。
- 如果指令必须按顺序执行,则可能不会节省太多时间。