程序设计、数据结构和算法(PDA)
数据科学家应能够实施和理解数据收集于分析算法,并将其与现有软件和/或工具继承,他们应了解算法的时间和空间考量因素,以及与数值计算有关的特殊问题。
请注意,本质是领域借鉴了CS2013的多个知识领域,但并不重复:算法与复杂性(AL)、计算科学(CN)、编程语言(PL)和软件开发基础(SDF)。
范围 | 能力 |
---|---|
|
|
子领域 | |
PDA-算法思维与问题解决-T1、T2 PDA-编程-T1、T2、E PDA-数据结构-T1、T2、E |
PDA-算法-T1、T2、E PDA-基本复杂性分析-T1、T2 PDA-数值计算-T1、T2 |
PDA-算法思维与问题解决
为了开发正确、搞笑、清晰和可用的代码(无论是在数据分析和展示过程中还是在生产级系统中),数据科学家应具备基本的算法问题解决技能。
知识
T1:
- 算法定义。
- 算法在解决问题过程中的重要性。
- 至少一种解决问题的正式方法。
- 面向对象的基本设计概念和原则。
- 抽象。
- 封装和信息隐藏。
- 行为和实现分析。
技能
T1:
- 使用代码以外的形式(如流程图或伪代码)描述问题解决方案。
- 以某种形式(如数据流图)绘制问题解决方案的数据流(输入、转换、输出)图。
- 确定输入(如数据、超参数、用户响应)和输出,这对执行程序解决问题至关重要。
- 识别多种抽象数据类型的数据组件和行为(参见PDA-数据结构)。
T2:
- 至少使用一种正式的方法来解决问题。
品行
T1:
- 准确描述算法和程序,算法不同于程序。
- 准确理解将大型问题分解为可实现的解决方案并用某种形式表达这些解决方案的原则性方法。
PDA-编程
为了收集、分析和展示数据,数据科学家需要发展编程技能,并应精通基本的编程结构。由于数据科学家将于许多系统对接,因此他们应该能够开发独立或与现有软件和/或工具集成的程序。
知识
T1:
- 核心编程概念。
- 变量和原始数据类型。
- 表达式和赋值。
- 条件和迭代控制结构。
- 循环函数。
- 函数和参数传递。
- 简单输入/输出,包括文件或其他静态数据源。
- 异常情况。
- 核心实践。
- 文档。
- 测试。
- 版本控制。
- 将程序分解为更小的片段。
- 错误类型(语法、逻辑、运行时)、可能发生的方式及其处理方式。
- 查询和解析数据源的方法。
T2:
- 定期重构和程序维护。
- 各种测试和调试策略。
- 应用程序接口的效用,何时寻找应用程序接口。
E:
- 高级概念。
- 内联/匿名函数(如Python中的Lambda函数)。
- 函数和程序的变量参数表。
- 类和对象。
技能
- 编写包含上述核心概念和实现的计划。
- 推到代码段的执行,并阐明其计算概要。
- 运用分解技术将程序分解成更小的代码片段。
- 利用适当的技术(如数据库查询、API调用、正则表达式)处理来自选定来源(如数据库、电子表格、文本文档、XML)的数据。
- 使用循环和迭代构建程序解决方案。
- 使用一致的文档和编程风格标准,以提高软件的可读性和可维护性。
- 应用测试和调试程序的策略。
T2:
- 说明定期重构和维护程序的必要性。
- 按照核心实践对程序进行重构、维护和改进。
- 使用类和对象构建程序解决方案。
- 使用现代集成开发环境和相关工具(如单元测试工具和可视化调试器)开发程序。
- 使用编程语言提供的标准程序库构建程序。
- 将典型的应用程序接口(API)集成到软件中。
E:
- 使用模板和通用功能有效设计和实施程序解决方案。
- 设计并实施独特的应用程序接口(API)。
- 使用专门技术(如自然语言处理、图像处理等)收集和解析数据(参考知识域:数据采集、管理和治理)。
- 阅读、理解、编写和调试包含高级概念的程序。
品行
T1:
- 坚定的致力于在编程实践中运用软件工程概念和设计原则(参考知识域:软件开发与维护)。
- 主动超越直接传授的知识。认识到编程结构和方法是通用的,在许多情况下都有用。
- 超越简单的解决方案,用于创新。数据科学家不应拘泥于调整现有解决方案。
PDA-数据结构
为了编写有效和高效的代码,数据科学家应该了解各种数据结构,能够使用它们并理解选择一种数据结构对另一种数据结构的影响。鉴于矩阵在许多数据科学应用中的作用,这里将特别关注矩阵的表示和操作。
知识
T1:
- 基本数据结构和抽象数据类型(ADT)(列表、数组、堆栈、队列、字符串、集合、记录/结构、映射、哈希表)。
- 目的。
- 用法。
- 基本矩阵表示结构(稀疏/密集、行、列)
- 矩阵表示类型。
- 基于表示类型的基本矩阵运算的利弊。
T2:
- 高级结构(树、图)。
- 目的。
- 用法。
E:
- 矩阵操作优化。
技能
T1:
- 在编程中适当选择基本数据结构。
- 适当使用特定编程语言的标准数据类型库。
T2:
- 在编程中适当选择高级数据类型。
- 适当使用特定编程语言的标准库。
E:
- 实施连贯的抽象数据类型,在组件和行为之间实现松散耦合。
- 比较/对比各种数据结构的标准操作(如查找、插入、删除)的时间/空间。
品行
T1:
- 实施和数据结构选择的彻底性及其对使用、效率(时间/空间)和可读性的影响。
PDA-算法
数据科学家应认识到,算法的选择会对解决问题所需的时间和空间产生影响,数据科学家应熟悉一系列算法技术,以便在特定情况下选择合适的算法。
知识
T1:
- 简单的数据算法,如计算列表的平均值、找出列表中的最小值、最大值或模式。
- 排序和搜索。
- 顺序搜索和二分搜索。
- O($n^2$)(如插入)和O(n$\log$n)(如合并)排序。
- 搜索和排序的随机算法(如快速排序)。
- 基于散列的搜索和排序的潜在效率优势。
- 图的属性:连通性、间距、中心性等。
- 图形算法。
- 基本算法策略,如贪婪、分治。
- 线性系统求解算法。
T2:
- 组合优化问题算法。
- 启发式优化技术。
E:
- 散列和散列函数。
技能
T1:
- 应用简单的数据算法(如计算平均数、求最小值等)。
- 应用搜索和排序算法。
- 对比各种基于数组的搜索和排序算法的利弊。
- 使用广度或深度优先算法的一般框架执行图或树的遍历。
- 使用高效的算法(如贪婪算法)找出图或树中的最短路径。
- 在适当的问题中应用线性系统求解器。
T2:
- 使用高效算法识别通过图或树的最大或最小流。
- 使用组合优化问题的常用算法(如分治和边界算法)。
- 在适当的问题上应用启发式优化技术(粒子群、遗传算法、进化)。
- 针对适当的问题实施动态编程解决方案。
E:
- 在分布式系统或数据上实施或使用搜索/排序算法。
- 在上下文中比较散列函数。
- 图表。
- 执行遍历、最短路径和流量算法。
- 分析随机算法。
品行
T1:
- 在选择算法技术时要灵活准确,要知道通常有多种算法技术可以成功解决某个问题。
- 清楚地认识到算法的选择对效率有重大影响。
- 敏锐地认识到效率(时间、空间)对客户、消费者和维护者等所有代码利益相关方的影响。
PRA-基本复杂性分析
数据科学家应了解解决问题所需的时间和空间,并应知道某些问题可能无法在合理的时间内解决。他们还应考虑到运行代码的平台将如何安排任务。
知识
T1:
- 时间和空间复杂性的定义。
- 算法的最佳情况、预期情况和最差情况之间的差异。
- 在管理时间和空间复杂性方面权衡利弊。
- 用于分析算法的分类标准,例如:
- 确定性与非确定性。
- 时间/空间层次。
技能
T1:
- 对算法效率(如操作次数)进行非正式比较。
- 在不同大小的输入上执行算法并比较性能。
- 举例说明实现和算法选择对执行时间或空间的影响。
- 解释问题表征/数据结构和算法之间的关系/耦合。
T2:
- 正式应用各种分类标准来理解算法。
品行
T1:
- 全面评估空间/时间复杂性。在管理时间和空间复杂性时可能需要权衡利弊,并了解这些全很利弊对客户/软件用户的影响。
PRA-数值计算
数据科学家解决问题的类型通常涉及数值计算,数据科学家应了解数值表示的能力和限制,他们还应了解标准数值计算算法及其用途。
知识
T1:
- 随机数生成器(RNG)。
- 概率分布模拟。
- 用比特表示数值的局限性及其对结果中误差的累积(溢出、下溢、舍入、截断)的影响。
- 数字表示法对计算法杂性的影响。
T2:
- 用于数据分析的高级数值算法所涉及的算法和数学方法,如:
- 主成分分析(PCA)。
- 奇异值分解(DVD)。
- 特征值分解。
- 牛顿法。
- 蒙特卡罗模拟。
- 良好的问题表征与解决数字问题的数学模型之间的联系,例如:
- 使用SVD表示文件。
- 用邻接表或稀疏矩阵表示图形。
- 用KD数表示度量空间。
技能
T1:
- 描述数值计算算法和流程如何影响模拟执行、数据采样和数据生成。
- 描述适当的数值计算算法,以进行数据分析,并认识到其局限性和数值驱动的限制。
- 使用随机数生成器和模拟概率分布来:
- 利用非确定性算法实现数据分布的可重复性。
- 在算法中引入非确定性,以确保适当的统计和数值条件。
T2:
- 应用适当的数字算法解决各类问题,算法可能包括(非详尽、不分优先级):
- 主成分分析(PCA)。
- 奇异值分解(DVD)。
- 特征值分解。
- 牛顿法。
- 蒙特卡罗模拟。
品行
T1:
- 精通(伪)随机数生成的优势和局限性。
- 敏锐地认识到数值计算算法的局限性。