这个五一是个不平凡的五一,苍老师成功诞下了双胞胎。

伴随着你长大的“老师”已经结婚生子,那么你呢?你的爱情又在哪里?
假如有一天,有这样一个机会降临到你的头上。
你的面前是一条很长很长的路,这条路上齐刷刷的站满了妹纸,没错,就是妹子,一双双大白腿闪闪发光。
此时你狠幸运,允许你从这些妹纸中选择一个最喜欢的带走,,,
但是呢,有一个条件,你只能从路的这头走到那头,只要你选择了一个妹子,就要离开这里,这个过程中,你只能选择一次,不可以走回头路,只要你选择了,那么不管后面的妹子多诱人都已经和你无关。

这样的选择是不是像极了我们的人生?苏格拉底曾说过,人生就是一次无法重复的选择。

读到这里,请不要怀疑,这是一篇正经的技术文章,我也是一个非常正经的小编。
之前文章我们已经介绍了如何分析时间复杂度,戳这里,这里我们就借助上面的选择来分析下几个重要的概念。
上面寻找喜欢的妹子,可以写成如下的伪代码:


// grilsArr 表示所有妹子的集合
// expect 表示是你想带走的妹子
function findGirls(grilsArr,expect){const n = grilsArr.lengthfor(let i=0; i<n; i++){if(grilsArr[i] === expect){return grilsArr[i]}return null}
}复制代码

上面代码的含义是,遍历整个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)

对于同一段代码在不同情况下会有不同量级复杂度的情况,最好、最坏、平均情况时间复杂度概念的引入能够帮助我们更好的分析算法的效率。

欢迎扫描下方二维码,关注我的公众号。

你能找到心仪的妹子吗?- 时间复杂度进阶相关推荐

  1. VS Code 变身约会利器!以码会友,轻松找到心仪的TA!

    在韩老师的<Visual Studio Code 权威指南>一书中,我向大家推荐了许多好用的插件,其中也不乏许多摸鱼插件,刷知乎.炒股票.看电影.听音乐.追番.看小说,一应俱全. 前不久, ...

  2. 00后必看:如何在互联网就业寒冬和疫情的双面夹击下找到心仪工作

    往年来说"金九银十"都是求职的黄金时期,但是今年就业市场却一反常态,以至于2023届的准毕业生,还没迎来属于自己的求职高峰期,就提前遭遇了职场的第一次滑铁卢. 在疫情和互联网寒冬的 ...

  3. 买二手房不用愁,Python爬虫一键爬取海量二手房源,分分钟找到心仪房子!【附源码】

    一.前言 之前有买二手房的需求,苦于房源太多无从下手,一个一个看又太慢,所以借助 Python 批量爬取房源筛选出符合我们调解的房源,再看的话会节省很多时间. 二.思路 某家上房源比较真实可靠,这里就 ...

  4. 裸辞3个月,面试了25家公司,终于找到心仪的工作了

    ​上半年裁员,下半年裸辞,有不少人高呼裸辞后躺平真的好快乐!但也有很多人,裸辞后的生活五味杂陈. 面试25次终于找到心仪工作 因为工作压力大.领导PUA等各种原因,今年2月下旬我从一家互联网小厂裸辞, ...

  5. 干货丨如何准确找到剪辑点?后期剪辑进阶必看

    干货丨如何准确找到剪辑点?后期剪辑进阶必看 初级剪辑师在剪辑时可能会聚焦在已有影视素材的整理,但优秀的剪辑师关注的点应该更加巧妙细致,要真正做好剪辑,知道"什么时候该剪"很重要. ...

  6. 年前裸辞,至今工作还没着落,在家里发慌,该如何找到心仪工作?

    分享职场生活.职场攻略.领导同事相处技巧和创业资源 文|洪生鹏 01 年前因为种种原因,我辞职了,办理好离职手续后,看着离职证明盖着鲜红的公司印章,想想不用做这个项目做一点那个项目做一点的繁琐工作了; ...

  7. 发现对象的方法有哪些_哪些途径可以找到心仪的男朋友或女朋友

    很多人因为忙于工作,一不小心就成了家人的催婚对象,每逢过年家里就成了七大姑八大姨的催婚战场.因此好多单身贵族们都害怕过年,甚至不敢回家.也有的人被家人逼得没辙了,干脆租个女友或者男友回家,先应付一下, ...

  8. 脱单攻略 | 如何找到心仪的另一半?

    离双十一还有半个月,还打算一个人欢度光棍节吗? 时间紧任务急,如何在茫茫人海中找到生命的另一半? 人生一切难题,知识都有答案. 内容来自得到,而得到app的专栏,大师课,精品课,每天听本书已经整理完成 ...

  9. 经历考研失败后如何找到心仪的工作

    我先简单介绍自己的情况,湖北某双非不知名一本院校电子信息专业毕业,经历了考研失败后在19年春招面试了很多家公司包括格力.烽火通信以及很多家国有企业,拿到了几个自己觉得还不错的offer,最终去了一家福 ...

最新文章

  1. 深度学习和目标检测系列教程 15-300:在 Python 中使用 OpenCV 执行 YOLOv3 对象检测
  2. python3 pygame的发射子弹自编程序
  3. hadoop中map的个数
  4. OpenCV-Python 中文教程(搬运)目录
  5. SCHAR_MIN常数,C ++中的示例
  6. Mac OSX 命令行知识
  7. 部分基于layui的时间函数
  8. power bi dax_M语言和Power BI中的DAX之间的差异
  9. springboot2.0处理自定义异常始终返回json
  10. php uid gid,用户信息,函数介绍,PHP开源CMS系统帮助文档
  11. 【java】详解java中的注解(Annotation)
  12. js基础之动画(一)
  13. 蓝牙小电池图标_TWS同时兼有一圈二动铁配置?国产蓝牙耳机这是要玩哪样!
  14. ppap文件过程流程图制作_PPAP提交范本---过程流程图
  15. Mac连接京瓷打印机Fs-1030MFP/DP
  16. vux scroller在iOS13上,一停止滑动就跳到顶部
  17. 实现嵌入式linux自动同步网络时间---NTP
  18. 丢手帕程序C语言,约瑟夫问题,即丢手帕游戏
  19. 播放器android版最新官方版下载安装,万能播放器安卓版下载
  20. Python简单爬取起点中文网小说(仅学习)

热门文章

  1. PO、VO、FormBean的思考
  2. canvas-绘制矩形-读书笔记
  3. 安装Team Services Agent Win7
  4. python3的星期函数_calendar在python3时间中有哪些常用函数?怎么用?
  5. pcre安装_Nginx学习_第一期_安装及安装问题解决
  6. linux 读取命令行输入,Linux read命令的使用
  7. 编程难学?3点解答你的疑惑
  8. java中自造类是什么意思_Java建造者模式是什么?如何实现?(附代码)
  9. php正则替换%3cbr%3e_php利用正则替换过滤掉js(script)代码
  10. vscode 无法跳转到函数定义_玩转VS Code