同一问题可用不同算法解决,而一个算法的质量优劣将影响到算法乃至程序的效率。算法分析的目的在于选择合适算法和改进算法。
算法复杂度分为时间复杂度和空间复杂度。其作用: 时间复杂度是度量算法执行的时间长短;而空间复杂度是度量算法所需存储空间的大小。
1、时间复杂度
1.1 时间频度
一个算法中的语句执行次数称为语句频度或时间频度。记为T(n)
1.2 时间复杂度
一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。记作T(n)=O(f(n)),称O(f(n)) 为算法的渐进时间复杂度,简称时间复杂度。
在各种不同算法中,若算法中语句执行次数为一个常数,则时间复杂度为O(1),另外,在时间频度不相同时,时间复杂度有可能相同,如 T(n)=n2+3n+4与T(n)=4n2+2n+1它们的频度不同,但时间复杂度相同,都为O(n2)。
按数量级递增排列,常见的时间复杂度有:常数阶O(1),对数阶O(log2n),线性阶O(n), 线性对数阶O(nlog2n),平方阶O(n2),立方阶O(n3),..., k次方阶O(nk),指数阶O(2n)。
随着问题规模n的不断增大,上述时间复杂度不断增大,算法的执行效率越低。
2、空间复杂度
一个算法的空间复杂度(Space Complexity)S(n)定义为该算法所耗费的存储空间,它也是问题规模n的函数。渐近空间复杂度也常常简称为空间复杂度。
一个算法在计算机存储器上所占用的存储空间,包括存储算法本身所占用的存储空间,算法的输入输出数据所占用的存储空间和算法在运行过程中临时占用的存储空间这三个方面。算法的输入输出数据所占用的存储空间是由要解决的问题决定的,是通过参数表由调用函数传递而来的,它不随本算法的不同而改变。存储算法本身所占用的存储空间与算法书写的长短成正比,要压缩这方面的存储空间,就必须编写出较短的算法。算法在运行过程中临时占用的存储空间随算法的不同而异,有的算法只需要占用少量的临时工作单元,而且不随问题规模的大小而改变
一个算法的空间复杂度只考虑在运行过程中为局部变量分配的存储空间的大小,它包括为参数表中形参变量分配的存储空间和为在函数体中定义的局部变量分配的存储空间两个部分。若一个算法为递归算法,其空间复杂度为递归所使用的堆栈空间的大小,它等于一次调用所分配的临时存储空间的大小乘以被调用的次数(即为递归调用的次数加1,这个1表不开始进行的一次非递归调用)。算法的空间复杂度一般也以数量级的形式给出。如当一个算法的空间复杂度为一个常量,即不随被处理数据量n的大小而改变时,可表示为O(1);当一个算法的空间复杂度与以2为底的n的对数成正比时,可表示为0(10g2n);当一个算法的空I司复杂度与n成线性比例关系时,可表示为0(n).若形参为数组,则只需要为它分配一个存储由实参传送来的一个地址指针的空间,即一个机器字长空间;若形参为引用方式,则也只需要为其分配存储一个地址的空间,用它来存储对应实参变量的地址,以便由系统自动引用实参变量。
对于一个算法,其时间复杂度和空间复杂度往往是相互影响的。当追求一个较好的时间复杂度时,可能会使空间复杂度的性能变差,即可能导致占用较多的存储空间;反之,当=i自求一个较好的空间复杂度时,可能会使时间复杂度的性能变差,即可能导致占用较长的运行时间。另外,算法的所有性能之间都存在着或多或少的相互影响。因此,当设计一个算法(特别是大型算法)时,要综合考虑算法的各项性能,算法的使用频率,算法处理的数据量的大小,算法描述语言的特性,算法运行的机器系统环境等各方面因素,才能够设计出比较好的算法。
分享到:
相关推荐
对java的8种排序方法的空间复杂度和时间复杂度,进行了一个简单的统计
对时间复杂度和空间复杂度进行超级详细的讲解
算法设计目标与时间复杂度与空间复杂度.ppt
在计算机科学中,排序算法是数据处理的重要组成部分,它们用于将一组无序的数据按照特定的顺序排列。在Java编程语言中,实现...然而,了解基本排序算法的原理和时间复杂度分析对于优化代码和解决特定问题仍然至关重要。
5. 空间复杂度: - ArrayList 需要连续的内存空间,所以可能需要频繁扩容,导致额外的空间开销。 - LinkedList 每个元素占用额外的内存用于存储链接,但不需要连续的内存空间。 6. 示例代码分析: 给定的代码中...
**空间复杂度**:O(1),属于原地排序算法。 **稳定性**:稳定。 ##### 选择排序 **时间复杂度**: - 不论数组初始状态如何,选择排序都需要进行 n*(n-1)/2 次比较和 n 次交换,因此时间复杂度始终为 O(n^2)。 **...
4. **算法分析**:分析算法特点不仅包括计算时间复杂度和空间复杂度,还包括对算法稳定性、是否原地排序、是否稳定排序等特性的考察。比如,快速排序虽然平均时间复杂度为O(n log n),但在最坏情况下会退化到O(n^2)...
稳定性和时间复杂度是评估排序算法性能的两个关键指标。 【稳定排序算法】指的是在排序过程中,相等元素的相对顺序不会改变。例如,冒泡排序、插入排序、归并排序和基数排序都是稳定的。冒泡排序通过相邻元素的比较...
快速排序描述:快速排序是对冒泡排序的一种改进,其基本思想是通过一趟排序将待排序记录分隔成独立的两部分,其中一部分记录的...3.递归地(recursively)把小于基准值元素的子数列和大于基准值元素的子数列排序。
1. **复杂度**:在计算机科学中,复杂度分为时间复杂度和空间复杂度。时间复杂度衡量了算法执行时间与输入规模的关系,而空间复杂度则关注程序运行所需的内存。理解这些概念对于优化代码性能至关重要。 2. **动态...
- 空间复杂度:衡量算法运行时所需的内存空间,同样使用大O记法来描述。 2. **Shell**: - Shell脚本是Linux/Unix环境下的命令行程序编写工具,用于自动化执行一系列任务。 - Shell的复杂度分析通常关注循环和...
本文将深入探讨数据结构、算法的总结,以及学习算法时应关注的时间复杂度和空间复杂度。 首先,数据结构是组织、管理、存储和检索数据的方式。常见的数据结构有数组、链表、栈、队列、哈希表、树(如二叉树、平衡树...
在计算机科学领域,时间复杂度是衡量算法效率的重要指标,它描述了算法执行时间与输入数据规模之间的关系。...在分析和优化算法时,不要忘记考虑空间复杂度,因为内存使用也可能影响程序的运行效率。
空间复杂度则是指某一算法在运行过程中临时占用存储空间的大小。 对于二分查找排序法,论文首先对其进行了描述,然后对其时间复杂度进行了分析。二分查找排序法是一种高效的查找算法,它可以在将一个数据集排序为...
Java 均摊复杂度和防止复杂度的震荡原理分析 Java 均摊复杂度是指在某些...Java 均摊复杂度和防止复杂度的震荡原理分析是非常重要的,它可以帮助我们更好地理解 Java 中的算法时间复杂度,并提高程序的性能和稳定性。
其中,时间复杂度作为衡量程序性能的关键指标之一,直接影响着程序的运行效率和用户体验。在教务管理系统这类涉及大量数据处理的应用场景中,随着学校在校生人数和课程数量的增加,数据量也随之剧增。为了确保系统的...
下面的算法都打包在一个应用当中,你只需要下载安装即可,里面有算法的介绍,时间复杂度,空间复杂度,代码示例 二叉树的遍历 二叉排序树 红黑树 AVL树 图的邻接表存储构成图 有向图的创建 拓扑排序-邻接矩阵存储-...
Java 面试笔试题及答案 在 Java 开发面试中,了解 Java 语言的基础知识和数据结构是非常重要的。...在 Java 中,了解算法的时间复杂度和空间复杂度非常重要,因为它可以帮助开发者选择合适的算法来解决问题。