数据结构与算法一:算法复杂度分析

来源:互联网 发布:淘宝口腔无影灯 编辑:程序博客网 时间:2024/05/21 09:24

T(f(N)) = O(g(N)) 表示f(N)的增长率是小于g(N)的。 数学表达是f(N) <= cg(N) N>n0(c、n0是个常数)

T(f(N)) = θ(g(N)) 表示f(N)的增长率是等于g(N)的。 数学表达是f(N) = cg(N) N>n0(c、n0是个常数)

T(f(N)) = Ω(g(N)) 表示f(N)的增长率是大于g(N)的。 数学表达是f(N) >= cg(N) N>n0(c、n0是个常数)

    复杂度有这么3种描述,通常我们用big o 来描述复杂度,通过求一个算法的最坏情况就可以获得,这种最坏情况就是一个上限了,同时要保证这是一个渐进上界,常量系数与低阶项都可以去掉。 例如3N^3+2N^2+1可以写成N^3

我们之所以不去求复杂度的平均值,是因为有时候比较难求,而且不能说明算法到底效率怎么样

我们求算法复杂度是基于一个简单的计算模型的,每个操作是一个时间单位。

计算复杂度是,由内向外进行计算,这样子比较方便。

下面是一个for循环的计算方法

int sum = 0;

for(int i=0, i<N; i++){ 循环N次 初始化耗1个单位,比较耗N+1个单位,自增耗N个单位, 加上下面的(4N+2)*N个单位总耗4N^2+4N+2

for(int j=0; j<N; j++){// 循环N次 初始化耗了1个单位, 比较N+1次耗了N+1个单位, 自增N次耗了N个单位, 加上下面语句2N个单位总共4N+2 

sum += a[i][j];  // +与=耗了2个时间单位

}

}

最后T(f(N)) = O(N^2) (去除常量系数与低阶项,从内往外计算复杂度)

0 0