作者:知之
链接:https://www.zhihu.com/question/28713446/answer/41845297
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
链接:https://www.zhihu.com/question/28713446/answer/41845297
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
于什么时候用平均,什么时候用最坏,It depends。
那些对实时性没什么要求的情形,用平均复杂度就OK了
比如在实验室用某个算法分析1千万条数据,我们关心的是总共花多少时间,所以只需要知道算法的平均时间复杂度就够了。
但是对那些实时性要求非常高的地方,必须分析最坏情况的复杂度。
比如比如汽车防抱死系统,差10毫秒就是人命关天,时间就是生命。
---------------------------原答案---------------------------------
谁说不分析平均情况了?
比如经典的快排算法,我们既要知道它最坏情况的时间复杂度为
,
也要知道它在平均情况下时间复杂度为
并且在大多数情况下,快排时间复杂度为
中的系数c相对其它几个同为
的算法来说是较小的,所以大家才常用它。(比如Java#Arrays.sort对基本类型用的就是改进过的快排算法)。
那些对实时性没什么要求的情形,用平均复杂度就OK了
比如在实验室用某个算法分析1千万条数据,我们关心的是总共花多少时间,所以只需要知道算法的平均时间复杂度就够了。
但是对那些实时性要求非常高的地方,必须分析最坏情况的复杂度。
比如比如汽车防抱死系统,差10毫秒就是人命关天,时间就是生命。
电信中主管网络损坏,需要在50毫秒之内倒换到备份网络之中,否则可能有成千上万个通话中断,损失重大,至于航天系统,实时的重要性要求不言而喻。
这个时候,你跟我说你的算法平均情况是很快的,但是某些情况很慢?那肯定不能用,因为这些某些情况很慢会导致巨大的损失。这些情况下必须把最坏情况的复杂度控制在某个阈值之下,至于平均复杂度处于次要位置。
---------------------------原答案---------------------------------
谁说不分析平均情况了?
比如经典的快排算法,我们既要知道它最坏情况的时间复杂度为

也要知道它在平均情况下时间复杂度为

并且在大多数情况下,快排时间复杂度为


有时,多次试验的期望复杂度(平均情况)才是我们关心的
期望复杂度=最坏情况的概率 * 最坏情况的复杂度 + 一般情况的概率 * 一般情况的复杂度
假如对长度为n的数组做多次某种操作,耗时 纳秒的概率p,
纳秒的概率1-p
期望复杂度= =
(1)
对p分情况分析:
1.如果p是常量,时间复杂度是
2.如果p与n正相关,由于p的上限是1,n增大p会趋近于1,时间复杂度是
3.如果p与n负相关,,代入(1),
< 复杂度 <
4.如果p与n负相关,,代入(1),复杂度=
5.如果p与n负相关,,代入(1),复杂度<
可见,对于1,2,关心平均情况就是关心最坏情况,对于4,关心平均情况是更关心一般情况
经(偷)验(懒)告诉我们,p 是常量的算法更多
也有时,最坏情况是我们关心的
比如一个算法,一般情况占耗时

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