【字幕】恋上数据结构与算法之017动态数组05补充

习惯就是观察一下同学们在群里面聊什么。如果唉我发现群里面有很多同学在聊,我们昨天讲了一个东西,是吧?有些东西不理解的,我可能会在下一节课之前呢就会做一些补充啊,那我根据同学们聊的内容呢想给同学们做一些补充啊。

首先第一点就是我们的这个开发工具导入工程的一个问题,比如说啊我把我的代码呢已经教给大家了,那怎么把我的代码这个导入到你的这个开发工具里面,很简单,其实就是这样右击啊它这里有个引炮导入啊然后有个general,然后选择这个existing project就存在的项目,那这个时候双击一下,然后选择这个对吧?

然后呢就是找到我给你的那个代码,你就选择像那个文件,比如说你想导这个项目,那就点击它,然后点击选择文件夹,啊由于呢这个项目呢已经存在我左边了,所以它这里不给你勾选,啊到时候这里勾选一下对吧?再点击finish就可以导入了,这是第一个问题啊。

然后我们再看一下第二个问题,就是如果你引入了别人写的代码,比如说昨天我写了一个什么东西啊,昨天我写了一个东西叫做汤姆兔是吧?那很多同学把我这个汤姆兔拷贝到他的项目里面就报错,为什么呢?是因为我这个汤姆兔这里有个package,包名我的包名叫抗点MG,啊你看他本来就在抗点MG里面说这个没有问题对吧?

那如果你把这个汤姆考到别的包里面,那就跟这个packs看mj对不上,那到时候你只需要把这个报名改一下就可以了,这是第二个问题。

再看一下第三个问题就是复杂度的一个估算的一个问题啊,那昨天我一讲完这个复杂度估算啊,讲完这个什么斐波那契数是吧?这个fafab这个函数的估算以后呢,很多同学就自己课后算了一下啊,你看啊如果我们是用fab传一个5的话,那其实最后加起来刚好就是2的零次方一直加到2的3次方,其实就是2的4次方减1,那由于我们的这个n45,所以其实就是二的n次方减一,222应该说二的n减一次方是吧?

最终算下来是这个唉那这么一说完了,那很多同学就课后就去做测试,比如说如果我传一个6的话,是不是意味着刚好就等于2的零次方,一直加2的3次方,最后再来个加2的4次方呢?那很多同学做了这么一个测试啊,我就跟你说一下这个问题啊是这样,如果我们这个位置如果是传入一个6的话,那大概来说它的图呢是长这样子的,那我们来算一下吧啊一行一行算一下啊,那我们最上面这一行呢是2的零次方对吧?

也就是说只调用了一次,然后再往下走呢就是二的一次方,也就是说两次,然后你会发现没有,这两次呢分别又会调用另外两次是吧?

所以应该是二的平方,那再接下来应该是二的三次方。唉那剩下最后这些是多少呢?是刚好是2的4次方吗?其实算一下认真算一下,其实不是是2的,大概是2的4次方减1的样子。唉那大家可能就想唉那这样的话,那之前我们的公式不是不太严谨嘛,你看这个不是刚好是2的4次方是2的次方减1,甚至以后你传入这个7或者传入这个8,那这里的话不仅仅是减一,可能减得更多,也是有可能的。

啊很多同学可能有这样的疑惑,唉那我们之前那个呃判定为这个fib这个函数的复杂度是二的n次方指数级别是不是不准呢?不是的,我们那个结论是正确的,注意复杂度这个东西呢仅仅是一个估算,它并没有说要求到完全精准,复杂度一般来说我们更关注的是什么?

更关注的是增长趋势。

其实同学们可以认真看一下,这个图片的增长趋势,你看它的增长趋势是怎么样子的?首先下面一层你看一下啊,下面一层一般来说都是上面一层的两倍,你看比如说这个是上面这个要两倍,然后再下面这一层呢你会发现怎么样?又是上面这一层的两倍,因为我们每来到一个家伙它都会散开,左右两个分支,对不对?

所以每个家伙他都会乘以2,那以此类推,那这4个家伙他也会乘以2,对吧?所以你看又是2倍对吧?只不过呢刚好后面的时候呢几乎到达f二,对吧?Fib2fib1IB0了,所以就是没有继续往下散开,你可以思考一下,如果这个数字再大一点啊,比如说八九十,那肯定的肯定怎么样?肯定这一层又是上一层两倍,是吧?

然后下下一层又是上一层的两倍,只不过呢到了最后面的时候可能就不是两倍的关系,就可能像这个一样有点空缺,所以我们主要关注的是增长趋势。

从这个图可以看出来,增长趋势就是每往下一层几乎就是上面的两倍,所以这个很明显就是指数级别的增长,所以同学们我们的这个什么呢?我们这个复杂度计算是没有问题的,同学们千万要注意一下这个问题啊,然后我们再看一下,还有一个省略一些条件计算,什么意思呢?

我们打开一下我们昨天的这个代码,那昨天你看啊,我带着同学们去计算这个复杂度的时候怎么算呢?比如说这个我算作是一条是吧?然后呢这里执行了4次,所谓4条,然后这里也执行了4次,所以4条,所以我是这样给你算了是吧?

然后这个也是一样,这个执行了一次,这个执行了n次,这个也执行了n次,这个执行了n次,所以最终算下来是3n+1,其实以后啊遇到这种货循环,其实上面的东西我们都可以直接不算了,就直接看里面就好了。

你看这个或循环是执行的n次,所以它里面代码怎么样?

就执行了n次,所以其实我们可以一眼就看得出来这个就是n其实就是n就可以就算里面就可以了,为什么呢?原因很简单,因为复杂度的话它会把前面的这个什么呢?系数给省略掉,你想想是不是啊?你看你这个11这里是n次,这里是n次,那这个是二n嘛,那二n加n不就三n吗?那三n跟一个n有什么区别呢?没区别。

所以以后同学们获取完这些东西,其实你完全可以不用计算,就直接算作里面多少次就可以了。对吧?那如果是按照这种方法那就简单了,你看我们只看里面那里面执行多少次呢?很明显是n乘以n那所以它就是怎么样呢?呃 n平方对吧?所以它就是n平方,所以这个是没有问题的,对吧?

所以以后就省略这些就可以了,因为我们复杂度怎么样?都是估算,只不过一开始的时候我先给大家算的比较稍微精准一点对吧?把这些都算进去,但以后我们真正计算的时候,其实这些东西是可以不用算的啊,我们只算里面就可以了啊。

然后再看一个斐波那契相关的一个问题啊,那斐波那契相关的一个问题呢,昨天斐波那契这个数的话我们是怎么求?一个呢是使用递归的形式,一个呢是使用非递归的形式,对吧?其实非递归的形式的话,我们还可以再精简一下,怎么精简呢?就是可以省略一些局部变量,什么意思呢?

我们来看一下,我们再写第三个,我们再写我们的第三个,其实这个位置啊像这个位置我们完全可以不用这个萨姆这个变量也是可以的,其实我们这个代码在干什么呢?这个代码在干什么?是不是?

First跟second他们两个相加了,这个结果最后给second,就它们两个相加要给这个second,对不对?然后呢最右边这个second的这个值呢又给这个first,那其实我们完全可以怎么做呢?完全可以这么做。

Sec only second等于首先我们先这么写啊,second大家思考一下,这样是不是相当于将他们两个人的和将将他们两个人的这个和给了谁?给了这个second,对不对?那这个没问题,唉那你以前这个second只要给这个first,那怎么办呢?大家思考一下,这两个家伙相加得到一个和。

那怎么得到以前的这个赛克呢?很简单,那你用这个求出来和减去这个first不就能得到以前的赛克了吗?对吧?所以这个时候很简单,这个时候其实就是赛克减去first。

同学们想想是不是这样就可以了?它们的和减去first是不是就是以前的second?以前的second不就给了first了吗?那它们的和不就给了second吗?对吧?

一个新的second这样就可以了,然后这里面其实又是可以怎么样?又是可以省略,其实就是加等于,对吧?加等于就可以了,好这里就省了一个局部变量,实际上这里呢这里其实我们也可以省,你看这里是执行多少次,这里是执行n减一次对吧?0对吧?

小于n减一次,一致性n减一次,那么完全可以怎么样呢?直接把这里改成外循环,其实也是可以的,外循环那怎么写呢?N减减大一点,n减减大于0什么意思呢?其实就执行n次,那如果你要怎么样执行n减一次,那就是大于1就可以了啊,这个其实就是执行n减一次,这样就可以了同志们,那这个同样能达到我们的要求,我们来试一下啊,我们把这个东西呢给给把它注释掉,给它注释掉啊。

然后这这这个我改成10 12吧12啊,然后我们在这里面呢打印一下,呃看第二个就可以了,还有第三个我们看一下对不对?这个位置。好,那说明这个是没有问题的,对吧?这个就给大家补充一下,因为我看到同学们在群里面讨论,我看你们讨论的内容啊,我就想给你们补充一下这个问题啊。

还有一个还有同学讨论的一个问题,什么问题呢?其实求我们这个菲波那契数的话,其实还有一个方式,就是利用数学利用线性代数,其实利用线性代数也是可以解决这个问题的。

那这个斐波那契呢刚好可以用线性代数来解,是用了一个数列的特征方程,那这个特征特征方程怎么回事呢?我们了解一下就可以了啊,其实是这样子的。

斐波那契数列呢它可以这样去计算,然后其中的这个x一跟x二是什么呢?是这个呃1加根号5要除以2,x2呢就是这个,然后这个c一是什么呢?这个c一这个东西是什么呢?C一这个东西也是一个值,其实就是这个啊,那如果是这样子的话,大家想一想,最终的话我们斐波那契其实可就变成这样子,变成这样子。

那如果转换成这个代码的话,大概来说就是这样子。

你看由于呢我们这里是用到根号5,多次用到根号5,所以我们先把根号5的这个值对吧?先求出来,这个是Java里面的一个数学的一个函数,就是求根号5啊根号5,好,那根号5求出来以后,大家想一想,接下来是不是用套用这个公式就可以了,对吧?

你看一下啊,比如说像前面的这个什么意思呢?其实就是嗯1加根号5÷2,然后它的n次方,然后这个呢就是一减根号5÷2,它的n次方,对吧?

最后呢再去除以根号5,所以最后再除以根号5,所以这样去算,那如果是这样子的话,其实它的复杂度是多少呢?其实如果你真正要严格来讲,你要知道我们的这个复杂度复杂度是多少的话,你前提是你得知道这个sqrt这个函数,还有pow这个函数它的复杂度是多少?对吧?如果这几个函数它的复杂度都是一的话,那我们的整一个fib3它的什么?复杂度其实就是一。

And Uber sqrd的复杂度是n的tisntisn那加起来复杂度其实就是好几个n当然呃前面系数给省略那也是n对吧?所以它复杂度是多少?取决于这个函数多少,一般来说像这种数学求呃求值的一般来说你可以认为它复杂度是一,所以采取这种方法的话,在这这几个函数既然都认定为一,所以可以认定为我们的这个函数,它的复杂度其实可以视为是一。

O一,大o一是没有问题,唉那同学们就想哇那这种方式可以实现大o一,那以后我们采取这种不就好了吗?注意并不是以后我们呃工作中所有的算法问题都能像这个斐波那契数列一样这么好采,刚好有个公式能去做,对吧?不是这样子的。对吧?

所以这个只是刚刚好,我讲了这个例子呢刚好可以用数学公式来去解决,但我们其实开发中的很多问题是不能直接用一个公式搞定的,这个呢同学们了解一下就好,对吧?并不是说唉我们是以后所有算法都有公式呢,不是这样子的,只不过这个家伙呢是刚刚好而已,对吧?

而这个呢其实就是呃根据同学们之前的一些反馈,之前的反馈对吧?

来来给同学们一些答案,那这个pow究竟是log n还是oe的话,这个取决于你内部怎么实现,内部怎么实现啊像有一些有一些他真的是可以办到,对吧?

唉不用log n也是能解决这个问题的,这个取决于你怎么算啊,如果去自己去实现的话,确实是可以达到这个log n啊,如果是系统自级别的底层这些函数的话,那可能更优化也是说不定的啊。

然后我们再看一个问题啊,这个动态数组内部内容出来数组内存几时释放,同学们可能有这个疑惑,什么意思呢?我们来看一眼啊。你看这是我们昨天也写了一个动态速度,然后我们利用了一个动态速度对吧?利用了一个动态速度,这个这个对象那同学们可能很疑惑,因为很多同学之前可能没有学习过这个招法,你看啊你的这个对象呢你是念出来的,对吧?

你这个是拗出来的,拗出来是什么意思啊?拗的意思是什么?拗是像堆空间,对吧?

对于空间申请内存,对于空间申请内存,一说到对空间,其实在很多编程语言里面,对于空间的这个内存是需要主动释放的。

比如说在c加加里面,如果你列出来这个内存,你肯定在后面不需要用到它的时候进行一个delete的一个操作,对吧?但是呢这个Java里面是不需要,Java里面它是有什么呢?有垃圾回收啊,垃圾回收机制是不需要的啊,那它这个垃圾回收大概是怎么样一个原理呢?其实你可以解简单认为它就是看一下你有没有变量在引用着这个对象。

大家思考一下,一旦我们第二十行代码执行完毕,20行代码执行完毕,是不是意味着这个局部变量肯定销毁?那这个局部变量一旦销毁,就意味着没有任何变量指向这个对象。这个时候这个对象它所对应的对空间也会自动被回收,这个是它呃这个Java这个垃圾回收的一个做法啊,这个简单了解就可以。

关于这个垃圾回收更多东西呢,Java更多东西,大家可以去自己去自学这个Java语法对吧?啊然后我们再看一下,那相应的大家思考一下,那相应的我们这个厄瑞利斯特这个数组里面,动态数组里面是不是有个东西叫做艾利曼斯,那这个l里曼斯是不是里面又没有int,要有个容量容量的话,我们默认给的容量是10,所以一开始的话应该是10,实际上呢就是这里又有10个int类型,这么大的这个内存对吧?

连续的那里面这个iOS又什么时候释放呢?又什么时候释放呢?一样的一样的,你想想你的第二十行代码执行完毕以后,这个list这个变量肯定销毁,那这个变量一旦销毁就意味着它的内存肯定销毁,那它的内存一旦回收,一旦销毁,大家思考一下,一旦它的内存销毁是不是意味着这些东西就不见了?

那这些东西不见了是不是意味着指向new inter这个速度也就也就是这个速度指向这个new int这个数组的lms都不见了,那它都不见得是意味着这根线不在,那这根线不在是不是意味着那这些拗出来inter速度也不见了,对吧?这个也不见了对吧?

所以同学们完全不用担心这个内存问题啊,因为你这个Alex一旦销毁就意味着艾利曼斯也销毁,艾利曼斯都不见了,那就意味着它指向这个东西也不见了。好,这个就是Java这个垃圾回收相关的一个问题,这个我不多说了好吧,这些都是非常简单的东西。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值