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