参考:本文为小甲鱼教学视频的学习笔记。
1、为什么要学习时间复杂度和空间复杂度?你说一个算法好另外一个算法不好,有什么判断依据?哪个算法效率高?怎么判断?那么就要学习时间和空间复杂度了。
思考:学习每一个知识之前都应该要考虑一下为什么要学习,学了有什么用处,什么场景下去用。
2、算法的效率高一般是指算法的执行时间,度量一个算法的执行时间有2种方式:
- 事后统计法:需要编写测试程序,万一不好花费大量的时间精力,赔了娘子又折兵(并且测试环境不同差别不是一般的大)
- 事前统计法:程序编写前,使用统计方法对算法进行估算
思考:百度搜索事前避孕药和事后避孕药,会有更深刻的理解
3、一个高级语言编写的程序在计算机上运行时所消耗的时间取决于下列因素:
- 算法采用的策略,方案(方法思路)
- 编译产生的代码质量(编译器的优劣,编译语言的优劣)
- 问题的输入规模(输入量的多少,需要一个循环)
- 机器执行指令的速度(硬件环境)
4、我们研究算法的复杂度,侧重的是研究算法随着输入规模扩大增长量的一个抽象,而不是精确地定位需要执行多少次。因为如果这样的话,我们就又不得不考虑编译器优化的问题,然后就没然后了。
思考:因为外部因素的影响很大,很难精确定位执行次数,那就对增长量抽象出来进行对比未尝不是一个好的方案。
5、如何对增长量进行抽象:忽略程序所用的语言、忽略程序跑在什么样的机器上、不计哪些循环索引的增长和循环终止条件、变量声明、打印结果。我们只关心它所实现的算法。
思考:分析程序的运行时间,最重要的是把程序看成独立于编程语言的算法或者一系列的步骤。
6、我们在分析一个算法的运行时间时:重要的是把基本操作的数量和输入模式关联起来。
思考:分析随着输入量的增加,操作数量的增长情况用以判断算法效率高低。
7、函数的渐进增长:对于给定的两个函数f(n)和g(n),如果存在一个整数N,使得对于所有的n>N,f(n)总是比g(n)大,那么,我们说f(n)的增长渐进快于g(n)。与最高次项线程的常熟并不重要,也可以忽略,常数也可以忽略。判断一个算法的好不好,只通过少量的数据是不能够判断的,以免以偏概全。
思考:判断算法效率是,函数中的常熟和其他次要项常常可以忽略,而更应该关注主项(也就是最高项)的阶数
0526.第二章:时间复杂度和空间复杂度[数据结构]