引言
算法是一种定义了一系列操作步骤的方法,用于解决特定问题的计算过程。算法可以用来进行计算、数据处理、自动推理和问题求解等任务。一个算法通常包含输入、输出、控制流程、变量和操作。算法的设计目标是高效、正确和可理解性。在计算机科学领域,算法是程序设计的基础,是计算机解决问题的基本方法。常见的算法包括排序算法、搜索算法、图算法等。算法的时间复杂度和空间复杂度是衡量算法效率的重要指标。
1.什么是算法
算法是解决问题步骤的有限集合,通常用某一种计算机语言进行伪码描述。中一个方法中的步骤集合就是一个算法。
1.1.算法的五大特征
算法的五大特征:输入、输出、有穷性、确定性、可行性。
输入:零个或多个输入。
输出:一个或多个输出。
有穷性:有限步骤后在可接受时间内完成。
确定性:每个步骤都有确定含义,无二义性。
可行性:每一步都是可行的。
算法设计要求:正确性、可读性、健壮性、时间效率高和存储低。
正确性:有输入输出,无二义性,有正确答案。
可读性:方便阅读。
健壮性:输入不合法能处理
时间效率高和存储低:时间空间复杂度越低越好。----通过算法复杂度评估效率
2.算法复杂度
算法复杂度分为时间复杂度和空间复杂度。其作用: 时间复杂度是度量算法执行的时间长短;而空间复杂度是度量算法所需存储空间的大小。
2.1.时间复杂度
1.时间频度
一个算法执行所耗费的时间,从理论上是不能算出来的,必须上机运行测试才能知道。但我们不可能也没有必要对每个算法都上机测试,只需知道哪个算法花费的时间多,哪个算法花费的时间少就可以了。并且一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多。一个算法中的语句执行次数称为语句频度或时间频度,记为T(n)。
执行时间和运行的环境有关系,但是可以从理论上判断语句执行次数.--时间频度 ,比如 for(init i = 0 i < n ; i++) 时间频度是 n
2.时间复杂度分类
按数量级递增排列,常见的时间复杂度有:常数阶O(1),对数阶O(log2n),线性阶O(n),线性对数阶O(nlog2n),平方阶O(n2),立方阶O(n3),...,k次方阶O(nk), 指数阶O(2n) 。随着问题规模n的不断增大,上述时间复杂度不断增大,算法的执行效率越低。
Eg:
要在 hash 表中找到一个元素就是 O(1)
要在无序数组中找到一个元素就是 O(n)
n 要在无序数组中找到一个元素就是 O(n)
访问数组的第 n 个元素是 O(1)
二分搜索的时间复杂度最好的情况是 O(1),最坏情况(平均情况)下 O(log n)
访问链表的第 n 个元素是 O(n)
一个For循环是O(n)
两个For循环嵌套是O(n2) --> 课程TreeData查询
三个Foreach嵌套是O(n3)
2.2.空间复杂度
与时间复杂度类似,空间复杂度(Space Complexity)是对一个算法在运行过程中临时占用存储空间大小的量度,记做S(n)=O(f(n))。比如直接插入排序的时间复杂度是O(n^2),空间复杂度是O(1) 。而一般的递归算法就要有O(n)的空间复杂度了,因为每次递归都要存储返回信息。一个算法的优劣主要从算法的执行时间和所需要占用的存储空间两个方面衡量。 我们一般所讨论的是除正常占用内存开销外的辅助存储单元规模,一个算法的好坏通过时间复杂度和空间复杂度来衡量。
举例:缓存就是以空间换时间