算法导论
学习算法的经典教材推荐

学习算法的经典教材推荐在计算机科学领域,算法是一门重要的学科。
学习算法不仅可以提高我们解决问题的能力,还可以培养我们的逻辑思维和分析能力。
因此,选择一本好的算法教材是非常重要的。
在本文中,我将向大家推荐几本经典的算法教材,希望对大家的学习有所帮助。
1.《算法导论》(Introduction to Algorithms)《算法导论》是由Thomas H. Cormen、Charles E. Leiserson、Ronald L. Rivest和Clifford Stein合著的一本经典教材。
这本书系统地介绍了算法设计和分析的基本原理,包括排序、图算法、动态规划等。
它以清晰的语言和丰富的示例,帮助读者理解算法的核心思想和实现细节。
《算法导论》适合作为算法课程的教材,也适合作为算法学习的参考书。
2.《算法(第4版)》(Algorithms, Part I)《算法(第4版)》是由Robert Sedgewick和Kevin Wayne合著的一本经典教材。
这本书以Java语言为基础,介绍了常见的算法和数据结构,包括排序、查找、图算法等。
它不仅提供了清晰的解释和示例代码,还包含了大量的练习题和编程项目,帮助读者巩固所学知识。
《算法(第4版)》适合初学者入门,也适合有一定算法基础的读者进一步深入学习。
3.《算法设计与分析基础》(Foundations of Algorithm Design and Analysis)《算法设计与分析基础》是由王晓东、王晓燕和李海霞合著的一本经典教材。
这本书以算法设计和分析为核心,介绍了常见的算法思想和技术,包括贪心算法、动态规划、分治算法等。
它注重理论与实践的结合,通过真实的案例和实验分析,帮助读者理解算法的应用场景和效果评估。
《算法设计与分析基础》适合计算机科学专业的学生和从业人员,也适合对算法感兴趣的读者。
4.《算法之美》《算法之美》是由吴军著的一本畅销书。
虽然不是传统的教材,但它以通俗易懂的语言,介绍了算法在现实生活中的应用和影响。
算法导论-顺序统计-快速求第i小的元素

算法导论-顺序统计-快速求第i⼩的元素⽬录1、问题的引出-求第i个顺序统计量2、⽅法⼀:以期望线性时间做选择3、⽅法⼆(改进):最坏情况线性时间的选择4、完整测试代码(c++)5、参考资料内容1、问题的引出-求第i个顺序统计量什么是顺序统计量?及中位数概念在⼀个由元素组成的集合⾥,第i个顺序统计量(order statistic)是该集合第i⼩的元素。
例如,最⼩值是第1个顺序统计量(i=1),最⼤值是第n个顺序统计量(i=n)。
⼀个中位数(median)是它所在集合的“中点元素”。
当n为奇数时,中位数是唯⼀的;当n为偶数时,中位数有两个。
问题简单的说就是:求数组中第i⼩的元素。
那么问题来了:如何求⼀个数组⾥第i⼩的元素呢?常规⽅法:可以⾸先进⾏排序,然后取出中位数。
由于排序算法(快排,堆排序,归并排序)效率能做到Θ(nlogn),所以,效率达不到线性;在本⽂中将介绍两种线性的算法,第⼀种期望效率是线性的,第⼆种效率较好,是在最坏情况下能做到线性效率。
见下⾯两个⼩节;2、⽅法⼀:以期望线性时间做选择这是⼀种分治算法:以为模型:随机选取⼀个主元,把数组划分为两部分,A[p...q-1]的元素⽐A[q]⼩,A[q+1...r]的元素⽐A[q]⼤。
与快速排序不同,如果i=q,则A[q]就是要找的第i⼩的元素,返回这个值;如果i < q,则说明第i⼩的元素在A[p...q-1]⾥;如果i > q,则说明第i⼩的元素在A[q+1...r]⾥;然后在上⾯得到的⾼区间或者低区间⾥进⾏递归求取,直到找到第i⼩的元素。
下⾯是在A[p...q]中找到第i⼩元素的伪码:1 RandomSelect(A,p, q,k)//随机选择统计,以期望线性时间做选择2 {3if (p==q) return A[p];4int pivot=Random_Partition(A,p,q);//随机选择主元,把数组进⾏划分为两部分5int i=pivot-p+1;6if (i==k )return A[pivot];7else if (i<k) return RandomSelect(A,pivot+1,q,k-i);//第k⼩的数不在主元左边,则在右边递归选择8else return RandomSelect(A,p,pivot-1,k);//第k⼩的数不在主元右边,则在左边递归选择9 }在最坏情况下,数组被划分为n-1和0两部分,⽽第i个元素总是落在n-1的那部分⾥,运⾏时间为Ө(n^2);但是,除了上述很⼩的概率情况,其他情况都能达到线性;在平均情况下,任何顺序统计量都可以在线性时间Θ(n)内得到。
算法导论第四版

算法导论第四版引言算法是计算机科学中的重要概念,它是解决问题的步骤和方法的描述。
《算法导论第四版》是一本经典的算法教材,深入浅出地介绍了各种常见的算法和数据结构。
本文将对这本书进行全面、详细和深入地探讨,帮助读者更好地理解和应用算法导论。
为什么学习算法导论1.提升编程技能:算法是编程的基础,学习算法可以提升编程的技能和水平。
2.解决实际问题:算法解决了许多实际问题,学习算法可以帮助我们更好地解决实际问题。
3.备战面试:许多技术面试都会考察算法和数据结构的知识,学习算法导论可以更好地应对面试。
基础知识算法分析1.时间复杂度:衡量算法的执行时间随输入规模增长的速度。
2.空间复杂度:衡量算法执行过程中所需的额外空间随输入规模增长的速度。
排序算法1.冒泡排序:反复交换相邻的元素,将最大的元素逐渐“冒泡”到最后。
2.插入排序:通过构建有序序列,依次将未排序的元素插入到已排序的序列中。
3.快速排序:选择一个基准元素,按照它的值将数组分成两部分,递归地对两部分进行排序。
4.归并排序:将数组分成两部分,分别对两部分进行排序,然后将两个有序的子数组合并成一个有序的数组。
数据结构数组和链表1.数组:连续的内存空间,支持随机访问,但插入和删除的时间复杂度较高。
2.链表:不连续的内存空间,只支持顺序访问,但插入和删除的时间复杂度较低。
栈和队列1.栈:后进先出的数据结构,主要有进栈和出栈两个操作。
2.队列:先进先出的数据结构,主要有入队和出队两个操作。
哈希表1.哈希函数:将关键字映射到哈希表中的位置。
2.哈希冲突:不同的关键字映射到了同一个位置,解决冲突的方法有开放寻址法和链地址法。
3.哈希表的应用:常用于高效地插入、删除和查找操作。
树和二叉树1.树:由节点和边组成的一种数据结构,常见的树包括二叉树、平衡二叉树和B树等。
2.二叉树:每个节点最多有两个孩子节点的树。
堆和优先队列1.堆:完全二叉树,堆可以分为最大堆和最小堆。
数据结构与算法 经典书籍

数据结构与算法经典书籍1. 《算法导论》《算法导论》是计算机科学领域中经典的教材,由Thomas H. Cormen等人合著。
该书详细介绍了各种常用的数据结构和算法,包括排序、查找、图算法等。
它以清晰的语言和丰富的实例展示了算法的设计和分析方法,对于理解和掌握算法设计与分析的基本原理具有重要意义。
2. 《数据结构与算法分析:C++语言描述》该书由Mark Allen Weiss编写,是一本介绍数据结构和算法的经典教材。
它以C++语言为基础,详细讲解了各种常用的数据结构(如链表、栈、队列、树、图等)和算法(如排序、查找、图算法等),并给出了具体的代码实现。
同时,该书还重点讲解了算法的分析和性能评估,帮助读者理解算法的时间复杂度和空间复杂度。
3. 《算法》《算法》是Sedgewick和Wayne合著的一本数据结构和算法教材。
该书系统地介绍了各种常用的数据结构和算法,并通过大量的示例和习题帮助读者巩固所学知识。
它涵盖了排序、查找、图算法等领域,并提供了Java和C++两种语言实现的代码。
这本书以其简洁明了的风格和深入浅出的讲解方法,深受学生和专业人士的喜爱。
4. 《编程珠玑》《编程珠玑》是Jon Bentley所著的一本经典之作,介绍了一系列有关程序设计和算法的问题及解决方法。
该书通过实际问题的分析和解决过程,展示了一种高效的编程思维方式。
它以具体的案例引入问题,然后通过分析和优化算法,给出了高效的解决方案。
这本书不仅适合程序员和软件工程师,也对于对算法和数据结构感兴趣的读者具有很高的参考价值。
5. 《数据结构与算法分析:Java语言描述》该书由Mark Allen Weiss编写,是一本使用Java语言描述的数据结构和算法教材。
它以清晰的语言和丰富的实例介绍了各种常用的数据结构和算法,并给出了具体的代码实现。
同时,该书还讲解了算法的分析和性能评估,帮助读者理解算法的时间复杂度和空间复杂度。
6. 《剑指Offer:名企面试官精讲典型编程题》《剑指Offer》是一本专注于面试编程题的书籍,该书由左程云所著。
算法导论4-3递推式

算法导论4-3递推式递推式是算法导论中的一个重要概念,它在数学和计算机科学中有着广泛的应用。
本文将从数学和计算机科学的角度,对递推式进行解释和探讨。
我们来了解一下递推式的概念。
递推式是指通过已知的初始条件和递推关系,来求解一系列的数值或函数值的关系式。
递推式通常具有如下形式:an = f(an-1, an-2, ..., a1)其中,an表示第n个数(或函数值),f表示递推关系,an-1, an-2, ..., a1表示前面的数(或函数值)。
递推式在数学中的应用非常广泛。
比如斐波那契数列就是一个经典的递推式。
斐波那契数列的递推式为:Fn = F(n-1) + F(n-2)其中,F0=0,F1=1。
通过递推关系,我们可以得到斐波那契数列的各个数值。
递推式在计算机科学中也有着重要的应用。
比如在动态规划算法中,递推式被广泛用于解决最优化问题。
动态规划算法通过将一个复杂的问题分解成若干个子问题,并根据递推关系逐步求解,最终得到整个问题的最优解。
递推式的求解可以通过迭代和递归两种方式实现。
迭代是指从初始条件开始,根据递推关系一步一步地计算下一个数值,直到得到所需的结果。
递归是指通过递推关系将问题不断地分解成更小的子问题,直到达到初始条件,然后再逐步返回结果。
在实际应用中,我们常常需要对递推式进行分析和求解。
对于一些简单的递推式,我们可以通过手工计算或者数学方法求解。
而对于一些复杂的递推式,我们可以借助计算机编程的力量来求解。
总结来说,递推式是一种重要的数学和计算机科学工具,它在数学和计算机科学领域中有着广泛的应用。
通过递推式,我们可以建立数值和函数值之间的关系,并通过递推关系求解一系列的数值或函数值。
递推式的求解可以通过迭代和递归两种方式实现。
在实际应用中,我们可以利用递推式来解决各种数学和计算问题,从而提高问题求解的效率和准确性。
希望通过本文的介绍,读者对递推式有了更深入的理解和认识。
递推式作为一种重要的数学和计算机科学工具,不仅在理论研究中有着重要的作用,而且在实际应用中也具有广泛的应用前景。
算法导论读后感

算法导论读后感《算法导论》是一本经典的计算机科学教材,它深入浅出地介绍了算法设计与分析的基本原理,对于计算机科学专业的学生来说是一本不可多得的好书。
通过阅读这本书,我对算法的理解有了更深入的认识,也对计算机科学的发展有了更清晰的认识。
在《算法导论》中,作者对算法的概念、性质和设计方法进行了详细的阐述。
他通过大量的实例和图表,生动地展示了各种算法的设计思路和实现过程。
在学习了书中所介绍的各种算法之后,我对算法的设计和分析有了更深入的理解。
我明白了算法的设计并不是一件简单的事情,需要考虑到算法的效率、复杂度、稳定性等多方面的因素。
同时,我也认识到了算法的重要性,它是计算机科学的基础,也是计算机科学家必须掌握的核心知识。
在阅读《算法导论》的过程中,我还深刻地体会到了算法的思维方式。
作者通过大量的实例和练习题,引导读者逐步培养了解决问题的思维方式。
他教会我们如何分析问题、设计算法、验证算法的正确性和分析算法的效率。
这种思维方式不仅在算法设计与分析中有用,也在解决其他问题时有很大的帮助。
通过学习《算法导论》,我不仅学会了算法,也培养了解决问题的思维方式。
除此之外,《算法导论》还对计算机科学的发展做了一定的介绍。
它介绍了一些经典的算法和数据结构,以及它们在计算机科学中的应用。
通过学习这些内容,我对计算机科学的发展有了更全面的了解。
我了解到了计算机科学的发展是一个不断创新的过程,而算法设计与分析是其中的重要一环。
同时,我也意识到了算法在计算机科学中的重要性,它是计算机科学的核心内容之一,也是计算机科学家必须掌握的重要知识。
总的来说,《算法导论》是一本非常优秀的计算机科学教材。
它深入浅出地介绍了算法的基本原理,对于计算机科学专业的学生来说是一本不可多得的好书。
通过阅读这本书,我对算法的理解有了更深入的认识,也对计算机科学的发展有了更清晰的认识。
我相信,《算法导论》一定会对我的学习和工作产生积极的影响。
算法导论答案 (4)

算法导论答案第一章:算法概述啊算法的定义算法是一系列解决问题的明确指令。
它是一个有穷步骤集,其中每个步骤或操作由确定性和可行性特征。
算法是通过将预期的输入转换为输出来解决问题的工具。
第二章:插入排序插入排序的思想插入排序是一种简单直观的排序算法,其基本思想是将待排序的序列分为已排序和未排序两部分,每次从未排序的部分中取出一个元素,并将其插入到已排序部分的正确位置,直到所有元素都被排序。
插入排序的算法实现以下是插入排序的伪代码:INSERTION-SORT(A)for j = 2 to A.lengthkey = A[j]// Insert A[j] into the sorted sequence A[1.. j-1].i = j - 1while i > 0 and A[i] > keyA[i + 1] = A[i]i = i - 1A[i + 1] = key插入排序的时间复杂度插入排序的时间复杂度为O(n^2),其中n是排序的元素个数。
虽然插入排序的最坏情况下的复杂度很高,但是对于小规模的数据集,插入排序是一种较快的排序算法。
第三章:分治策略分治策略的基本思想分治策略是一种解决问题的思想,它将问题的规模不断缩小,直到问题足够小而可以直接解决。
然后将子问题的解合并起来,得到原问题的解。
分治策略的应用实例一种经典的应用分治策略的算法是归并排序。
归并排序将待排序的序列划分为两个子序列,分别排序后再将两个有序子序列合并为一个有序序列。
以下是归并排序的伪代码:MERGE-SORT(A, p, r)if p < rq = floor((p + r) / 2)MERGE-SORT(A, p, q)MERGE-SORT(A, q + 1, r)MERGE(A, p, q, r)MERGE(A, p, q, r)n1 = q - p + 1n2 = r - qlet L[1..n1+1] and R[1..n2+1] be new arraysfor i = 1 to n1L[i] = A[p + i - 1]for j = 1 to n2R[j] = A[q + j]L[n1 + 1] = infinityR[n2 + 1] = infinityi = 1j = 1for k = p to rif L[i] <= R[j]A[k] = L[i]i = i + 1elseA[k] = R[j]j = j + 1分治策略的时间复杂度归并排序的时间复杂度为O(nlogn),其中n是待排序序列的长度。
算法导论答案

算法导论答案算法导论是计算机科学领域的经典教材,它介绍了算法设计和分析的基本原理和方法。
通过学习算法导论,我们可以深入理解算法的运行机制,并且能够运用这些知识解决实际问题。
本文将介绍一些算法导论的常见问题,并给出相应的答案。
第一部分:算法基础在算法导论中,我们首先学习了算法的基础概念和表达方法。
其中最重要的是时间复杂度和空间复杂度的概念。
时间复杂度衡量了算法运行所需的时间,而空间复杂度则衡量了算法所需要的额外空间。
通过计算复杂度,我们可以估算出算法的效率和资源使用情况。
Q1:什么是时间复杂度和空间复杂度?A1:时间复杂度是指算法解决问题所需要的时间代价,通常以大O表示。
空间复杂度是指算法解决问题所需要的额外空间,通常也以大O表示。
时间复杂度和空间复杂度可以帮助我们评估算法的效率和资源使用情况。
Q2:如何计算时间复杂度?A2:时间复杂度可以通过分析算法中的基本操作的执行次数来计算。
通常,我们可以统计算法中循环、递归和条件判断等操作的执行次数,并根据问题规模n来表示。
然后,我们可以将执行次数与n的关系用大O表示法表示。
第二部分:排序算法算法导论中介绍了多种排序算法,包括插入排序、归并排序、快速排序等等。
不同的排序算法适用于不同的问题场景,并且它们的时间复杂度和稳定性也不同。
Q3:什么是稳定的排序算法?A3:稳定的排序算法是指当原始序列中有两个相等的元素时,排序后它们的相对位置不发生改变。
例如,插入排序和归并排序是稳定的排序算法,而快速排序不是稳定的排序算法。
Q4:如何选择合适的排序算法?A4:选择合适的排序算法需要考虑多个因素,包括数据规模、稳定性要求和系统资源等。
对于小规模数据,可以使用插入排序或者冒泡排序。
对于数据规模较大且对稳定性要求较高的情况,可以选择归并排序。
而快速排序则适用于大规模数据和对稳定性没有要求的场景。
第三部分:动态规划动态规划是算法导论中的重要主题,它是一种解决多阶段决策问题的方法。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1.4 算法分析的基本原则
– – – – – – 例:在n个不同的数中找最大的数。 基本运算:比较 算法:Find Max 输入:数组A,项数 n 输出:A中的最大项 int FindMax(int* L, int n){ 1) int max = A[0]; 2) for(int k=1; k<n; ++k) 3) if(max<A[k]) max = A[k]; 4) return max; 5) } – 行3的比较进行n-1次, 故W(n) = n-1。
1.5 算法复杂性分析
• 函数的渐进性态与渐进表达式:一般来说, 当N单调增加且趋于∞时,T(N)也将单调增加 趋于∞。 • 对于T(N),如果存在函数T'(N),使得当N→ ∞使有(T(N)-T'(N))/T(N) →0,那么我们就说 T'(N)是T(N)当N→ ∞时的渐进性态。 • 在数学上,T'(N)是T(N)当N→ ∞时的渐进表 达式。 • 例如:3N2+4NlogN+7与3N2。
P( I )T ( N , I ) P( I ) t e ( N , I )
I DN i 1 i i
k
• 以上分别是最坏情况下、最好情况下和平均情况下 的时间复杂性。 • 其中DN是规模为N的合法输入的集合;I*是DN中使 T(N, I*)达到TMax(N)的合法输入;I-是DN中使T(N, I-) 达到TMin(N)的合法输入;而P(I)是在算法的应用中 出现输入I的概率。
1.3 描述算法与算法设计
• 问题求解(Problem Solving)
理解问题
精确解或近似解 选择数据结构 算法设计策略
设计算法 证明正确性 分析算法 设计程序
1.4 算法分析的基本原则
1. 正确性
– 定义:在给定有效输入后,算法经过有限时间的计算并 产生正确的答案,就称算法是正确的。 – 正确性证明的内容:
1.1 算法与程序
• 程序:
– 程序是算法用某种程序设计语言的具体实现。 – 程序可以不满足算法的性质(4)即有限性。 – 例如操作系统,是一个在无限循环中执行的程序, 因而不是一个算法。操作系统的各种任务可看成 是单独的问题,每一个问题由操作系统中的一个 子程序通过特定的算法来实现。该子程序得到输 出结果后便终止。
• 平均情况:设A是解某个问题的算法,如果在解这个 问题的算法类中没有其它算法在平均情况下的时间 复杂性比A在平均情况下的时间复杂性低,则称A是 解这个问题在平均情况下的最优算法。
1.4 算法分析的基本原则
5. 最优性 – 寻找最优算法的途径 (以最坏情况下的最优性为例) • 设计算法A,求W(n)。相当于对问题给出最坏情况下 的一个上界。 • 寻找函数F(n),使得对任何算法都存在一个规模为n 的输入并且该算法在这个输入下至少要做F(n)次基本 运算。 相当于对问题给出最坏情况下所需基本运算 次数的一个下界。 • 如果W(n)=F(n),则A是最优的。 • 如果W(n)>F(n),A不是最优的或者F(n)的下界过低。 – 改进A或设计新算法A’使得W’(n)<W(n)。 – 重新证明新下界F’(n)使得F’(n)>F(n)。 – 重复以上两步,最终得到W’(n) = F’(n)为止。
关于本课程
• 第五章 回溯法 掌握利用回溯法解决问题的基本思想,掌握回溯法的算法 的设计要点。 主要内容:回溯法的算法框架、符号,三角形问题,n个皇 后问题,最大团问题,图的m着色问题,旅行售货员问题, 圆排列问题,连续邮资问题,电路板排列问题。 • 第六章 分支限界法 理解分支限界法的基本思想,掌握典型示例中分支限界法 的应用技巧。 课程主要内容:分支限界的基本思想,单源最短路径,布 线问题,0-1背包问题,批处理作业调度问题。
• 算法设计与分析是计算机科学技术中处于核 心地位的一般专业基础课。本课程首先介绍 算法的一般概念和算法复杂性的分析方法, 学会如何评价算法的好坏;接着重点介绍常 用的算法设计技术及相应的经典算法,旨在 帮助完成从“会编程序”到“编好程序”的 角色转变,提高实际求解问题的能力。
关于本课程
• 第一章 算法概述 了解算法的计算复杂性分析方法,理解算法分析 的基本理论,掌握算法分析的基本概念。 • 第二章 递归与分治法 掌握递归的概念,学会用递归方法解决实际问题, 掌握利用分治法解决问题的基本思想。 课程主要内容:递归概念,分治法基本思想,二 分搜索技术,大整数乘法,矩阵乘法等。
– 程序正确性证明的方法:
• •
1.4 算法分析的基本原则
2. 工作量——时间复杂性分析
–
–
计量工作量的标准: 对于给定问题,该算法所执行的基 本运算的次数。 基本运算的选择:根据问题选择适当的基本运算。
问题 在表中查找x 实矩阵相乘 排序 遍历二叉树
基本运算 比较 实数乘法 比较 置指针
1.4 算法分析的基本原则
• 3)非紧上界记号o
• o(g(n)) = { f(n) | 对于任何正常数c>0,存在正数和n0 >0使得对所有n
n0有:0 f(n)<cg(n) } • 等价于 f(n) / g(n) 0 ,as n。
• (4)非紧下界记号
• (g(n)) = { f(n) | 对于任何正常数c>0,存在正数和n0 >0使得对所有n
• 算法+数据结构=程序
1.3 描述算法与算法设计
• 描述算法可以有多种方式,如自然语言方式、图形 表格方式等。在这里,我们将采用C++语言来描述 算法。 • C++语言的优点是类型丰富、语句精炼,具有面向 对象和面向过程的双重优点。 • 用C++来描述算法可使整个算法结构紧凑、可读性 强。 • 算法设计方法主要有:分治策略、动态规划、贪心 算法、回溯法、分支限界等,我们将在后面的章节 中陆续介绍。
算法复杂性 = 算法所需要的计算机资源 算法的时间复杂性T(n);算法的空间复杂性S(n)。 其中n是问题的规模(输入大小)。
1.5 算法复杂性分析
TMax ( N ) maxT ( N , I ) max ti ei ( N , I ) ti ei ( N , I *) T ( N , I *)
关于本课程
• 第三章 动态规划 理解动态规划算法的设计思想,掌握利用动态规划方法解 决问题的基本思想,掌握动态规划算法的设计要点。 课程主要内容:动态规划的基本要素,矩阵连乘,最长公 共子序列,最大子段和,凸多边形最优三角剖分,多边形 游戏,图像压缩,电路布线,0-1背包问题等。 • 第四章 贪心算法 了解贪心算法的理论基础,掌握利用贪心算法解决问题的 基本思想,掌握贪心算法的设计要点。 课程主要内容:贪心算法的基本要素,活动安排问题,最 优装载,哈夫曼编码,单源最短路径等。
关于本课程
• 课程目的: 计算机算法设计与分析导引
– 以算法设计为主,介绍算法设计的主要方法和基本思想;并简要介绍算法 分析概念 – 不是程序设计课,也不是数学课
• 考查形式: 上课考勤+作业(=30%)+期末测试(70%) 教材 计算机算法设计与分析(第3版)王晓东 编著 电子工业出版社 • 参考资料: 陈慧南编著,《算法设计与分析--C++语言描述》,电子工业出版社, 2006年5月 Thomas H.Cormen,Charles E.Leiserson,Ronald L.Rivest,Clifford Stein《算法导论》机械工业出版社 sahni 数据结构、算法与应用 — C++ 语言描述 机械工业出版社
• 计算机的有限资源促使人们关注程序的执行性能, 进而催生了计算机算法这一研究领域。自上世纪60 年代开始至今,已出现了大量解决不同问题的有效 算法。由于属于同一问题类的不同问题之间具有相 似性,其解决算法也具有一定的共性,因此产生了 一般的算法设计技术,如递归技术、分治、动态规 划、贪心、图的遍历、回溯、分支限界等。
3. 占用空间——空间复杂性分析
– 两种占用:
• • • • 存储程序和输入数据的空间 存储中间结果或操作单元所占用空间——额外空间 存储程序的空间一般是常数(和输入规模无关) 输入数据空间为输入规模O(n)
– 影响空间的主要因素:
– 空间复杂性考虑的是额外空间的大小 – 如果额外空间相对于输入规模是常数,称为原 地工作的算法。
1.4 算法分析的基本原则
4. 简单性
– 含义:算法简单,程序结构简单。 – 好处:
• • 容易验证正确性 便于程序调试
– 简单的算法效率不一定高。要在保证一定效率 的前提下力求得到简单的算法。
1.4 算法分析的基本原则
5. 最优性 – 含义:指求解某类问题中效率最高的算法 – 两种最优性 • 最坏情况:设A是解某个问题的算法,如果在解这个 问题的算法类中没有其它算法在最坏情况下的时间 复杂性比A在最坏情况下的时间复杂性低,则称A是 解这个问题在最坏情况下的最优算法。
1.5 算法复杂性分析
• 算法复杂性是算法运行所需要的计算机资源的量, 需要时间资源的量称为时间复杂性,需要的空间资 源的量称为空间复杂性。这个量应该只依赖于算法 要解的问题的规模、算法的输入和算法本身的函数。 如果分别用N、I和A表示算法要解问题的规模、算 法的输入和算法本身,而且用C表示复杂性,那么, 应该有C=F(N,I,A)。 • 一般把时间复杂性和空间复杂性分开,并分别用T 和S来表示,则有: T=T(N,I)和S=S(N,I) 。(通常, 让A隐含在复杂性函数名当中)
• • 方法的正确性证明——算法思路的正确性。证明一系列与算法 的工作对象有关的引理、定理以及公式。 程序的正确性证明——证明所给出的一系列指令确实做了所要 求的工作。 大型程序的正确性证明——可以将它分解为小的相互独立的互 不相交的模块,分别验证。 小模块程序可以使用以下方法验证:数学归纳法、软件形式方 法等。