时间复杂度和空间复杂度是算法中最重要的知识点!!!
大家好,我是帅蛋!
在本蛋看来,复杂度分析是数据结构和算法中最重要的知识点,毫不夸张的说,这就是数据结构与算法学习的核心所在。你学会了它你就入的了门,你学不会它,你就永远不知道门儿在哪。
我在这里只说一下:为什么复杂度分析会这么重要?
具体的内容已经放在我在牛客网的专栏【图解数据结构与算法】中了,点击下面的链接直达:
保姆级教学!带你玩转时间复杂度和空间复杂度!
为什么复杂度分析会这么重要?
这个就要从盘古开天辟地,呃,从数据结构与算法的本身说起。
我平常白天做梦的时候,总是想着当当咸鱼划划水就能赚大钱,最好就是能躺着,钱就直接砸到我脑阔上。数据结构与算法虽然没有本蛋这么大的梦想,但是它的出现也是想着花更少的时间和更少的存储来解决问题。
那如何去考量“更少的时间和更少的存储”,复杂度分析为此而生。
蛋蛋:所以为什么复杂度分析重要你们知道了叭?
臭宝:不知道不知道
蛋蛋:啥?还不知道???
臭宝:对呀对呀
蛋蛋:。。。
既然你诚心诚意的不知道,那我就大发慈悲的打个不恰当的比方。
如果把数据结构与算法看成武功招式,那复杂度分析就是对应的心法。
如果只是学会了数据结构与算法的用法,不学复杂度分析,这就和你费尽千辛万苦在隔壁老王家次卧进门右手第二块地砖下偷挖出老王打遍村里无敌手的村林至宝王霸拳,然后发现秘籍上只有招式,没有内功心法,好好得王霸拳变的还不如王八拳。只有学会了王霸之气,才能虎躯一震,王霸之气一噗,震走村口光棍李养的哈巴狗。
臭宝:哇,厉害厉害厉害,你胖你说的都对,但还是没必要学啊。
蛋蛋:???
臭宝:现在有很多工具啊包啊,代码随便跑一下,就能轻轻松松知道运行了多少时间占了多少内存啊。算法的效率不就轻松比对出来了么?
蛋蛋:。。。
吐样吐森破!吃葡萄不吐葡萄皮!
你们说的这种主流叫做事后统计法。
简单来说,就是你需要提前写好算法代码和编好测试数据,然后在计算机上跑,通过最后得出的运行时间判断算法时效的高低,这里的运行时间就是我们日常的时间。
我且不用“万一你费劲心思写好的算法代码本身是个很糟糕的解法”这种理由去反驳你,事后统计法本身存在很多缺陷,它并不是一个对我们来说有用的度量指标:
首先,事后统计法太依赖计算机的软件和硬件等性能。代码在 core i7 处理器的就比 core i5 处理器的运算速度快,更不用说不同的操作系统、不同的编程语言等软件方面,就算是在同一台电脑上,用的所有的东西都一样,内存的占用或者是 CPU 的使用率也会造成运行时间的差异。
再者,事后统计法太依赖于测试数据集的规模。同样是排序算法,你随便整 5 个 10 个的数排序,就算最垃圾的排序算法,也看起来快的和法拉利一样,如果是来10w 个 100w 个,那不同的算法的差距就很大了,而且同样是 10w 个 100w 个数,顺序和乱序的时间又不同了。
那么问题来了,到底测试数据集选多少个合适?数据的顺序如何定又算合适?
说不出来了叭?
可以看出,我们需要一个不依赖于性能和规模等外力影响就可以估算算法效率、判断算法优劣的度量指标,而复杂度分析天生就是干这个的,这也是为什么我们要学习并必须学会复杂度分析!
时间复杂度
时间复杂度,也就是指算法的运行时间。
对于某一问题的不同解决算法,运行时间越短算法效率越高,相反,运行时间越长,算法效率越低。
空间复杂度
空间复杂度相较于时间复杂度来说,比较简单,需要掌握的内容不多。
空间复杂度和时间复杂度一样,反映的也是一种趋势,只不过这种趋势是代码运行过程中临时变量占用的内存空间。