一、时间复杂度
时间复杂度是评价一个算法好坏的标准;假如一个操作和数据量没有关系,每次都是固定时间内完成的操作,叫做常数操作。而时间复杂度经常用常数操作的时间作为指标,用big O来表示,具体来说,不要低阶项,不要常数项,去掉高阶项系数,剩下的如果是f(N),则此算法时间复杂度记为O(f(N))。
对一个算法而言,首先分析其时间复杂度,接着在分析由于不同数据样本下的运行实际时间(例如:选择排序)。
理解时间复杂度-冒泡排序
冒泡排序在实际应用中虽然越来越少,但是拿它做例子可以很好的理解算法的时间复杂度。
假设一个数组的长度是L,排序次数是i,冒泡排序经过2次循环实现,对于外层的循环而言,每次都要和剩下的(L - i)个数组比对,所以是L + (L-1) + (L-2) + ...+1,是等差数列,最高阶项是平方项,按照约定,冒泡排序的时间复杂度就是O(N^2)。
二、递归
2.1、递归本质
递归是自己调用自己的过程(老师讲的),系统中递归是不断压栈(每次压栈就会记录本次的每个变量的具体信息,程序运行行号等等等),最后弹栈的过程。
一般而言递归都是包含:(1)终止条件;(2)调用自己的过程;(3)常数操作的过程(例如归并排序?)
2.2、递归时间复杂度计算
master公式: T(N) = a*T(N/b) + O(N^d)
第一部分:递归被分为几个过程;第二部分:常数操作的过程
1) log(b,a) > d -> 复杂度为O(N^log(b,a))
2) log(b,a) = d -> 复杂度为O(N^d * logN)
3) log(b,a) < d -> 复杂度为O(N^d)
具体例子可以参考归并排序
2.2、理解递归概念例子
归并排序 O(N*logN)
小数问题
逆序对问题