算法的含义及算法复杂度分析方法
- 格式:doc
- 大小:13.50 KB
- 文档页数:2
算法概念简述引言算法是计算机科学的核心概念之一,它是指计算机解决问题的一系列有序步骤或规则。
在计算机领域,算法的设计和分析是非常重要的,它直接影响着计算机程序的效率和性能。
本文将从算法的定义、特性和分类等方面来全面探讨算法的概念。
算法的定义算法是指一种为解决特定问题而规定的一系列步骤或操作。
它具有明确的输入和输出,以及能够在有限的时间内完成计算的特点。
算法应该具备确定性、有限性和有效性等基本特性。
确定性指的是算法的每个步骤都有确定的含义和执行次序;有限性指的是算法在有限的步骤内结束;有效性指的是算法在有限的时间和资源内得出结果。
算法的特性确定性算法中的每个步骤都有确定的含义和执行次序,不会出现二义性或不确定性。
可行性算法的每一步操作都是可行的,即可以在有限时间内执行完成。
有限性算法在有限的步骤内结束,不会出现无限循环或死循环的情况。
输入算法接受一定的输入,这些输入可以是零个、一个或多个。
输出算法产生一定的输出,输出与输入之间存在着明确的关系。
算法的分类递归算法递归算法是指一个算法通过调用自身来解决问题的方法。
这种算法通常使用递归函数或子程序来实现。
递归算法通常具有简洁的代码结构,但需要注意递归深度过深可能导致栈溢出的问题。
分治算法分治算法是将问题划分成多个子问题,分别解决这些子问题,然后将子问题的解合并成原问题的解。
这种算法通常通过递归来实现,每次递归都将问题划分成两个或多个规模更小的子问题。
动态规划算法动态规划算法是通过将问题划分成多个子问题,并将子问题的解保存起来,避免了重复计算。
这种算法通常使用一个表格或数组来保存子问题的解,然后利用已经计算出的子问题的解来逐步计算出最终问题的解。
贪心算法贪心算法是一种将问题划分成多个子问题,并选择当前最优解的算法。
这种算法每次都选择当前看起来最优的解,而不考虑该选择是否导致最终的全局最优解。
贪心算法通常具有较快的执行速度,但不能保证得到最优解。
回溯算法回溯算法是通过尝试所有可能的解,并在不满足条件时进行回溯的算法。
算法的时间复杂度和空间复杂度-总结通常,对于一个给定的算法,我们要做两项分析。
第一是从数学上证明算法的正确性,这一步主要用到形式化证明的方法及相关推理模式,如循环不变式、数学归纳法等。
而在证明算法是正确的基础上,第二部就是分析算法的时间复杂度。
算法的时间复杂度反映了程序执行时间随输入规模增长而增长的量级,在很大程度上能很好反映出算法的优劣与否。
因此,作为程序员,掌握基本的算法时间复杂度分析方法是很有必要的。
算法执行时间需通过依据该算法编制的程序在计算机上运行时所消耗的时间来度量。
而度量一个程序的执行时间通常有两种方法。
一、事后统计的方法这种方法可行,但不是一个好的方法。
该方法有两个缺陷:一是要想对设计的算法的运行性能进行评测,必须先依据算法编制相应的程序并实际运行;二是所得时间的统计量依赖于计算机的硬件、软件等环境因素,有时容易掩盖算法本身的优势。
二、事前分析估算的方法因事后统计方法更多的依赖于计算机的硬件、软件等环境因素,有时容易掩盖算法本身的优劣。
因此人们常常采用事前分析估算的方法。
在编写程序前,依据统计方法对算法进行估算。
一个用高级语言编写的程序在计算机上运行时所消耗的时间取决于下列因素:(1). 算法采用的策略、方法;(2). 编译产生的代码质量;(3). 问题的输入规模;(4). 机器执行指令的速度。
一个算法是由控制结构(顺序、分支和循环3种)和原操作(指固有数据类型的操作)构成的,则算法时间取决于两者的综合效果。
为了便于比较同一个问题的不同算法,通常的做法是,从算法中选取一种对于所研究的问题(或算法类型)来说是基本操作的原操作,以该基本操作的重复执行的次数作为算法的时间量度。
1、时间复杂度(1)时间频度一个算法执行所耗费的时间,从理论上是不能算出来的,必须上机运行测试才能知道。
但我们不可能也没有必要对每个算法都上机测试,只需知道哪个算法花费的时间多,哪个算法花费的时间少就可以了。
并且一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多。
深度优先遍历算法实现及复杂度分析深度优先遍历算法(Depth First Search, DFS)是一种常用的图遍历算法,用于查找或遍历图的节点。
本文将介绍深度优先遍历算法的实现方法,并进行对应的复杂度分析。
一、算法实现深度优先遍历算法的基本思想是从图的某个节点出发,沿着深度方向依次访问其相邻节点,直到无法继续下去,然后返回上一层节点继续遍历。
下面是深度优先遍历算法的伪代码:```1. 初始化访问标记数组visited[],将所有节点的访问标记置为false。
2. 从某个节点v开始遍历:- 标记节点v为已访问(visited[v] = true)。
- 访问节点v的相邻节点:- 若相邻节点w未被访问,则递归调用深度优先遍历算法(DFS(w))。
3. 遍历结束,所有节点都已访问。
```二、复杂度分析1. 时间复杂度深度优先遍历算法的时间复杂度取决于图的存储方式和规模。
假设图的节点数为V,边数为E。
- 邻接表存储方式:对于每个节点,需要访问其相邻节点。
因此,算法的时间复杂度为O(V+E)。
- 邻接矩阵存储方式:需要检查每个节点与其他节点的连通关系,即需要遍历整个邻接矩阵。
因此,算法的时间复杂度为O(V^2)。
2. 空间复杂度深度优先遍历算法使用了一个辅助的访问标记数组visited[]来记录每个节点的访问状态。
假设图的节点数为V。
- 邻接表存储方式:访问标记数组visited[]的空间复杂度为O(V)。
- 邻接矩阵存储方式:访问标记数组visited[]的空间复杂度同样为O(V)。
综上所述,深度优先遍历算法的时间复杂度为O(V+E),空间复杂度为O(V)。
三、应用场景深度优先遍历算法在图的遍历和搜索问题中广泛应用。
以下是一些典型的应用场景:1. 连通性问题:判断图中两个节点之间是否存在路径。
2. 非连通图遍历:对于非连通图,深度优先遍历算法可以用于遍历所有连通分量。
3. 寻找路径:在图中寻找从起始节点到目标节点的路径。
简述算法的定义及算法设计的基本要求算法的定义及算法设计的基本要求是计算机科学中非常重要的概念,它们对于解决问题和优化计算过程至关重要。
本文将分别对算法的定义和算法设计的基本要求进行简述。
1.算法的定义算法是指用于解决特定问题的一系列清晰而有序的操作步骤,旨在获得问题的解决方案或结果。
算法可以用来执行各种计算任务,例如排序、搜索、加密和解密等。
算法是计算机科学的基础,它可以被看作是一种精确、详细的计算描述,形式上定义了一种计算过程。
算法的定义必须满足以下要求:(1)有限性:算法必须在有限的步骤内结束,不会无限循环或永远不停止。
(2)明确性:算法中的每个步骤必须清晰明确,不会存在歧义或二义性,以免导致不确定结果。
(3)输入:算法需要输入特定的数据或信息,可以是来自外部的输入或先前的计算结果。
(4)输出:算法应该产生一个明确的输出结果,与问题的需求一致,能够解决或回答特定问题。
(5)可行性:算法中的每个步骤必须可行,可以通过计算机或其他可执行计算的设备来实现。
2.算法设计的基本要求算法设计是创建有效和高效算法的过程,以解决特定问题。
在设计算法时,需要满足以下基本要求:(1)正确性:算法必须能够得出正确的结果,解决特定的问题。
要确保算法正确,可以采用数学证明、数学归纳法或测试验证等方法。
(2)可读性:算法应该易于理解和解释,便于其他程序员或研究人员使用和修改。
良好的可读性有助于减少错误和提高协作效率。
(3)健壮性:算法应该能够应对各种异常情况和错误输入,能够恰当处理错误,并返回有意义的错误信息。
健壮的算法能够提高程序的稳定性和可靠性。
(4)高效性:算法应该能够在合理的时间内解决问题,尽量减少时间和空间复杂度。
高效的算法有助于提高计算速度和资源利用率。
(5)可移植性:算法应该能够在不同的计算设备和环境中运行,无论是不同的操作系统、编程语言还是硬件平台。
可移植的算法可以提高软件的可重用性和可扩展性。
为了满足以上要求,通常可以采用以下方法来设计算法:(1)选择合适的数据结构:根据问题的特点和需求,选择合适的数据结构可以提高算法的效率。
算法时间复杂度分析及优化方法在计算机科学中,算法的时间复杂度是指算法在最坏情况下执行的时间。
因为不同算法的执行时间是不同的,所以我们需要对算法的时间复杂度进行分析和优化,以提高算法的执行效率。
一、什么是时间复杂度?时间复杂度就是对算法执行时间的一种度量。
我们通常用Big O记号来表示算法的时间复杂度。
在计算时间复杂度的时候,我们会考虑算法的输入规模和算法的运行情况。
例如,当输入规模为n时,算法需要执行的次数就是我们需要分析的问题,我们将其标记为T(n)。
二、算法时间复杂度的分类在算法分析中,我们通常把算法的时间复杂度分为以下几类:1. O(1)复杂度:这种算法的时间复杂度是常数级别,在算法执行过程中不会受到输入规模的影响。
例如,取数组中的第一个元素,无论数组元素的多少,执行时间都是相同的。
2. O(log n)复杂度:这种算法通常使用二分法,每次操作都将输入规模减小一半。
例如,在一个有序数组中查找一个元素,使用二分法比线性查找更快。
3. O(n)复杂度:这种算法的执行时间和输入规模成正比。
例如,在一个长度为n的数组中查找一个元素,最坏情况下需要查找n 次。
4. O(n^2)复杂度:这种算法的执行时间和输入规模的平方成正比。
例如,在一个长度为n的数组中查找两个数的和等于target,需要进行两重循环,最坏情况下需要执行n^2次。
5. O(n^3)复杂度:这种算法的执行时间和输入规模的立方成正比。
例如,在一个长度为n的三维数组中查找一个元素,最坏情况下需要执行n^3次。
三、算法时间复杂度的优化对于不同的算法,我们可以采取不同的优化方法来提高算法的执行效率:1. 减少无效计算:对于重复计算的部分,我们可以通过缓存或者记录的方式避免重复计算,从而减少无效计算。
2. 比较复杂度:对于不同的算法,我们可以根据时间复杂度来比较它们各自的执行效率,选择效率更高的算法。
3. 优化算法设计:我们可以通过改变算法的设计,优化算法的执行效率。
计算机算法基础知识系统梳理计算机算法是指解决特定问题的一系列步骤或指令。
算法的设计和分析是计算机科学领域的核心内容之一。
为了更好地理解和应用算法,我们需要对计算机算法的基础知识进行系统梳理。
本文将从算法的定义、分类、特性以及常见的算法设计思想进行介绍。
一、算法的定义算法是指一种具体可行的解决问题的方法,描述了在有限的时间和空间内,如何将输入转化为输出。
算法必须具备以下特点:明确性、有限性、确定性和可执行性。
明确性表示算法的步骤必须明确而不含糊;有限性表示算法必须在有限的步骤内结束;确定性表示算法的每一步都有确定的含义;可执行性表示算法能够被计算机实现。
二、算法的分类根据问题的性质和算法的设计思想,算法可以分为以下几类:1. 递归算法:递归算法是指在解决问题时,调用自身来进行子问题的求解。
递归算法通常包括基本情况和递推关系两个部分。
递归算法的典型应用包括斐波那契数列的求解和二叉树的遍历等。
2. 分治算法:分治算法是指将一个大问题划分成若干个相互独立且具有相同结构的子问题,然后逐个求解,并最后将各个子问题的解合并得到原问题的解。
经典的分治算法有归并排序和快速排序等。
3. 贪心算法:贪心算法是一种通过每一步的局部最优选择来达到整体最优解的算法。
贪心算法通常不是全局最优解,但在某些问题中可以得到近似最优解。
常见的贪心算法有Prim算法和Kruskal算法来解决最小生成树问题。
4. 动态规划算法:动态规划算法是一种将问题划分为多个阶段,每个阶段的求解依赖于之前阶段的结果,并通过保存之前阶段的结果来避免重复计算的算法。
动态规划算法常用于解决最优化问题,如背包问题和最短路径问题等。
5. 回溯算法:回溯算法也被称为试探法,通过枚举所有可能的解,并逐步剪枝来找到问题的解。
回溯算法通常用于求解组合、排列、子集等问题,典型的应用有八皇后问题和0-1背包问题等。
三、算法的特性算法的性能可以通过时间复杂度和空间复杂度来评估。
一般go 算法的运算规则一、算法的定义和特点算法是指解决问题的步骤和方法的有限序列。
算法具有以下特点:1. 输入:算法具有零个或多个输入;2. 输出:算法具有一个或多个输出;3. 有限性:算法在有限的时间内终止;4. 确定性:算法的每一步都有确定的含义;5. 可行性:算法的每一步都是可行的。
二、算法的设计与分析1. 算法的设计:算法的设计是指根据问题的要求和约束,找到解决问题的步骤和方法的过程。
常用的算法设计方法包括分治法、动态规划、贪心法等。
2. 算法的分析:算法的分析是指对算法的性能进行评估和分析的过程。
常用的算法分析方法包括时间复杂度和空间复杂度的评估。
三、常见的算法规则和原则1. 迭代与递归:迭代是指通过反复执行相同的操作来解决问题,而递归是指在解决问题的过程中调用自身来实现的方法。
2. 分支与循环:分支是指根据条件的不同选择不同的操作,而循环是指通过多次执行相同的操作来解决问题。
3. 排序与搜索:排序是指将一组数据按照一定的规则进行排列的过程,而搜索是指在一组数据中查找特定元素的过程。
4. 数据结构与算法:数据结构是指组织和管理数据的方式,而算法是在数据结构上操作的一种方法。
5. 空间复杂度与时间复杂度:空间复杂度是指算法所需的存储空间,而时间复杂度是指算法所需的执行时间。
四、常见的算法应用1. 搜索算法:搜索算法用于在一组数据中查找特定元素,如二分查找、深度优先搜索、广度优先搜索等。
2. 排序算法:排序算法用于将一组数据按照一定的规则进行排列,如冒泡排序、插入排序、快速排序等。
3. 图算法:图算法用于解决与图相关的问题,如最短路径问题、最小生成树问题等。
4. 动态规划算法:动态规划算法用于解决具有重叠子问题和最优子结构性质的问题,如背包问题、最长公共子序列问题等。
5. 贪心算法:贪心算法用于解决在每一步选择中都采取当前状态下最优的选择的问题,如霍夫曼编码、最小生成树问题等。
五、算法的优化与改进1. 时间复杂度优化:通过改变算法的设计和实现方式,减少算法执行的时间。
重要概念关于算法与复杂度1.算法就是一组有穷的 规则 ,它们规定了解决某一特定类型问题的 一系列运算 。
算法是解决某类问题的一系列运算的集合,算法是指解决问题的一种方法或一种过程。
程序是算法用程序设计语言的具体实现。
2.算法重要特性是什么?确定性、可行性、输入、输出、有穷性(输入、输出、确定性、有限性)3.算法分析的目的是什么?分析算法占用计算机资源的情况,对算法做出比较和评价,设计出更好的算法。
4.算法的复杂性是 算法效率 的度量,是评价算法优劣的重要依据。
算法的时间复杂性指算法中 元数据 的执行次数。
通常可以通过计算循环次数、基本操作频率、计算步。
5.计算机的资源最重要的是 时间 和 空间 资源。
因而,算法的复杂性有 时间复杂度和 空间复杂度 之分。
6.设D n 表示大小为n 的输入集合,t(I)表示输入为I 时算法的运算时间, p(I)表示输入I出现的概率,则算法的平均情况下时间复杂性A(n)=∑∈n D I I t I p )()( 。
7.分治算法的时间复杂性常常满足如下形式的递归方程: ⎩⎨⎧>+===00n n ,g(n)af(n/c)f(n)n n ,d )n (f 其中,g(n)表示将规模为n 的问题分解为子问题以及组合相应的子问题的解所需的时间 。
7、算法的时间复杂性与问题的什么因素相关?算法的时间复杂性与问题的规模相关,是问题大小n 的函数。
8、算法的渐进时间复杂性的含义?当问题的规模n 趋向无穷大时,影响算法效率的重要因素是T(n)的数量级,而其他因素仅是使时间复杂度相差常数倍,因此可以用T(n)的数量级(阶)评价算法。
时间复杂度T(n)的数量级(阶)称为渐进时间复杂性。
9、最坏情况下的时间复杂性和平均时间复杂性有什么不同?最坏情况下的时间复杂性和平均时间复杂性考察的是n 固定时,不同输入实例下的算法所耗时间。
最坏情况下的时间复杂性取的输入实例中最大的时间复杂度:W(n) = max{ T(n ,I) } , I ∈Dn平均时间复杂性是所有输入实例的处理时间与各自概率的乘积和:A(n) =∑P(I)T(n ,I) I ∈Dn10、记号O 表示(渐进上界), 记号表示(渐进下界), 记号表示(紧渐进界)ΩΘ记号O 的定义正确的是O(g(n)) = { f(n) | 存在正常数c 和n0使得对所有n n 0有:0 f(n) cg(n) };≥≤≤记号的定义正确的是Ω (g(n)) = { f(n) | 存在正常数c 和n0使得对所有n n 0有:0 cg(n) f(n) };Ω≥≤≤a) 以下关于渐进记号的性质是正确的有:(A )A.f (n)(g(n)),g(n)(h(n))f (n)(h(n))=Θ=Θ⇒=ΘB. f (n)O(g(n)),g(n)O(h(n))h(n)O(f (n))==⇒=C. O(f(n))+O(g(n)) = O(min{f(n),g(n)})D. f (n)O(g(n))g(n)O(f (n))=⇔=b)对于下列各组函数f(n)和g(n),确定f(n)=O(g(n))或或))(()(n g n f Ω=,并简述理由。
人教版高中必修3(B版)第一章算法初步教学设计教学背景本设计是为人教版高中必修3(B版)第一章——算法初步编写的,旨在让学生在学习计算机基本概念的同时,掌握算法的概念、基本算法及计算复杂度分析。
教学目标•了解算法的概念及其在计算机上的应用;•掌握算法的一些基本的思想方法和算法模板;•能够分析算法的时间、空间复杂度。
教学内容知识点1.算法基本概念2.时间、空间复杂度分析3.基本算法——贪心、分治和动态规划教学方式本课程主要采用授课法和案例演示法相结合的方式进行教学。
教学步骤第一步:算法基本概念1.讲解算法的定义、特性、应用等内容。
2.通过一些简单的例子,让学生理解什么是算法。
第二步:时间、空间复杂度分析1.介绍时间复杂度和空间复杂度的概念及分析方法。
2.通过一些实例演示,让学生能够对算法的复杂度进行分析。
第三步:基本算法——贪心1.介绍贪心算法的思想。
2.通过一些案例,让学生了解贪心算法的应用场景。
3.给学生一些练习题,巩固对贪心算法思路的掌握。
第四步:基本算法——分治1.介绍分治算法的思想。
2.通过一些案例,让学生了解分治算法的应用场景。
3.给学生一些练习题,巩固对分治算法思路的掌握。
第五步:基本算法——动态规划1.介绍动态规划算法的思想。
2.通过一些案例,让学生了解动态规划算法的应用场景。
3.给学生一些练习题,巩固对动态规划算法思路的掌握。
第六步:课堂小结1.小结本节课所学内容。
2.引导学生思考如何对不同场景下的问题选择合适的算法,扩展学生的算法思维。
教学评估1.每个章节结束后进行小测试,测试学生掌握的知识点。
2.每个章节最后留出时间给学生提问和互动交流。
3.在完成练习题后,对学生提交的答案进行点评和改进。
结束语本教学设计注重启发学生思考能力,通过案例演示和举例分析的方式,激发学生对算法和计算机的兴趣,提高对算法的理解和能力。
算法是指解决问题的一种方法或一个过程。
更严格的讲,算法是若干指令的有穷序列。
性质:(1)输入:有零个或者多个由外部提供的量作为算法的输入。
作为算法加工对象的量值,通常体现为算法中的一组变量。
(2)输出:算法产生至少一个量作为输出。
它是一组与“输入”有确定关系的量值,是算法进行信息加工后得到的结果,这种确定关系即为算法的功能。
(3)确定性:组成算法的每条指令是清晰、无歧义的。
对于每种情况下所应执行的操作,在算法中都有确切的规定,使算法的执行者或阅读者都能明确其含义及如何执行(可行性)。
并且在任何条件下,算法都只有一条执行路径。
(4)有限性:算法中每条指令的执行次数是有限的,每条指令的执行时间也是有限的。
程序和算法的区别:程序是算法用某种程序设计语言的具体实现。
程序可以不满足算法的性质(4)有限性。
例如操作系统,是一个在无限循环中执行的程序,因而不是一个算法。
操作系统的各种任务可看成是单独的问题,每一个问题由操作系统中的一个子程序,通过特定的算法来实现。
该子程序得到输出结果后便终止。
算法分析是对一个算法所消耗资源进行估算。
资源消耗指时间、空间的耗费。
算法分析的目的就是通过对解决同一问题的多个不同算法进行时空耗费这两方面的分析.比较求解同一问题的多个不同算法的效率。
一般情况下将最坏情况下的时间耗费的极限作为算法的时间耗费,称为时间复杂性。
可操作性最好最有实际价值的是最坏情况下的时间复杂性。
渐进复杂性:当n单调增加且趋于∞时,T(n)也将单调增加且趋于∞。
对于T(n),如果存在T~(n),当n→∞时,(T(n)-T~(n) )/T(n) →0 ,称T~(n)是T(n)当N→∞时的渐近性态,或称为算法A当N→∞的渐近复杂性。
渐进意义下的记号O Ωθo:以下设f(N)和g(N)是定义在整数集上的正函数。
O:如果存在正的常数C和自然数N0,使得当N≥N0时有f(N)≤Cg(N),则称函数f(N)当N充分大时上有界,且g(N)是它的一个上界,记为f(N)=O(g(N)).这时还说f(N)的阶不高于g(N)的阶。
logn的logn次方复杂度在计算机科学中,算法的复杂度是判断算法性能的一个重要指标。
在复杂度分析中,“logn的logn次方复杂度”被认为是一种很好的算法复杂度。
在本文中,我们将深入探究“logn的logn次方复杂度”的定义、计算及其意义。
一、定义及意义:“logn的logn次方复杂度”是指某种算法在处理n个数据时的复杂度,其时间复杂度为logn的logn次方。
在计算机科学中,logn的logn次方复杂度被认为是极其优秀的算法复杂度,因为它能够在处理数量很大的数据时保证很高的效率。
提高计算机算法的效率是计算机领域长期以来的研究目标。
算法复杂度是衡量算法效率的一个重要指标。
一个算法的时间复杂度越小,即计算代价越小,其效率就越高。
因此,logn的logn次方复杂度的算法被广泛应用于大型处理数据的领域,如数据挖掘、机器学习、图像识别等。
二、计算方法:对于某种算法,假设它的运算时间和数据量n成正比,且该算法的单位时间运算次数为logn的logn次方次。
那么该算法的时间复杂度即为logn的logn次方。
换句话说,如果一个算法的时间复杂度为logn的logn次方,那么在处理多少数据时,它需要的运算次数就是n的logn的logn次方。
例如,有一个算法的时间复杂度为O(nlogn的logn次方),处理n个数据时,它的运算次数为n的logn的logn次方。
这就是“logn的logn次方复杂度”。
三、如何提高算法复杂度:在实际应用中,优化算法复杂度非常重要。
许多算法在一开始的设计阶段,在处理小量数据时,效率非常高,但面对大量数据时,处理速度会明显下降。
为了提高算法复杂度,我们可以采用以下方法:1.算法设计:在算法的设计阶段,应该尽可能保证它具有高效的时间复杂度。
为此,可以考虑一些更加先进的算法、数据结构等。
2.并行计算:对于某些具有一定规律的计算过程,可以采用并行计算来提高复杂度。
这样可以把计算任务分配到多个处理器上,同时进行计算。
算法的含义
算法是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。
也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。
如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。
不同的算法可能用不同的时间、空间或效率来完成同样的任务。
一个算法的优劣可以用空间复杂度与时间复杂度来衡量。
特征
一个算法应该具有以下六个重要的特征:
算法可以使用自然语言、伪代码、流程图等多种不同的方法来描述。
1、有限性
算法的有穷性是指算法必须能在执行有限个步骤之后终止;
2、确切性
算法的每一步骤必须有确切的定义;
3、输入
一个算法有0个或多个输入,以刻画运算对象的初始情况,所谓0个输入是指算法本身定出了初始条件;
4、输出一个算法有一个或多个输出,以反映对输入数据加工后的结果。
没有输出的算法是毫无意义的;
算法复杂度分析
通常一个算法的复杂度是由其输入量决定的,随着输入的增加,复杂度越大。
一个算法的评价主要从时间复杂度和空间复杂度来考虑。
方法:
时间复杂度
(1)算法耗费的时间和语句频度
一个算法所耗费的时间=算法中每条语句的执行时间之和
每条语句的执行时间=语句的执行次数(即频度(Frequency Count))×语句执行一次所需时间算法转换为程序后,每条语句执行一次所需的时间取决于机器的指令性能、速度以及编译所产生的代码质量等难以确定的因素。
若要独立于机器的软、硬件系统来分析算法的时间耗费,则设每条语句执行一次所需的时间均是单位时间,一个算法的时间耗费就是该算法中所有语句的频度之和。
(2)问题规模和算法的时间复杂度
算法求解问题的输入量称为问题的规模(Size),一般用一个整数表示。
矩阵乘积问题的规模是矩阵的阶数。
一个图论问题的规模则是图中的顶点数或边数。
一个算法的时间复杂度(Time Complexity, 也称时间复杂性)T(n)是该算法的时间耗费,是该算法所求解问题规模n的函数。
当问题的规模n趋向无穷大时,时间复杂度T(n)的数量级(阶)称为算法的渐进时间复杂度。
(3)渐进时间复杂度评价算法时间性能
主要用算法时间复杂度的数量级(即算法的渐近时间复杂度)评价一个算法的时间性能。
空间复杂度
与时间复杂度类似,空间复杂度是指算法在计算机内执行时所需存储空间的度量。
记作:
S(n)=O(f(n))
算法执行期间所需要的存储空间包括3个部分:
·算法程序所占的空间;
·输入的初始数据所占的存储空间;·算法执行过程中所需要的额外空间。