算法基础-----一------大O符号(复杂度问题)

本文解释了大O符号的概念,它是评估算法效率的关键工具。文章详细介绍了计算算法复杂度的五条基本规则,以及常见的时间复杂度类型,如O(1), O(logN), O(N), O(NlogN), O(N^2), O(2^N)和O(N!),帮助读者理解和预测算法的运行时间随问题规模变化的趋势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一 什么是大O符号

大O符号使用函数来描述数据规模增长到很大时算法的最坏性能是如何与问题规模相关的(有时称为程序的渐进性能)。这个函数写在大写字母O后面的符号里。
例如,O(N^2)是一个算法的运行时间(或者内存使用,抑或任何你想衡量的东西)的增长与输入N的平方成正比。如果加倍了输入的数据,运行时间大约增长到原来的四倍。如果把输入的数据变为原来的三倍,运行时间增加到九倍。

二 计算算法的大O符号的五个基本规则

1)如果一个算法对于一个数学函数f执行一系列的步骤f(N)次,它需要O(f(N))步
2)如果一个算法对于函数f执行了一个需要O(f(N))步的操作,然后对于函数g执行了第二个需要O(g(N))步的操作,这个算法的总体复杂度是O(f(N)+g(N))。
3)如果一个算法的复杂度是O(f(N)+g(N)),并且对于足够大的N,函数f(N)远大于g(N),这个算法性能可以被简化为O(f(N))。
4)如果一个算法执行了一个需要O(f(N))步的操作,对于操作中的每一步执行了另外O(g(N))步,这个算法的复杂度是O(f(N)xg(N))。
5)忽略常数的倍数。如果C是一个常数,O(Cxf(N))等同于O(f(N))。并且O(f(CxN))等同于O(f(N))。

[注] 大O符号只是为了让你了解算法的理论性能,记住这个是很重要的。实际操作中的结果可能不同。

三常见的运行时间函数
1,时间复杂度为O(1)的算法

复杂度为1的算法使用常数的时间,无论问题规模多大。这种算法往往执行相对琐碎的任务,因为它们在O(1)时间里甚至都不能遍历输入内容。

2.时间复杂度为O(log N)的算法

复杂度为O(log N)的算法通常在每一步中把它必须考虑的元素的数量除以一个固定的因数。
eg. 完全排序二叉树
如果一个树是一棵满的完全二叉树,每一个节点都恰好有2或0个子结点,最底层将恰好有全部节点的一半。这意味着如果搜索一个在树中随机选取的值,这个算法在大多数情况下必须遍历这棵树的绝大多数层。
一颗高为H的完全二叉树如果叶子全满,其有在这里插入图片描述个结点。从另一个角度看,一颗包含N个节点满的完全二叉树的高度大约为在这里插入图片描述
因为在最坏或平均情况下,这个算法从树的顶端搜索到底端,并且这棵树的高度大约是在这里插入图片描述,所以这个算法的时间复杂度是在这里插入图片描述
这时候对数一个有趣的特点发挥了作用。可以用下面的公式把一个以A为底的对数转换成B。在这里插入图片描述
而由于大O符号忽略常量的倍数,所以,在底没有标明的时候,时间复杂度经常写为O(log N)。

3. 复杂度为O(sqrt(N))的算法

一些算法的复杂度为O(sqrt(N)) (sqrt是平方根函数)但是他们并不常见,这个函数增长很慢,但比log N增长的快一些。

4.复杂度为O(N)的算法

函数N增长的都比log N和sqrt N快但并不快很多,所以大多数复杂度是O(N)的算法在实践中表现得都相当不错。

5.复杂度为O(N log N)的算法

假设一个算法遍历其中输入的所有元素,然后在每一个循环中,对那个元素执行了复杂度为O(log N)的计算,在这种情况下,这个算法的复杂度为O(N log N)。
另外,一个算法执行时间复杂度为O(log N)的操作,在这之中的每一步,对这个输入中的每一个元素都执行操作,这个算法的的时间复杂度也是O(N log N)。

6.复杂度为O(N^2)的算法

N的其他次幂,比如O(N ^ 3),O(N^4),都可能出现,但明显的都比O(N ^2)慢,如果一个算法的时间复杂度包含多项式,包括N,O(N ^2),O(N ^3),O(N ^6),甚至O(N ^4000),他的时间复杂度就是多项式的时间复杂度。

7.复杂度为O(2^N)的算法

向2^N这样的指数增长极快,所以只对小问题有实际意义。一般时间复杂度是指数级的算法都要考虑选取最优的输入。
eg 背包问题

8.复杂度为O(N!)的算法

阶乘函数写作N!时间复杂度是阶乘级的经典算法是寻找最佳的输入安排。
eg 旅行商问题

四 总结

为了有效的使用一个算法,不仅需要理解算法是如何工作的,也需要理解他们的性能特点。如果你知道一个算法的时间复杂度,就能估计如果改变问题的大小,运行时间如何改变。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值