1.6算法分析初步
算法(Algorithm):是对特定问题求解方法的一种描述,是指令的有限序列,其中每一条指令表示一个或多个操作。
特性:
- 输入:有0个或多个的输入
- 输出:有一个或多个的输出
- 确定性:每步定义都是确切,无歧义的
- 有穷性:算法应在执行有穷步后结束
- 可执行性:每一条运算应通过有限次完成
1.6.1算法效率的度量
算法执行时间需通过依据该算法编制的程序在计算机上运行所消耗的时间来度量。
方法通常有两种:
- 事后统计:计算机内部进行执行时间和实际占用空间的统计。
- 事前分析:求出该算法的一个时间界限函数
1.6.2时间复杂度度量:
- 运行时间 = 算法每条语句执行时间之和。每条语句执行时间 = 该语句的执行次数 × 语句执行一次所需时间。
- 语句执行一次所需时间取决于机器的指令性能和速度和编译所产生的代码质量,很难确定。
- 通常设每条语句执行一次所需时间为单位时间,则一个算法的运行时间就是该算法中所有语句的频率之和。
算法中基本操作重复执行的次数是问题规模n的某个函数,其时间量度记作T(n)=O(f(n)),称作算法的渐近时间复杂度(Asymptotic Time complexity),简称时间复杂度。
一般地,常用最深层循环内的语句中的原操作的执行频率(重复执行的次数)来表示。
六种常用计算算法时间的多项式:
- O(1)< O(log n)< O(nlog n)<O(n2)<O(n3)
- 指数时间关系为:
- O(2n)<0(n!)<O(nn)
当n取得很大时,指数时间算法和多项式时间算法在所需时间上非常悬殊。
有的情况下,算法中基本操作重复执行的次数还随着问题的输入数据集不同而不同。
快捷计算方法:
Case 1:基本语句与n无关 O(1)
Case 2:分裂原则 n/2 O(log2n)
Case 3:单一循环,依赖n O(nlog2n)
Case 4:双循环,分裂原则 O(nlog2n)
Case 5:双循环 O(n^2)
常见时间复杂度
执行次数函数举例 | 阶 | 非正式术语 |
---|---|---|
10 | O(1) | 常数阶 |
2n+4 | O(n) | 线性阶 |
3n^2+4n+1 | O(n^2) | 平方阶 |
5log2n+2 | 0(logn) | 对数阶 |
2n+3nlog2n+10 | O(nlogn) | nlog阶 |
6n3+2n2+3n+4 | O(n^3) | 立方阶 |
2^n | O(2^n) | 指数阶 |
(ps:log2n是以2为底数,nlog表示为n倍的log2n)
1.6.3算法的空间分析
空间复杂度(Space complexity);是指算法编写程序后,在计算机中运行时所需存储空间大小的度量。记作:S(n)=O(f(n))n为问题的规模。
- 指令常数变量所占用的存储空间;
- 输入数据所占用的存储空间;
- 辅助空间。(算法的空间复杂度指的是辅助空间)
- 一维数组a[n]:空间复杂度 O(n)
- 二维数组a [n] [m]:空间复杂度 O(n*m)
总结
数据结构与算法绪论主要知识点在于弄清楚基本的关键词概念以及时间复杂度和空间复杂度的计算方式。