算法分析与设计基础
第三章 算法基础 单元教学设计 2023—2024学年粤教版(2019)高中信息技术必修1

《第三章算法基础》教学设计一、单元基本信息学科信息技术实施年级高一设计者课程标准模块《数据与计算》必修1使用教材粤教版单元名称第三章算法基础单元课时 3 课时二、单元教学规划1 .本章对应课标的内容要求从生活实例出发,概述算法的概念与特征,运用恰当的描述方法和控制结构表示简单算法。
2 .本章对应的学业要求A-3:掌握数字化学习的方法。
(信息意识、数字化学习与创新)A-4:能根据需要选用合适的数字化工具开展学习。
(信息意识、数字化学习与创新)A-6:能够利用软件工具或平台对数据进行整理、组织、计算与呈现。
(信息社会责任、计算思维)A-8:在数据分析的基础上,完成分析报告。
(信息社会责任、计算思维)A-9:依据解决问题的需要,设计和表示简单算法。
(计算思维)3. 本章的地位和作用本章是《数据与计算》的第三章,也是学习第四章、选择性必修模块《数据管理与分析》、选修模块《算法初步》的基础知识与技能准备。
本章以培养信息素养为目标,以知识技能为载体,以项目学习活动为途径,开展自主、协作、探究学习,让学生理解算法的概念与特征,能够运用算法描述和三种基本控制结构合理表示算法。
4. 学业目标(1)针对特定的信息问题,自觉、主动地比较不同的信息源,能描述数据与信息的关系,确定合适的信息获取策略。
(信息意识1)(2)根据不同受众的特征,能选择恰当的方式进行有效的交流。
(信息意识 1)(3)依据特定任务需求,甄别不同信息获取方法的优劣,并能利用适当途径甄别信息。
(信息意识1)(4)主动关注信息技术工具发展中的新动向和新趋势,有意识地使用新技术处理信息。
(信息意识1)(5)针对给定的任务进行需求分析,明确需要解决的关键问题。
(计算思维 1)(6)能提取问题的基本特征,进行抽象处理,并用形式化的方法表述问题。
(计算思维1)(7)运用基本算法设计解决问题的方案。
(计算思维1)(8)针对特定的学习任务,运用一定的数字化学习策略管理学习过程与资源,完成任务,创作作品。
算法对数学的要求

算法对数学的要求
算法与数学有密切的关系,尤其是在计算机科学和信息技术领域。
算法是一系列解决问题的步骤和规则,而数学为算法提供了理论基础和分析工具。
以下是算法对数学的一些要求:
基础数学知识:对算法进行深入理解通常需要扎实的基础数学知识,包括但不限于代数、离散数学、概率论、数理逻辑等。
数学建模:在算法设计过程中,数学模型的建立和分析是至关重要的。
这包括了问题的抽象、符号表示以及模型的数学描述。
复杂性分析:算法的时间复杂性和空间复杂性分析需要运用数学工具。
大O表示法、渐近符号以及其他数学概念被用于衡量算法的效率和性能。
图论:许多算法问题可以用图论来建模,因此对于图的理论有一定的要求,包括图的遍历、最短路径、图的连通性等。
概率和统计:在设计一些随机算法或者对算法进行概率分析时,需要运用概率和统计学的知识。
离散数学:离散数学的概念,如集合论、关系、图论等,通常
被应用于算法的设计和分析。
线性代数:在一些数值计算和机器学习算法中,线性代数的知识是必不可少的,尤其是矩阵运算等方面。
数值分析:对于涉及数值计算的算法,数值分析的概念和技术对确保算法的数值稳定性和收敛性非常重要。
总体而言,虽然不是每个算法都需要深奥的数学知识,但在更高级、更复杂的算法设计和分析中,数学知识往往成为解决问题的关键。
在实际应用中,了解数学背后的原理有助于更好地理解算法的性质、优劣和适用范围。
数据结构的书

数据结构的书以下是一些常见的数据结构书籍推荐:1.《数据结构与算法分析:C语言描述》- 作者:Mark AllenWeiss 这本书以C语言为基础,详细介绍了各种数据结构和算法的实现和分析,并提供了丰富的问题和习题。
2.《算法导论》 - 作者:Thomas H. Cormen, Charles E. Leiserson,Ronald L. Rivest, Clifford Stein 这是一本经典的算法教材,涵盖全面的算法主题和各种数据结构,是算法领域的权威参考。
3.《大话数据结构》 - 作者:程杰这本书通过生动有趣的讲解方式,引入了常见的数据结构和算法,非常适合初学者入门。
4.《数据结构:高级方法与应用》- 作者:T.M. Austin 这本书提供了广泛的数据结构实现示例和应用案例,深入探讨了高级的数据结构和算法设计。
5.《数据结构与算法分析:Java语言描述》 - 作者:Mark AllenWeiss 这本书以Java为基础,介绍了数据结构和算法的实现和分析,同时提供了面向对象编程的角度来理解和应用这些概念。
6.《数据结构与算法分析 in C++》 - 作者:Mark Allen Weiss 这本书使用C++语言进行数据结构和算法的介绍,涵盖了常见的数据结构和算法的实现和分析,提供了丰富的例子和习题。
7.《算法(第4版)》- 作者:Robert Sedgewick, Kevin Wayne这本书以算法为重点,提供了全面的算法和数据结构的讲解,用Java语言实现。
讲解详细,包含大量的示例和练习。
8.《数据结构与算法:Python语言描述》- 作者:Michael T.Goodrich, Roberto Tamassia, Michael H. Goldwasser 这本书以Python作为示例代码的语言,介绍了数据结构和算法的实现,同时还关注类和对象的设计。
9.《数据结构与算法分析 in Java》 - 作者:Mark Allen Weiss 这本书使用Java语言进行数据结构和算法的介绍,对于想要用Java实现数据结构和算法的读者非常适用。
计算机算法设计与分析第五版教学设计

计算机算法设计与分析第五版教学设计一、课程概述本课程是一门计算机科学基础课,旨在介绍计算机算法的基本概念、设计思想、分析方法及其应用。
本课程是计算机理论和实践相结合的重要课程,具有广泛的应用前景和深远的理论意义。
二、教学目标本课程的教学目标是使学生掌握计算机算法的基本概念和设计方法,具备设计和实现高效算法的能力,并了解常用算法的复杂度及其在实际问题中的应用。
具体目标如下:1.理解算法设计的基本思想和方法,能够运用递归、分治策略、动态规划等常见算法设计方法。
2.掌握算法分析的基本思想和方法,能够评估算法的时间和空间复杂度,并了解算法的最优性和稳定性。
3.能够独立设计和实现基本算法,如排序、查找、图论等算法,并对算法的正确性和效率进行评估和分析。
4.了解并掌握一些复杂算法,如字符串匹配、动态规划等,并能运用于实际问题中。
三、课程内容本课程的主要内容包括算法基础、排序和选择、数据结构、图算法、字符串算法、动态规划等内容。
具体内容如下:1.算法基础:算法概念、算法设计、算法分析、算法实现等。
2.排序和选择:插入排序、希尔排序、堆排序、归并排序、快速排序等。
3.数据结构:栈、队列、链表、树、堆、散列表等。
4.图算法:最短路径、最小生成树、拓扑排序等。
5.字符串算法:暴力匹配、KMP算法、BM算法等。
6.动态规划:最长公共子序列、背包问题、最大子段和问题等。
四、教学方法本课程采用理论与实践相结合的教学模式,以讲授和练习相结合的方式进行教学。
具体方法如下:1.讲授:采用课件和教材进行讲解,在重点难点部分补充讲解。
2.实践:通过编写程序、进行实际应用等方式进行实践,并对成果进行评估。
3.作业:通过作业的形式,提高学生对算法的理解和掌握程度。
4.讨论:针对问题进行深入讨论,提高学生对算法问题的认识。
五、评估方法本课程评估包括学生平时表现、作业、考试和项目评估等。
具体方法如下:1.平时表现:包括参与度、作业完成情况、课堂表现等。
第5章 算法与复杂性

5.7 可计算性理论基础
研究计算的可行性和函数算法的理论,又称算法 理论,是算法设计与分析的基础,也是计算机科 学的理论基础。可计算性是函数的一个特性。
5.8 NP问题
NP(Non-deterministic Polynomial)问题是非确定性多 项式问题,是指算法无法直接计算出结果,只能通过进 行一些有选择的“猜算”来得到结果。 NP问题的研究结果有两种可能: 一种是找到了求解问题的算法; 另一种就是求解问题的算法是不存在的,那么就要从数
钥,通常有两个密钥,称为“公钥”和“私钥”,它 们两个必须配对使用,否则不能打开加密文件。
5.10 加密算法
常见加密算法有如下: (1)DES(Data Encryption Standard):数据加密标准,速 度较快,适用于加密大量数据的场合。 (2)3DES(Triple DES):是基于DES,对一块数据用3个不 同的密钥进行3次加密,强度更高; (3)RC2和RC4:用变长密钥对大量数据进行加密,比DES 快。 (4)IDEA(International Data Encryption Algorithm)国 际数据加密算法,使用128位密钥提供非常强的安全性。 (5)RSA:由RSA公司发明,是一个支持变长密钥的公共密 钥算法,需要加密的文件块的长度也是可变的。 (6)DSA(Digital Signature Algorithm):数字签名算法, 是一种标准的DSS(数字签名标准)。
SM4算法、AES算法、DES算法三种分组密码的基础分析

SM4算法、AES算法、DES算法三种分组密码的基础分析 分组密码当中代表性的SM4算法、AES算法、DES算法在计算机和通信系统中起着重要的实际作用,每一种的算法都会有其独有的一份结构,讲解起来其实每一种都有很大的一个篇幅。
在这里主要是把这几种密码算法放在一起做一个简单的分析,也可以通过了解每一种算法来比较一下三者之间的差别。
那么,我们就通过了解SM4算法、AES算法、DES算法这几种有代表性的近代分组密码来讨论一下分组密码的基本理论及其在计算机和通信系统中的实际应用。
1、SM4算法 SM4密码算法是一个分组算法,其算法设计简沽,结构有特点,安全高效。
数据分组长度为128比特,密钥长度为128比特。
加密算法与密钥扩展算法均采取32轮迭代结构。
SM4密码算法以字节8位和字节32位作为单位进行数据处理。
SM4密码算法是对合运算,因此解密算法与加密算法的结构相同,只是轮密钥的使用顺序相反,解密轮密钥是加密轮密钥的逆序。
SM4密码算法结构 SM4算法的基本内容有以下几方面: 基本运算:SM4密码算法使用模2加和循环移位作为基本运算。
基本密码部件:SM4密码算法使用了S盒、非线性变换τ、线性变换部件L、合成变换T基本密码部件。
轮函数:SM4密码算法采用对基本轮函数进行迭代的结构。
利用上述基本密码部件,便可构成轮函数。
SM4密码算法的轮函数是一种以字为处理单位的密码函数。
加密算法:SM4密码算法是一个分组算法。
数据分组长度为128比特,密钥长度为128比特。
加密算法采用32轮迭代结构,每轮使用一个轮密钥。
解密算法:SM4密码算法是对合运算,因此解密算法与加密算法的结构相同,只是轮密铝的使用顺序相反,解密轮密钥是加密轮密钥的逆序。
密钥扩展算法:SM4密码算法使用128位的加密密钥,并采用32轮法代加密结构,每一轮加密使用一个32位的轮密钥,共使用32个轮密钥。
因此需要使用密钥扩展算法,从加密密钥产生出32个轮密钥。
算法设计与分析心得

算法设计与分析心得在当今数字化的时代,算法无处不在,从我们日常使用的手机应用到复杂的科学研究,从金融交易到交通管理,算法都在发挥着至关重要的作用。
作为一名对算法设计与分析充满兴趣和探索欲望的学习者,我在这个领域中经历了一段充满挑战与收获的旅程。
算法,简单来说,就是解决特定问题的一系列清晰、准确的步骤。
它就像是一本精心编写的指南,告诉计算机在面对各种情况时应该如何做出决策和处理数据。
而算法设计与分析,则是研究如何创造出高效、正确的算法,并评估它们在不同场景下的性能。
在学习算法设计的过程中,我深刻认识到了问题的定义和理解是至关重要的第一步。
如果不能清晰地明确问题的要求和约束条件,那么后续的设计工作就很容易偏离方向。
例如,在解决一个排序问题时,我们需要明确是对整数进行排序还是对字符串进行排序,是要求稳定排序还是非稳定排序,以及数据规模的大小等。
只有对这些细节有了准确的把握,我们才能选择合适的算法策略。
选择合适的算法策略是算法设计的核心。
这就像是在众多工具中挑选出最适合完成特定任务的那一个。
常见的算法策略包括分治法、动态规划、贪心算法、回溯法等。
每种策略都有其适用的场景和特点。
分治法将一个大问题分解为若干个规模较小、结构相似的子问题,然后逐个解决子问题,最后合并子问题的解得到原问题的解。
动态规划则通过保存子问题的解来避免重复计算,从而提高效率。
贪心算法在每一步都做出当前看起来最优的选择,希望最终能得到全局最优解。
回溯法则通过不断尝试和回退来寻找问题的解。
以背包问题为例,如果我们要求在有限的背包容量内装入价值最大的物品,贪心算法可能会因为只考虑当前物品的价值而忽略了整体的最优解。
而动态规划则可以通过建立状态转移方程,计算出在不同容量下能获得的最大价值,从而得到准确的最优解。
在实现算法的过程中,代码的准确性和可读性同样重要。
清晰的代码结构和良好的注释能够让我们更容易理解和维护算法。
而且,在实际编程中,还需要考虑边界情况和异常处理,以确保算法的健壮性。
算法-第2章-算法效率分析基础

The Big-O and Related Notations
2.2.7 基本的效率类型
1 log n n n log n n2 n3 2n n! constant logarithmic linear n log n quadratic cubic exponential factorial
思考
2.2.2 符号О
定义1 我们把函数t(n)属于O(g(n)) ,记作t(n) ∈ O(g(n)) ; 它的成立条件是:对于所有足够大的n, t(n) 的上界由g(n) 的常数倍数所确定,也就是说,存在大于0的常数c和非负 的整数n0,使得: 对于所有的n≥ n0来说, t(n) ≤c g(n)
cg(n)
2.2 渐进符号和基本效率类型
2.2.1 非正式的介绍
O(g(n)) 是增长次数小于等于g(n) (以及其常数倍,n趋 向于无穷大)的函数集合。 n∈O(n2),100n+5∈O(n2), n(n-1) /2 ∈O(n2),n3∈/ O(n2), Ω(g(n)),代表增长次数大于等于g(n)(以及其常数倍,n趋 向于无穷大)的函数集合。 n3∈ Ω(n2), n(n-1) /2 ∈ Ω(n2),但是100n+5 ∈/ Ω(n2) Θ(g(n))是增长次数等于g(n) )(以及其常数倍,n趋向于无 穷大)的函数集合。因此,每一个二次方程an2+bn+c在 a>0的情况下都包含在Θ(n2)中,除了无数类似于n2+sin n和n2+log n的函数(你能解释原因吗?)。
t(n) cg(n)
n0之前的情 况无关重要
n n0 符号Ω:t(n)∈Ω(g(n))
2.2.4 符号Θ
定义 3 我们把函数t(n)属于Θ(g(n)) ,记作t(n) ∈Θ(g(n)) ; 它的成立条件是:对于所有足够大的n, t(n) 的上界和下 界都由g(n)的常数倍数所确定,也就是说,存在大于0的 常数c1,c2和和非负的整数n0,使得: 对于所有的n≥ n0来说, c2g(n) ≤t(n) ≤ c1g(n)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
算法分析与设计基础(清华版)Taken from "Introduction to The Design and Analysis of Algorithms" by Anany Levitin节选自《算法设计与分析基础》潘彦译蛮力法就像宝剑不是撬棍一样,科学也很少使用蛮力。
——Edward Lytton (1830 - 1873),leila,第二卷,第一章认真做事常常是浪费时间。
——Robert Byrne,撞球大师,台球选手和作家人们是这样描述它的:蛮力法是一种简单直接地解决问题的方法,常常直接基于问题的描述和所涉及的概念定义。
这里的“力”是指计算机的能“力”,而不是人的智“力”。
我们也可以用“直接做吧!”来描述蛮力法的策略。
而且一般来说,蛮力策略也常常是最容易应用的方法。
虽然巧妙和高效的算法很少来自于蛮力法,但我们不应该忽略它作为一种重要的算法设计策略的地位。
第一,和其他某些策略不同,我们可以应用蛮力法来解决广阔领域的各种问题(实际上,它可能是惟一一种几乎什么问题都能解决的一般性方法)。
具体来说,蛮力法常常用于一些非常基本、但又十分重要的算法,比如计算n个数字的和,求一个列表的最大元素,等等。
第二,对于一些重要的问题来说(比如:排序、查找、矩阵乘法和字符串匹配),蛮力法可以产生一些合理的算法,它们多少具备一些实用价值,而且并不限制实例的规模。
第三,如果要解决的问题实例不多,而且蛮力法可以用一直能够接受的速度对实例求解,那么,设计一个更高效算法所花费的代价很可能是不值得的。
第四,即使效率通常很低,仍然可以用蛮力算法解决一些小规模的问题实例。
最后,一个蛮力算法可以为研究或教学目的服务,例如,它可以作为准绳,来衡量同样问题的更高效算法。
下列这些著名的算法可以看作是蛮力法的例子:基于定义的矩阵乘法算法;选择排序;顺序查找;简单的字符串匹配算法。
穷举查找是解组合问题的一种蛮力方法。
它要求生成问题中的每一个组合对象,选出其中满足该问题约束的对象,然后找出一个期望的对象。
旅行商问题、背包问题和分配问题是典型的能够用穷举查找算法求解的问题,至少在理论上是这样的。
除了相关问题的一些规模非常小的实例,穷举查找法几乎是不实用的。
分治法无论人们在祈祷什么,他们总是在祈祷一个奇迹。
每一个祈祷都可以简化为:伟大的上帝呀,请让两个二相加不等于四吧。
——伊万·屠格涅夫(1818 -1883),俄国作家和短篇小说家分治法可能是最著名的通用算法设计技术了。
虽然它的名气可能和它那好记的名字有关,但它的确是当之无愧的:很多非常有效的算法实际上是这个通用算法的特殊实现。
其实,分治法是按照以下方案工作的:∙将问题的实例划分为同一个问题的几个较小的实例,最好拥有同样的规模。
∙对这些较小的实例求解(一般使用递归方法,但在问题规模足够小的时候,有时也会使用一些其他方法)。
∙如果必要的话,合并这些较小问题的解,以得到原始问题的解。
不是所有的分治算法都一定比简单蛮干更有效。
但是,通常我们向算法女神所做的祈祷都被应允了,因而,使用分治法往往比使用其他方法效率更高。
实际上,分治法孕育了计算机科学中许多最重要和最有效的算法。
虽然我们通常只考虑顺序算法,但要知道,分治法对于并行算法是非常理想的,因为各个子问题都可以由不同的CPU同时计算。
许多分治算法的时间效率T(n)满足方程T(n)=aT(n/b)+f(n)。
一些应用分治法的案例:合并排序是一种分治排序算法。
它把一个输入数组一分为二,并对它们递归排序,然后把这两个排好序的子数组合并为原数组的一个有序排列。
在任何情况下,这个算法的时间效率都是Θ(nlogn),而且它的键值比较次数非常接近理论上的最小值。
它的主要缺点是需要相当大的额外存储空间。
快速排序是一种分治排序算法,它根据元素值和某些事先确定的元素的比较结果,来对输入元素进行分区。
快速排序十分有名,这不仅因为对于随机排列的数组,它是一种较为出众的nlogn效率算法,而且因为它的最差效率是平方级的。
折半查找是一种对有序数组进行查找O(logn)效率算法。
它是应用分治技术的一个非典型案例,因为在每次迭代中,它只需要解决两个问题的一个。
二叉树的经典遍历算法——前序、中序、后序和其他类似的算法都需要递归处理左右两棵子树,它们都可以当作是分治技术的例子。
用一些特定的外部顶点来替代给定树的空子树,有助于对这些算法进行分析。
有一种处理两个n位整数相乘的分治算法,大约需要做n(index:1.585)次一位数乘法。
Strassen算法只需要做7次乘法就能计算出两个2桔方阵的积,但比基于定义的算法要做更多次的加法。
利用分治技术,该算法计算两个n阶方阵的积,但比基于定义的算法要做更多次的加法。
利用分治技术,该算法计算两个n阶方阵的乘法时需要做n(index:2.807)次乘法。
分治技术可以成功地应用于两个重要的计算几何问题:最近对问题和凸包问题。
减治法普卢塔克说,萨特斯为了告诉他的士兵坚忍和智慧比蛮力更重要的道理,把两匹马带到他们面前,然后让两个人拔光马的尾毛。
一个人是魁梧的大力士,他用力地拔了又拔,但一点效果也没有;另一个人是一个精美的、长相矫捷的裁缝,他微笑着,每次拔掉一根毛,很快就把尾巴拔得光秃秃的。
——E. Cobham Brewer,《惯用语和寓言词典》,1898减治技术利用了一种关系:一个问题给定实例的解和同样问题较小实例的解之间的关系。
一旦建立了这样一种关系,我们既可以从顶至下(递归地),也可以从底至上(非递归地)地来运用。
减治法有3种主要的变种:∙减去一个常量;∙减去一个常数因子;∙减去的规模是可变的。
在减常量变种中,每次算法迭代总是从实例规模中减去一个规模相同的常量。
一般来说,这个常量等于一,但减二的情况偶尔也会发生,例如,有的算法会根据实例规模为奇数和偶数的不同情况,分别做不同的处理。
减常因子技术意味着在算法的每次迭代中,总是才实例的规模中减去一个相同的常数因子。
在大多数应用中,这样的常数因子等于二。
最后,在减治法的减可变规模变种中,算法在每次迭代时,规模减小的模式都是不同的。
计算最大公约数的欧几里德算法是这种情况的一个很好的例子。
回想一下,这个算法是基于这个公式的:gcd(m,n)=gcd(n,m mod n)虽然等号右边的那些参数总是小于等号左边的参数(至少从该算法的第二次迭代开始),但它们既不是以常数也不是以常数因子的方式减小的。
一些应用减治法的案例:插入排序是减(减一)治技术在排序问题上的直接应用。
无论在平均情况还是最差情况下,它都是一个Θ(n2)的算法,但在平均情况下的效率大约要比最差情况快两倍。
该算法一个较为出众的优势在于,对于几乎有序的数组,它的性能是很好的。
深度优先查找(DFS)和广度优先查找(BFS)是两种主要的图遍历算法。
通过把图表示成深度优先森林或者广度优先森林的形式,有助于对图的许多重要特性进行研究。
两种算法都有着相同的时间效率:对于邻接矩阵表示法来说是Θ(|V|2);对于邻接链表表示法来说是Θ(|V|+|E|)。
一个有向图是一个对边指定了方向的图。
拓扑排序要求按照这种次序列出它的顶点,使得对∙变换为同样问题的一个更简单或者更方便的实例——我们称之为实例化简;∙变换为同样问题的不同表现——我们称之为改变表现。
∙变换为另一个问题的实例,这种问题的算法是已知的——我们称之为问题化简。
一些应用变治法的案例:堆是一棵基本完备二叉树,它的键都满足父母优势要求。
虽然定义为二叉树,但一般用数组来实现堆。
堆对于优先队列的高效实现来说尤为重要;同时,堆还是堆排序的基础。
堆排序在理论上是一种重要的排序算法,它的基本思路是,在排好堆中的数组元素后,再从剩余的堆中连续删除最大的元素。
无论在最差情况下还是在平均情况下,该算法的运行时间都属于Θ(nlogn),而且,它还是在位的排序算法。
AVL树是一种在二叉树可能达到的广度上尽量平衡的二叉查找树。
平衡是由四种称为旋转的变换来维持的。
AVL树上的所有基本操作都属于Θ(logn);它消除了经典二叉查找树在最差效率上的弊端。
2-3树是一种达到了完美平衡的查找树,它允许一个节点最多包含两个键和三个子女。
这个思想推而广之,会产生一种非常重要的B树。
高斯消去法是一种解线性方程组的算法,它是线性代数中的一种基本算法。
它通过把方程组变换为反向替换法求解。
高斯消去法大约需要1/3n3次乘法运算。
在无需对系数进行预处理的多项式求解算法中,霍纳法则是最优的。
它只需要n次乘法和n 次加法。
它还有一些有用的副产品,比如综合除法算法。
两种计算a(index:n)的二进制幂算法。
它们使用了指数n的二进制表示,但它们按照相反的方向对其进行处理:从左到右和从右到左。
线性规划关心的是最优化一个包含若干变量的线性函数,这个函数受到一些形式为线性等式和线性不等式的约束。
有一些高效的算法可以对这个问题的庞大实例求解,它们包含了成千上万的变量和约束,但不能要求变量必须是整数。
如果变量一定要是整数,我们称之为整数线性规划问题,这类问题的难度要高很多。
时空权衡最重要的事情永远不能受次要事情的支配。
——Johnn Wolfgang von Goethe (1749 - 1832)无论对于计算机理论工作者还是计算机实践工作者来说,算法设计中的时空权衡都是一个总所周知的问题。
作为一个例子,考虑一下在函数定义域的多个点上计算函数值的问题。
如果运算时间更为重要的话,我们可以事先把函数值计算好并将它们存储在一张表中。
这就是在电子计算机发明前,“人工计算机”所做的工作,那时的图书馆也被厚重的数学用表堆满了。
虽然随着电子计算机的广泛应用,这些数学用表失去了大部分的吸引力,但事实正面,在开发一些用于其他问题的重要算法时,它们的基本思想还是非常有用的。
按照一种更一般的表述,这个思想是对问题的部分或全部输入做预处理,然后对获得的额外信息进行存储,以加速后面问题的求解。
我们把这个方法称为输入增强。
其他采用空间换时间权衡思想的技术简单地使用额外空间来实现更快和(或)更方便的数据存取。
我们把这种方法称为预构造。
这个名字强调了这种空间换时间权衡技术的两个方面:所讨论问题在实际处理之前,已经做过某些处理了;但和输入增强技术不同,这个技术只涉及存取结构。
还有一种和空间换时间权衡思想相关的算法设计技术:动态规划。
这个策略的基础是把给定问题中重复子问题的解记录在表中,然后求得所讨论问题的解。
最后还要对算法设计中时间和空间的相互作用作两点说明:首先,并不是在所有的情况下,时间和空间这两种资源都必须相互竞争。
实际上,它们可以联合起来,使得一个算法无论在运行时间上还是消耗的空间上都达到最小化。
具体来说说,这种情况出现在一个算法使用了一种空间效率很高的数据结构来表示问题的输入,这种结构又反过来提高算法的时间效率。