评价一个算法优劣的要素便是算法的性能(包括时间复杂度和空间复杂度)。当我们去比较两个算法时,最传统的方法就是实践,可以采用控制变量法,让两个算法在同一台机器上以相同的数据跑,比较所花费的时间。这样做不但有些麻烦,而且可能发生奇怪的事,比如:对于第一组数据,算法A优于算法B,而对于第二组数据,算法B优于算法A。这就无法比较两个算法的优劣了。
为了解决上面可能出现的问题,渐进分析应运而生。我们通过使用数据的size来评价一个算法的性能。对于一个有n个数的array,线性查找的时间可用n表示,而折半查找可用Logn表示。
当然,渐进分析也并不能比较任何两个算法的优劣,比如:nLogn与100nLogn的两个算法,根据渐进分析,它们的性能并无优劣之分。
当我们分析一个算法时,可以有三种情况
1.Best case
2.Average case
3.Worst case
比如线性查找:
int search(int arr[], int n, int x)
{
int i;
for (i=0; i<n; i++)
{
if (arr[i] == x)
return i;
}
return -1;
}
1.Best case:
X=arr[0],即要找的值位于数组的首位,此时时间复杂度为O(1),这种情况存在偶然性且不具代表性,因此通常不使用。
2.Average case:
我们假定所有的n+1(x为arr中n个值中的一个或者不在arr中)种情况出现的概率相同,那么
T(n)= [1+2+……+n+(n+1)]/(n+1) = O(n).
这种情况代表了一个算法的平均水平,极具代表性,但是,它很难被算出来,所以,有些算法无法用它表示。
3.Worst case:
X不在arr中,时间复杂度O(n),相对来说,这种情况的可能性更大,最重要的一点是,它代表了一个算法最差的情况,最高的时间按复杂度。当我们知道一个算法的最差情况,那么一个算法必将小于等于最差情况,因此这种情况通常被使用。
渐进分析算法有以下三种标记:
1.ϴ:同时确定上下限时使用
2.O:只能确定上限时使用
3.Ω:只能确定下限时使用
循环语句的分析:
1.O(1)
// c为常量 for (int i = 1; i <= c; i++) { // O(1)的语句 }
2.O(n)
// c为常量 for (int i = 1; i <= n; i += c) { // O(1)的语句 } for (int i = n; i > 0; i -= c) { // O(1)的语句
}
3.O(n2)
// c为常量
for (int i = 1; i <=n; i += c) { for (int j = 1; j <=n; j += c) { // O(1)的语句 } } for (int i = n; i > 0; i += c) { for (int j = i+1; j <=n; j += c) { // O(1)的语句
}
4.O(Logn)
for (int i = 1; i <=n; i *= c) { // O(1)的语句 } for (int i = n; i > 0; i /= c) { // O(1)的语句 }
5.O(LogLogn)
// pow为平方函数
for (int i = 2; i <=n; i = pow(i, c)) { // O(1)的语句 } // fun 为开平方函数 for (int i = n; i > 0; i = fun(i)) { // O(1)的语句 }
递归函数的分析:
1.替换法
步骤:
1) 猜测给定算法的时间复杂度
2) 证明猜测的时间复杂度正确
例:T(n)=2T(n/2)+n
1) 猜测T(n)=O(nLogn)
2) 证明:T(n)<=cnLogn成立
T(n) = 2T(n/2)+n
<=2c*(n/2)*Log(n/2)+n
=cnLogn-cnLog2+n
<=cnLogn (当cLog2>1时)
2.递归树法
步骤:
1) 根据递归关系画出递归树
2) 合计总的时间代价
For example consider the recurrence relation T(n) = T(n/4) + T(n/2) + cn2 cn2 / \ T(n/4) T(n/2) If we further break down the expression T(n/4) and T(n/2), we get following recursion tree. cn2 / \ c(n2)/16 c(n2)/4 / \ / \ T(n/16) T(n/8) T(n/8) T(n/4) Breaking down further gives us following cn2 / \ c(n2)/16 c(n2)/4 / \ / \c(n2)/256 c(n2)/64 c(n2)/64 c(n2)/16 / \ / \ / \ / \ To know the value of T(n), we need to calculate sum of tree nodes level by level. If we sum the above tree level by level, we get the following seriesT(n) = c(n^2 + 5(n^2)/16 + 25(n^2)/256) + ....The above series is geometrical progression with ratio 5/16. To get an upper bound, we can sum the infinite series. We get the sum as (n2)/(1 - 5/16) which is O(n2)
3.主定理法
<!--EndFragment-->
相关推荐
《吉林大学算法分析习题课答案》是一份与算法分析相关的学习资料,主要针对的是吉林大学算法分析课程的习题解答。这份压缩包文件包含了课件等教学资源,旨在帮助学生理解和掌握算法分析的核心概念、方法和技巧。下面...
"数据结构和算法分析 C++版 第三版" 本资源是《数据结构和算法分析 C++版 第三版》的摘要信息,作者是Clifford A. Shaffer,来自 Virginia Tech 的计算机科学系。该书将数据结构和算法分析的基本概念和技术进行了...
《中南大学算法分析与设计》这门课程,作为计算机科学领域的核心课程之一,旨在深入探讨算法的设计、实现及其效率分析。中南大学以其课程内容的深度和细节,赢得了学习者的广泛好评,尽管它对初学者来说或许有一定的...
《算法分析与设计一书源程序》是由著名计算机科学家陈慧南编著的,这本书深入浅出地探讨了算法的设计技巧、分析方法以及其在实际问题中的应用。源程序是作者为了帮助读者更好地理解和实践书中理论而提供的实际代码...
**算法分析与设计** 在计算机科学领域,算法分析与设计是至关重要的组成部分,它涉及到如何高效地解决问题,并评估解决方案的性能。中北大学的这门课程旨在培养学生的算法思维、编程能力和问题解决能力。这份实验...
《算法分析与设计》是计算机科学中的核心课程,主要探讨如何设计有效的算法以及如何分析算法的性能。同济大学的这门课件涵盖了算法的多个关键方面,包括基础概念、设计策略、复杂度分析和应用实例。以下是根据提供的...
《算法分析与设计》这本书是计算机科学领域的重要教材,它涵盖了算法设计的基本策略以及如何对这些算法进行效率分析。在编程世界中,算法是解决问题的关键,而理解和掌握算法分析与设计则是提升编程能力的重要步骤。...
《算法分析与设计教案》是王晓东教授针对算法分析与设计这一重要计算机科学主题编写的教学资料,旨在帮助学生深入理解和掌握算法的核心概念、设计方法以及分析技巧。在这个压缩包中,包含的主要文件名为“计算机算法...
《算法分析与设计》是由屈婉玲等作者编写的教材,该书深入浅出地讲解了算法设计的基本原理和分析方法。课下习题是学习过程中不可或缺的一部分,它们旨在帮助学生巩固理论知识,提高实际问题解决能力。这些习题答案...
算法分析与设计陈慧南课后答案 本资源摘要信息总结了算法分析与设计的相关知识点,并对陈慧南课后答案的部分内容进行了详细的解释和分析。 一、最大公约数和循环次数 在算法分析中,最大公约数是非常重要的一个...
标题“数据结构和算法分析电子版”所指向的知识点,首先是关于数据结构和算法分析这两个计算机科学的基础领域的探讨。数据结构主要涉及的是数据的组织、管理和存储方法,以便于更高效地访问和修改。它包括如数组、...
数据结构与算法分析是计算机科学中的核心课程,它主要研究如何高效地组织和处理数据,以及设计和分析用于解决问题的算法。在这个主题中,我们涵盖了数组、链表、栈、队列、树、图、哈希表等基本数据结构,以及排序、...
《算法分析与设计》是清华大学软件学院开设的一门核心课程,旨在培养学生的算法思维和问题解决能力。这门课程深入探讨了算法的设计、分析、实现和优化,涵盖了基础理论和实际应用,对于计算机科学和技术领域的学生至...
《东北大学软件学院算法分析与设计课程资料》是由张莉老师主讲的一门深度探讨算法原理与实践的课程。这门课程旨在培养学生对算法的深入理解、分析和设计能力,为未来的软件开发和数据分析工作奠定坚实的基础。资料...
《算法分析与设计》是北京大学屈婉玲教授的精品课程,涵盖了算法领域的核心知识点,旨在帮助学生深入理解和掌握算法的设计、分析以及应用。这门课程的重要性在于,算法是计算机科学的基石,它决定了软件的效率和性能...
《算法分析与设计》是计算机科学领域的一门核心课程,主要关注如何有效地解决问题以及如何评估解决方案的效率。厦门大学信息技术学院计算机科学系主任张德富教授的这门课程,通过精心设计的PPT课件,深入浅出地讲解...
### 数据结构与算法分析C++描述习题答案 #### 一、引言 《数据结构与算法分析C++描述习题答案》这本书是基于Mark Allen Weiss教授的经典教材《数据结构与算法分析》编写的答案手册。Weiss教授的原著被誉为20世纪最...
《Python数据结构与算法分析(第2版)》是一本专为对计算机科学和Python编程感兴趣的读者准备的书籍。本书旨在帮助读者理解数据结构、抽象数据类型和算法的重要性,同时提供Python语言的基础知识和实践应用。 在...
《福建师大算法分析与设计期末考试卷及答案解析》 福建师范大学计算机科学与技术专业05级的算法分析与设计课程,是一门深入探讨计算问题解决方案及其效率的学科。这门课程的期末考试卷及答案,对于学习者来说,无疑...