算法分析中,为什么分析最坏情况而不是平均情况

本文探讨了算法的时间复杂度分析,特别是在关注实时性的场景下,如何选择使用平均复杂度还是最坏情况复杂度进行评估。通过具体例子说明了不同场景下对算法的要求差异。

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

作者:知之
链接:https://www.zhihu.com/question/28713446/answer/41845297
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

于什么时候用平均,什么时候用最坏,It depends。

那些对实时性没什么要求的情形,用平均复杂度就OK了
比如在实验室用某个算法分析1千万条数据,我们关心的是总共花多少时间,所以只需要知道算法的平均时间复杂度就够了。

但是对那些实时性要求非常高的地方,必须分析最坏情况的复杂度。
比如比如汽车防抱死系统,差10毫秒就是人命关天,时间就是生命。

电信中主管网络损坏,需要在50毫秒之内倒换到备份网络之中,否则可能有成千上万个通话中断,损失重大,至于航天系统,实时的重要性要求不言而喻。


这个时候,你跟我说你的算法平均情况是很快的,但是某些情况很慢?那肯定不能用,因为这些某些情况很慢会导致巨大的损失。这些情况下必须把最坏情况的复杂度控制在某个阈值之下,至于平均复杂度处于次要位置。


---------------------------原答案---------------------------------
谁说不分析平均情况了?
比如经典的快排算法,我们既要知道它最坏情况的时间复杂度为O(n^2),
也要知道它在平均情况下时间复杂度为O(n\log n)
并且在大多数情况下,快排时间复杂度为c\times n \log n中的系数c相对其它几个同为O(n \log n)的算法来说是较小的,所以大家才常用它。(比如Java#Arrays.sort对基本类型用的就是改进过的快排算法)。


有时,多次试验的期望复杂度(平均情况)才是我们关心的

期望复杂度=最坏情况的概率 * 最坏情况的复杂度 + 一般情况的概率 * 一般情况的复杂度

假如对长度为n的数组做多次某种操作,耗时 n^2 纳秒的概率p,n\log_2 n 纳秒的概率1-p

期望复杂度= O(p n^2+ (1-p)n\log_2 n)=O(pn^2 + n\log_2 n) (1)

对p分情况分析:

1.如果p是常量,时间复杂度是O(n^2)
2.如果p与n正相关,由于p的上限是1,n增大p会趋近于1,时间复杂度是O(n^2)
3.如果p与n负相关,O(p) > O( \frac {\log_2 n}{n}),代入(1),O(n\log_2 n) < 复杂度 < O(n^2)
4.如果p与n负相关,O(p) = O( \frac {\log_2 n}{n}),代入(1),复杂度= O(n\log_2 n)
5.如果p与n负相关,O(p) \leq O( \frac {\log_2 n}{n}),代入(1),复杂度< O(n\log_2 n)

可见,对于1,2,关心平均情况就是关心最坏情况,对于4,关心平均情况是更关心一般情况

经(偷)验(懒)告诉我们,p 是常量的算法更多

也有时,最坏情况是我们关心的

比如一个算法,一般情况占耗时n\log_2 n B,最坏情况耗时n^2 B,我们的目标是响应时间不能超出限制,超出了就会有严重的惩罚,那么只需要考虑最坏情况,再假如n个数据是用户提供的,情况会怎样呢?有个恶意的用户,知道了你的算法实现后,给你了n个使最坏情况一定发生的数据...


作者:朱文彬
链接:https://www.zhihu.com/question/28713446/answer/41874855
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值