【算法】时间复杂度,递归认识

一、时间复杂度

时间复杂度是评价一个算法好坏的标准;假如一个操作和数据量没有关系,每次都是固定时间内完成的操作,叫做常数操作。而时间复杂度经常用常数操作的时间作为指标,用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、理解递归概念例子

github参考

归并排序 O(N*logN)

小数问题

逆序对问题

猜你喜欢

转载自blog.csdn.net/azg_forward/article/details/80724069