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

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

伴随着你长大的“老师”都已经结婚生子,那么你呢?你的爱情又在哪里?

假如有一天,有这样一个机会降临到你的头上。

你的面前是一条很长很长的路,这条路上齐刷刷的站满了妹纸,没错,就是妹子,一双双大白腿闪闪发光。

此时你狠幸运,允许你从这些妹纸中选择一个最喜欢的带走,,,

但是呢,有一个条件,你只能从路的这头走到那头,只要你选择了一个妹子,就要离开这里,这个过程中,你只能选择一次,不可以走回头路,只要你选择了,那么不管后面的妹子多诱人都已经和你无关。

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

读到这里,请不要怀疑,这是一篇正经的技术文章,我也是一个非常正经的小编。

之前文章我们已经介绍了如何分析时间复杂度,戳这里,这里我们就借助上面的选择来分析下几个重要的概念。
上面寻找喜欢的妹子,可以写成如下的伪代码:

 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)

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

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

原文地址:https://www.cnblogs.com/yuqing6/p/10801022.html

时间: 2024-12-18 10:37:19

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

61. 从1到n,共有n个数字,每个数字只出现一次。从中随机拿走一个数字x,请给出最快的方法,找到这个数字。如果随机拿走k(k&gt;=2)个数字呢?[find k missing numbers from 1 to n]

[本文链接] http://www.cnblogs.com/hellogiser/p/find-k-missing-numbers-from-1-to-n.html  [题目] 从1到n,共有n个数字(无序排列),每个数字只出现一次.现在随机拿走一个数字x,请给出最快的方法,找到这个数字.要求时间复杂度为O(n),空间复杂度为O(1).如果随机拿走k(k>=2)个数字呢? [分析] 题目给出的条件很强,数字是从1~n的数字,限制了数字的范围:每个数字只出现一次,限制了数字出现的次数:随即拿走了一

被裁的第50天,我终于拿到心仪公司Offer

今天分享的是之前分享文章中被裁的小C,可以看这篇文<寒冬之下,被cai的那些人到底去哪了?>,最近他已经找到心仪公司今日头条Offer,并且即将入职,在应我要求下,他写了篇总结文如下.下文中的"我",不是鱼哥,是特指小C. 这两个月听的最多的两个词就是 寒冬 和 裁员,作为被裁大军中的一员,经历焦虑到担心,再到自信,最后到喜悦.焦虑的是那段被裁日子,不太好过,每天不敢下楼,就在房间里复习.也不敢告诉家里人.担心的是自己找不到工作,成为失业人员.自信是拿了几家二.三线厂off

[数据结构与算法 03] 最好、最坏、平均、均摊 时间复杂度

由来 /**** 在一个无序的数组(array)中 查找变量 x 第一次出现的位置.如果没有找到,就返回 -1 ****/ // n 表示数组array的长度 int find(int[] array, int n, int x) { int i = 0; int pos = -1; for (; i < n; ++i) { if (array[i] == x) pos = i; } return pos; } 分析出此函数的时间复杂度为 O(n) 在数组中查找一个数据,并不需要每次都把整个数组

《裸辞的程序猿漂流记二十》——备胎的自我修养一

首先向广大的猿们,表示深深的歉意:楼主由于有事耽搁了,迟来的更新.. 不知道为神马,今天感觉好开心,和妹子一起去麦当劳了,感觉到现在心都扑通扑通的跳啊!!!详细见后节.. 其次感谢广大围观的猿友们,小猿在此表示深深的敬意:感谢soledadzz 给博主上榜的机会,感谢积极评论的猿友们的大力支持,以致于让博主有更博的动力.. 下面,回到正文,首先打开QQ音乐播放器,输入"陈奕迅 时光隧道",Music起,CSDN 貌似不可以放点Music..要是能加个音乐播放器就酷毙了:来点Music

android面试

http://www.apkbus.com/android-115989-1-1.html 面试的几个回答技巧 http://blog.sina.com.cn/s/blog_ad991b1601018mjc.html 2013-5-9号补充:今天最新的腾讯面试题.应该说是全部面试中最难的.我个人感觉.并且是个女面试官.好嗨皮啊,哈哈. 腾讯面试题 1.int a = 1; int result = a+++3<<2; 2.int a = 2; int result = (a++ > 2)

这些年,我身边的那些人和事

引言 2013年的8月13日,群主打开自己的QQ,建立了第一个技术交流群,也就是现在的交流一群. 时光飞逝,转眼之间,3年半已经过去了. 当初建群的时候,群主才工作不到两年,期间借着业余时间,写了一个设计模式的系列,因此吸引了一批同道中人一起学习.为了给大家一个一起交流的地方,群主便顺手建了一个QQ群. 谁曾想,3年半过去了,这个无意之中建立的QQ群,不止见证了群主的成长,也见证了群里小伙伴儿的成长. 今天这篇文章,群主就和大家一起说说,群里的那些人和事. 这些过往的人和事,或许会让你产生共鸣,

我自己的Android面试试题总结整理

http://blog.sina.com.cn/s/blog_ad991b1601018mjc.html 2013-5-9号补充:今天最新的腾讯面试题,应该说是所有面试中最难的,我个人感觉.而且是个女面试官,好嗨皮啊,哈哈. 腾讯面试题 1.int a = 1; int result = a+++3<<2; 2.int a = 2; int result = (a++ > 2)?(++a):(a+=3); 3.int a = 1234567; int b = 0x06; int resu

跟叶子学把妹——教程序猿把妹第八集

自<天方叶谈>创刊以来,叶子一直在努力将自己的所见.所思.所感一点一点终结成泡妞经验,目的只有一个,就是让更多的伙伴们能够找到属于自己的"幸福"!不过,说来说去,现实中叶子其实就是个妞,还是个被别人追的妞(害羞ing- 没办法老娘就是这么炙手可热) 思来想去,这些经验也只是很小的一部分,叶子作为程序猿们的知心小妹妹,必须要捕获更多的信息量,才能让程序员哥哥们成功捕获猎物,啊~不对,是找到心仪的女盆友.有时候我也会想,到底自己跟大家总结的这些经验真的对么?现实中真的对程序员哥

中华英才网竞品分析报告2016

中华英才网竞品分析报告 1 背景 1.1 行业背景 1) 网民增速不断提升,移动端网民规模过半. 2016年1月22日,中国互联网络信息中心 (CNNIC)发布第37次<中国互联网络发展状况统计报告>.截至2015年12月,中国网民规模达6.88亿, 半数中国人已接入互联网. 其中,2015年新增网民3951万人,增长率为6.1%,较2014年提升1.1个百分点,网民规模增速有所提升. 图 1  2011-2018年中国整体网民数量及增长趋势 <报告>同时显示,网民的上网设备正在向