你能找到心仪的妹子吗?- 时间复杂度进阶
这个五一是个不平凡的五一,苍老师成功诞下了双胞胎。
伴随着你长大的“老师”都已经结婚生子,那么你呢?你的爱情又在哪里?
假如有一天,有这样一个机会降临到你的头上。
你的面前是一条很长很长的路,这条路上齐刷刷的站满了妹纸,没错,就是妹子,一双双大白腿闪闪发光。
此时你狠幸运,允许你从这些妹纸中选择一个最喜欢的带走,,,
但是呢,有一个条件,你只能从路的这头走到那头,只要你选择了一个妹子,就要离开这里,这个过程中,你只能选择一次,不可以走回头路,只要你选择了,那么不管后面的妹子多诱人都已经和你无关。
这样的选择是不是像极了我们的人生?苏格拉底曾说过,人生就是一次无法重复的选择。
读到这里,请不要怀疑,这是一篇正经的技术文章,我也是一个非常正经的小编。
之前文章我们已经介绍了如何分析时间复杂度,戳这里,这里我们就借助上面的选择来分析下几个重要的概念。
上面寻找喜欢的妹子,可以写成如下的伪代码:
1 // grilsArr 表示所有妹子的集合 2 // expect 表示是你想带走的妹子 3 function findGirls(grilsArr,expect){ 4 const n = grilsArr.length 5 for(let i=0; i<n; i++){ 6 if(grilsArr[i] === expect){ 7 return grilsArr[i] 8 } 9 return null 10 } 11 }
上面代码的含义是,遍历整个Grils数组,一个一个的寻找妹子,如果找到了自己想要的,那么带上走人,如果很不幸,到最后你都没能找到,那么返回null。
按照上篇文章中的分析,上面代码的时间复杂度为O(n) 。
最好、最坏情况下的时间复杂度
如果事情是这样发展的,当你见到第一位妹子的时候,就惊呼“哇,长得好像苍老师!”,你们一见钟情,确认过眼神,她就是我想要的人。
那么恭喜你,这种情况循环只执行了一次,时间复杂度是常数阶O(1),像这种在最理想的情况下,执行这段代码的时间复杂度,我们就称之为最好情况下的时间复杂度。
有最好的情况,就有最差的情况,如果你一直犹豫,一直贪心,总觉得后面会有更好的,到最后,你又都觉得不如之前的适合自己,最终到了最后一个妹子,你也没能选出自己喜欢的人,最终空手而归。(这种人,活该单身啊~)
这种情况就需要遍历全部的数组,时间复杂度为O(n)。 像这种在最糟糕的情况下,执行这段代码的时间复杂度,我们就称之为最坏情况下的时间复杂度。
平均情况时间复杂度
上面说的两种情况,都是比较极端的情况,发生的概率极低,无法用来表示平均情况。
介绍平均情况时间复杂度之前,先带大家复习一个数学知识点: 加权平均值。
-------------------------------
上面我们可以带走一个妹子,选妹子的时候一定会综合评估这个妹子是否是自己想要的人,假设从以下几个方面来给妹子打分,每个考察项的权重如下
1. 颜值 占60%
2. 身材 占20%
3. 气质 占15%
4. 性格 占5%
每一项我们都以百分制来计算,现在有这个妹子的分数如下
1. 颜值 90分
2. 身材 80分
3. 气质 70分
4. 性格 10分
那么这个妹子加权处理后的最终得分是 90×60%+80×20%+70×15%+10×5%=81 分
-------------------------------
平均情况时间复杂度就是对所有可能出现的执行情况,根据其权重进行加权平均计算出的时间复杂度。 接下来,我们分析一下findGrils方法的平均时间复杂度。 选择妹子一共有 n+1情况,分别是选择了第1-n个(对应数组的下标0-n-1)妹子中的一个和没有找到妹子。
我相信大部分男同胞们选择的话,大概率会选择出自己喜欢妹子,最终抱得美人归。为了便于理解,我们就假设能选择到喜欢妹子的概率是90%,空手而归的概率是10%。
在能选择到妹子的情况下,选择了第1到第n个的概率是相同的,为1/n。 画个表格看看每种情况下的概率。
选择第n个妹子 | 数组下标 | 循环次数 | 概率 |
---|---|---|---|
1 | 0 | 1 | 1/nx90% |
2 | 1 | 2 | 1/nx90% |
3 | 2 | 3 | 1/nx90% |
... | ... | ... | ... |
n | n-1 | n | 1/nx90% |
-1 | -1 | n | nx10% |
所以加权后的时间复杂度为
T(n)= 1 x 1/n*90% + 2 x 1/n*90% + 3 x 1/n*90% + n x 10% = 0.55n + 0.45
所以最终计算的平均情况时间复杂度为O(n)
对于同一段代码在不同情况下会有不同量级复杂度的情况,最好、最坏、平均情况时间复杂度概念的引入能够帮助我们更好的分析算法的效率。
欢迎扫描下方二维码,关注我的公众号。