您的位置:首页 > 娱乐 > 八卦 > 【字幕】恋上数据结构与算法之008复杂度03算法的评估

【字幕】恋上数据结构与算法之008复杂度03算法的评估

2024/10/6 5:59:32 来源:https://blog.csdn.net/linkangqi/article/details/142248265  浏览:    关键词:【字幕】恋上数据结构与算法之008复杂度03算法的评估

视频地址:008复杂度03算法的评估_哔哩哔哩_bilibili

所以我们看怎么去评判一个算法的这个好坏。首先我们来,所以我们看怎么去评判一个算法的这个好坏。首先我们来看两段代码,第一段代码是这个,第二段代码是这个,那同学们你直观的去看一下这两段代码,你觉得哪个算法比较好?这两个能做的事情都是1+2+3+4一直加到n那同学们那这两个算法你觉得哪个比较好呢?那肯定是二比较好,对吧?为什么?

因为它一步到位,你想想1+2+3一直叫n那不就可以一加n的和乘以n除以二吗?这不是一个以前就学过的一个公式吗?你看两三个运算解决,一个加一个乘一个除三个运算解决,你呢还需要或循环循环n次去加,对不对?

那这个明显就是这个东西算法效率比较高嘛,那为什么它算法效率比较高呢?为什么?难道是因为它代码比较短吗?代码越短,就证明这个代码越好吗?肯定不是,肯定不是对不对?

你看这个就是活生生的例子,那这个这个代这个代码多短呢?但是它性能很差,这个代码虽然长一点,但是它性能很好,对不对?所以肯定是不是看代码的这个长短对不对?那那这为什么这这个我们一眼就能看出来这个比较好,这个比较差呢?我们怎么去评判呢?这样啊,如果单从这个执行效率效率上去评估的话,我们可能会想到这么一种方案去评判一个算法的好坏,就是比较不同算法对同一组输入的执行处理时间,这个就是我们刚刚采取的一个方法。

对吧?比如说我们刚刚呃输入的都是什么?都是46或45对吧?同一组输入,然后评判一下这两个算法执行时间,这个是一种方法对吧?

刚刚我们做就是这种方法,这种方法其实我们也叫事后统计法,就是你先让他执行代码,执行完之后呢,我们再看一下它的这个效果,这个叫事后统计法啊,这个方法是可以是可以,但是有一个明显的缺点,什么缺点呢?

它的执行时间严重依赖这个硬件,就是如果你用不同的CPU去跑同样一份代码的话,最后得出来这个时间结论可能是不一样的,对吧?它它还可能依赖各种运行时不确定的这个环境因素,你想想如果我们当前这台电脑打开的软件比较多,对吧?

比如说当我们执行这个算法的时候,当我们执行fibe的时候,当时打开的软件假设比较多,那这个时候CPU的这个占用率可能比较高,对吧?那到时候他执行这个代码肯定相对可能会在这个对比以前是吧可能会相对慢一点,要执行这个代码的时候,假设我们现在CPU使用率不是很高,那它对比以前可能就会快一点,那这样的话真的会影响这两个的时间,对吧?

所以这种方法的话是有一定的缺陷的,而且还必须得编写相应的测试代码。

你想一想,我们刚刚为了测试这两段代码测试这两个函数,测试这两个方法哪个效率比较高,我们是不是还得写代码去测,你看我还写了这两句,还写了这一句是不是得写代码去测?测那以后我们每每每写一个算法,我们就是写一大堆代码去测吗?那这个样这样也比较麻烦,对不对?而且测试数据的选择也比较难保证公正性,什么意思呢?

有时候你会发现我们写了两个不同的算法,那这两个不同算法都是解决同一个问题的,但是这两个算法呢可能对不同的这个输入有不同的反应,比如说上面这个算法,你这个n如果传的是100,它可能比较快,你这个算法呢它n传的是100,它可能比较慢,但是反过来这个n呢这这个这个这个算法呢,如果n传的是200的话,就是两个算法呢对不同的输入可能效果是不一样的,那究竟你用哪个输入来测呢?

你用100好还是200好呢?那这个就是比较难保证公正性,这个是有可能有这样的问题,对吧?所以怎么去评判一个算法好跟坏呢?是这样的,一般来说我们从以下维度去评估一个算法的这个好坏,第一个是正确性,那这个是废话对吧?如果我得到的结果都不正确,那这叫什么算法。

第二个呢是可读性,就是我们写出来的代码不能乱七八糟对吧?要好看对不对?别人能看懂,这个叫可读性,还有一个健壮性,健壮性就是对不合理输入的反应能力跟处理能力,比如说假设他传了这个n你计算的是1+2+3+n假设他传了n是负数,你这个传进来计算的结果会不会有问题,或者说它传的是负数,你这个代码会不会崩溃?

程序会不会闪退?会不会直接退出对吧?

那这个东西都叫精装系统,还有一个叫时间复杂度,那这个也是评判我们一个算法好坏的一个东西,叫时间复杂度,那时间复杂度是什么东西呢?其实就是估算一下我们这个程序指令的执行次数。

什么意思呢?比如说举个例子,假设我们以分号为单位,这一句叫一句指令,假设啊这是一句指令,然后这是一句指令,这是一句指令,这是一句指令,这是一句指令,这也是一句指令。就是这样去算,唉我们这个这个代码它执行了多少句,这个持平,这个是一种评判,这个叫时间复杂度。

那通过这个东西呢我们就可以估算它的执行时间,为什么这么说呢?因为我们现在先假定一个东西,假定每一句指令啊它执行时间假设是一样的,啊假设每一句指指令的执行时间是一样,比如说这一句跟这一句跟这一句跟这一句跟这一句跟这一句的执行时间是一样,我们先做这么一个假设,等会我再给你讲详细的东西好吧?

那如果我们有这么一个假设的话,那如果我想估算它的时间,大家思考一下,我们是不是就可以考直接考察一下它执行了多少句指令,是大概可以猜得到他要花多少时间了,对吧?

好这是一个,还有一个东西叫做空间复杂度,空间复杂度就是估算一下所需要占用的存储空间,对吧?比如说你你这个算法需要定义多少个变量,需要开辟多少存储空间来解决这个东西,我们叫空间复杂度,那如果是一个好的这个算法,肯定是先符合前面这三个对吧?

符合前面三个的基础上,然后呢时间复杂度要低,空间复杂度也要低,也就意味着你所所需要的程序的指令的执行次数要低,要要是要开辟的存储空间也要低,对吧?那这个算法肯定是更好了。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com