算法分析

来源:互联网 发布:编程的那些事儿(10 编辑:程序博客网 时间:2024/06/03 12:34

 第二章 算法分析

这章主要介绍如何进行算法分析

1. 数学理论

进行算法分析的时候需要的数学理论知识,主要是函数的关系,增长率,上界,下界

A. 如果当N大于某个值时,对于函数T(N) <= F(N) 那么有 T(N) = O(F(N))

意思是函数T(N)的增长率(增长率就是导数)小于F(N),在N大于某个值后,T(N)始终小于F(N),这样称F(N)是T(N)的上界

B.如果当N大于某个值时,对于函数T(N) >= F(N)那么有T(N) = Ω(F(N)),(我是打oumu欧姆,打出来的,但是这个符号叫omega)

意思是函数T(N)的增长率大于F(N)的增长率,当N大于某个值后,T(N)的值始终大于F(N),那么称F(N)为T(N)的下界

C. 如果函数T(N)  = O(F(N)), 而且 T(N) = Ω(F(N)), 那么T(N) = theta(F(N))

意思是函数T(N)和F(N)的增长率相同,有相同的上下界


2. 计算模型和规则

计算时候只要按编程时候的语句计算就行,比如 x = x + y;

不用计算它的时间,这就是基本单位

规则就是按编程来算,for 是多条,if 是一条

for (int i = 0; i < 100; i); 这是100条


3. 需要分析的问题

计算的的时候算的是算法的最坏情况,不算平均情况



4. 计算算法的运行时间 例子

A. 线性时间的一个例子,

计算1到100的和

int sum = 0;

for (int i = 1; i < 101; i++) sum += i;

∑(i = 1; i = 100) 1; 算法时间是 100 - 1 + 1 = 100

作者列举的是∑(i = 1, i = N) i*i*i = 1**1 + 2**2 +...+N**N = O(N)


B. 指数时间的一个例子

∑(i = 1, i = N)∑(j = 1, j = N) i

= ∑(i = 1, i = N) Ni = 1*N + 2*N + 3*N+ N*N = N * (N + 1)/2

作者列举的是最大子序列求和的例子。这个例子很经典。不同的算法有不同的时间界限

穷举法O(N**3)

分治算法O(NlogN)

动态规划O(N) 很屌。以前我面试被问过,当时完全懵逼


C. 对数时间的一个例子

二分查找

时间计算:假设查询的个数为N,那么每次把N分为N/2再次进行查找,那么多少次之后查找的集合变成了1个呢。

这不典型的对数的定义吗? N 每次 除以2, 多少次之后 结果是 1,次数就是K=logN

当时我还想了想,举例说明,1000以10为底的对数。log10(1000)

那么就是1000每次除以10,多少次后结果是1, 1000/10=100/10=10/10=1, 3次,那么log10(1000)=3


总结:算法分析就是计算程序运行的次数。需要用数学公式进行证明

原创粉丝点击