【字幕】恋上数据结构与算法之010复杂度05大O表示法

视频地址:010复杂度05大O表示法_哔哩哔哩_bilibili

好,那我们现在大概算完这个东西以后的话,但是还是有点复杂,它看起来还是有点复杂,对不对?好,那我们怎么怎么办呢?这个时候我们就要借助我们这个大o表示法,大o表示法它就估算,怎么估算呢?是这样子的。在大额表示法里面它是要忽略掉一些东西的,什么东西呢?忽略常数什么意思呢?比如说我们刚刚的这个代码,你看这个这个是执行多少次,这个是执行了14次对不对?

这个其实当当我们这个n大到一定程度的时候,你想想同学们伯恩假设是1,100万的时候,这个14这个这个究竟是14还是10还是20,对他来说其实没什么意义,所以这种如果是常数,一般我们统一叫大o一,统一叫大o一,就是不管只要你是常数,我们以后就估算就是一好吧就这样子。

还有像这个这个你看如果我们是这样子,我刚刚说了常数我们直接忽略,所以这所以这个东西呢这个东西我们直接忽略,对吧?然后前面的这个常数项我们也直接忽略,为什么呢?因为当n大到一定程度的时候,这个常数我们可以不用管它,这个不用管它,这个是大o表示法的一个估算。

还有一个如果我们有这个什么呢?有这个有这个比较高阶的,你看这是二次方,这个是一次方,我们一般来说把这个低阶的直接忽略掉,因为当我们n大到一定程度的时候,这个二n其实对它是影响不大的,所以像这个东西我们直接表示为大on平方,然后前面这个就是直接是大on好,那如果我们有更高阶的,你看n的三次方,那后面这些我们直接忽略,我们直接忽略,要前面的这个常数系系数的,我们也不要直接变成n的什么?

三次方,直接变成n的三次方,然后以后这个n的三次方这样写也可以,这样写也可以,以后我可能会这样写,也可能会这样写,这个大家需要注意一下。

好,那既然是这样子的话,我们再来用大o表示法来表示一下我们的这个呃时间复杂度。首先这个由于是常数,我们直接是o一,然后这个呢?这个是大o是多少?大on那同学们那这个是多少?来,请说这个是多少大?O什么?N平方,对不对?好,那这个呢?

好,那这个也很简单,这个其实直接是到o然后这个的话先先放着这个这个问题我等会还会讲到这个,我们先放着对数的我们先放着,对数的我们先放着,啊那现在就剩下这个对数了,那对数呢有个问题我要说一下,什么问题呢?就这个对数的问题,对数的一个细节。

首先我们看一下噢,看一下看一下这个公式,log2n跟log9n它们之间是什么关系,你知道吧?Log 2n跟log9n其实可以这样算,log2n等于log29×log9n这个是数学上的一个计算啊,这个了解一下,就是这两个相乘其实等于log二n而且我们刚刚又说到,同学们我们刚刚又说到常数项我们是可以忽略的,既然常数项我们是可以忽略的,也就意味着你这个底数不管是2还是9,我都认为你们两个一样,所以只要是对数,只要是对数以后,我们统一叫log n也就意味着你不管是log2n还是log9 n log 10n他们俩之间其实都可以通过乘上一个常数对换,那既然是这样子,我们又又忽略掉这个常数项,那不就意味着左右两边其实是等价的吗?

所以以后不管你底数是多少,我们统一叫log n这是大o表示法,这个大家能不能听懂?我相信应该是没什么问题的。

好,那既然是这样子,同学们,那来到我们这个地方,来到我们这个地方,那这个大o复杂度我们直接就可以算出来,log n这个我们直接叫log n好,那这个5也是一样的,这个我们直接叫大o logo对吧?大o的意思就是估算,再看这个那这个估算下来应该是大o我想 log n加n log n对不对?

但实际上大o表示法都说了,低低的东西我一般直接省略,那n log n其实是比log n是高一阶的,所以这这个东西呢我们直接叫n log n log n好,就这样同学们,因为因为这个是这个相对n那个n来说是比较低阶的,也就意味着乳后以后如果你的算法是log n加n那明显这个是可以省略的,就这个意思。

好,同学们,所以这个家伙其实是n漏个n好,那刚才我就通过具体的实例告诉大家,唉这些算法怎么样?它的大概的这个时间复杂度是多少?那同学们那按照你的感觉,你看噢,一个是到一到n到n平方到n log n对吧?然后这也是log n这个也是n log n唉那我怎么知道这些哪个好哪个坏呢?是这样子的,这个大o是什么意思?

这个大o就是估算你最终的这个程序的执行次数大概是多少,比如说你传一个n你最终可能去执行n次差不多,你这个是传一个n最终可能执行n平方次,你这个是传一个n它都只需要执行一次,那你觉得哪个最好呢?那肯定是常数最好,肯定是常数最好,一是最好的,然后呢log n然后是log n然后呢然后是这个n然后呢再是n log n然后呢才是n平方,然后呢是n平方啊,等一下我会有个呃这个对比给大家啊。

然后再再说明一个问题,注意啊,我们大o表示法怎么样呢?

仅仅是一种粗略的分析模型,是一种估算,它能让我们就短时间内就了解一个什么呢?算法的执行效率,就是能帮助我们更快的去了解一个算法好还是坏对吧?如果我每次都要呃像之前一样写这个代码怎么样去测算那个时间,我们一开始不就是写代码测算时间嘛对吧?比如说通过这个这样去写,那太费时间了,那现在我们有了大o表示法,我们就可以大概可以估算一下,你看这个是到一,那这个是到n我们就明显能知道噢这个算法比较好,这个算法对比上面这个稍微差一点,那这个是一种估算的方法。

什么意思啊?啊有同学说到啊,你看啊我们刚刚说刚刚说我们的这个是14,可以直接忽略成一,那你可能会想唉那万一这个数字很大呢?比如说你不管n是多少,他都要执行这个14万次的,你也叫倒一吗?是的。

在我们这个大o表示法里面就是这样规定,如果你是常数,我们就直接忽略为一,而且我们这个大o这个时间复杂度我们也叫做渐进时间复杂度,也叫渐进时间复杂度,也就意味着你可认为是算n趋于无穷的时候,那这个大概是个什么情况?

所以这个东西同学们不用去纠结,不用去纠结,这个是大o表示法啊。所以以后同学们你在算的时候,你就这样去算就可以了。而且你思考一下,如果你的长寿项噢就是跟n没有关系,你常数项都要执行1亿次了,那说明你这个算法应该是有问题的,对吧?你这个算法肯定是有问题的。

好,然后我们再往下看,然后常见的这个复杂度呢大概有这么几个对吧?比如说你看你这些对不对?你可能执行12次,你可能执行二n加三次,那不管怎么样,我们最终变成复杂度,你看都比较简单,你看12就o12n加3on这个是n平方,这个是log n然后这个呢是什么呢?唉这里我好像写错了,稍等,这里我这里写错了。

N好,你看啊,这个是n log n然后呢这个是很明显是n的三次方对吧?这个是n的三次方,然后这个是二的n次方,稍等,我把一个东西搞出来,这个是二的 n次方啊,然后这个从大小来看呢,大家可以看一下这个就可以了,对吧?

看一下这个,然后也可以借助这个函数生成工具来对比一下那个复杂度,大家课后可以用这个网站自己去测一下,然后我把这个车的图片已经拿出来了,直接给大家看一下,大家看一下啊,当我们数据规模比较小的时候,我们对比一下这些算法的一个效率啊,这些标有颜色log n log n是哪一条呢?

是这一条,落根是这一条,你看随着这个数据规模这个增大,它值一直都很稳定,不是很大,你看对吧?

一直都很小,然后这个上面你看标的比较快的,我的数据都还不是很大,这个值已经很大了,对吧?数据规模都还很小,但是它最终的运算结果已经数字已经很大了,那这些是什么鬼东西呢?这些其实你看就是n的三次方,二的n平方这些对吧?好,那当数据跟我比较大的时候,我们再来对比一下,你看这个对比就很明显了。

然后你看一下最下面这一根,这是什么?这个是log n log n log n是这一条,你看看起来是不是几乎为0啊?跟常数差不多。

那这个是所以log n它确实是比较好啊,比较好,然后这个nn你看 n就是这个蓝色的这一条,蓝色这一条对吧?那这个红色这一条是什么?是n log n然后左边这两个呢比较突出的呢?那就是什么呢?就是后面这几个比较大的n平方,n的三次方,还有二的n次方,那其中最牛逼是哪个呢?

那肯定是最左边这个你看就是值很小的时候已经飙到最高了,非常非常高,这个是二的n平方,所以同学们如果以后你的算出来这个时间复杂度基本上是这两个啊这一基本上这几个的,那说明这个算法就可能不太行了,就可能相对来说就比较慢了,这三根线就是这个了。

N平方,然后我们再看一个呃空间复杂度,空间复杂度,空间复杂度呢它也是一样的,就大概估算一下需要多少存储空间。

来我们算一下空间复杂度,我们看一下这个我们看一下这个空间复杂度是多少,这个那什么叫空间复杂度?

就看一下执行这个代码它需要占用多少存储空间,是不是这个意思啊对不对?那这个需要占用多少增长空间,你没发现这一句代码它只用了这个东西吗?只定义了个变量I只定了个变量I对不对?那既然只定义了一个变量,I就意味着它只占了int类型的一个int类型,那说明什么?说明它空间复杂度,我们可以认为是o一,对吧?这是空间复杂度。

再看这个那这个明显也只用了一个I这是o一。

我们来看另外一个问题,看这个看这个那这个空间复杂度是多少呢?那这个我们来看一下啊,那这个你可以认为是常数项,前面这几个你看都是常数项,因为跟n没什么关系啊,但是这个家伙就跟n有关系了,对吧?这个这个条就跟n有关系了,你看你n是多少,我就像堆空间申请多少个int类型,对吧?

对空间申请多少个类int类型,所以这个空间复杂度我们可以大概算出来就是噢n因为这些都是常数项,啊这这个也是阐述一下是这样。

好我就不多说了。其实很多时候呢我们更关注的可能是时间复杂度,因为现在我们写的很多程序的话,好好多时候这个硬件设备的内存呢对吧?比如说假设你是做PC端的程序,这个内存就更不用说了,现在都是比较大,所以很多时候我们更关注的可能第一时间更关注的可能还是可能还是什么东西呢?还是时间复杂度。刚刚说到我们这个大o表示法是干什么呢?

是估算一下这个程序指令的执行次数,都说了是估算啊,其实如果你要较真一点,其实这个并不是程序的指令的执行次数,为什么呢?因为像我们这些代码,你最终要让这个CPU执行起来,肯定要转成什么呢?汇编指令。

你写的这些Java代码什么代码,最终啊它跑到这个CPU,跑到这个内存里面,它肯定是要转成汇编指令,最终肯定是汇编指令,比如说像你的这一句打印,我们刚刚是算成只有一条程序指令,其实真正来说肯定不是一条,你表面上看是一条,它其实转化成很多很多的这个什么呢?

他已经转成了很多的汇编指令,对。

啊可能是100条1000条1万条都有可能都有可能对不对?啊这这是有可能的,但是不管你这个是100条还是多少条,啊,比如说你这个真真实来讲是100条汇编指令,你真实来讲是100条汇编指令,其实这个判断也是有汇编指令的。

你这个判断假设是两条汇编指令,你这个判断假设是两条汇编指令对不对?好,那你加上判断的话,那不就是2+100吗?好那行,那我就算你102嘛,102嘛对吧?我就算你102,好然后你这些呢可能又这里可能又不是一,这里可能有两条对吧等等,但是不管你是多少条,你思考一下这样加起来还是常数啊,这样加起来还是常数啊,这样最终加起来还是常数,那还是大v啊。

所以我们就没必要去较真去看它对应的汇编指令是多少条,没有必要。所以一般来说我们估作为估算来讲,我们作为估算来讲,就是估算大概的程序指令次次数,比如说这个就估算成一条。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值