算法分析
来源:互联网 发布:编程的那些事儿(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
总结:算法分析就是计算程序运行的次数。需要用数学公式进行证明
- 算法分析
- 算法分析
- 算法分析
- 算法分析
- 算法分析
- 算法分析
- 算法分析
- 算法分析
- 算法分析
- 算法分析
- 算法分析
- 算法分析
- 算法分析
- 算法分析
- 算法分析
- 算法分析
- 算法分析
- 算法分析
- P2161 [SHOI2009]Booking 会场预约
- 论mysql死锁的切入点以及解决方法
- ARM开发板运行执行文件,找不到库报错的解决方法
- JZOJ5230. 【NOIP2017模拟A组模拟8.5】队伍统计
- 编程模拟五
- 算法分析
- Hibernate的HQL,QBC 查询语言(包括多表联合查询join)
- MFC编写计算器
- 从一个字符数组中读出相应的整数、实数
- ubuntu maven install&config
- Java开发中的23种设计模式详解(转)
- 内存管理概述
- Shuffle'm Up
- POJ 3259 Wormholes (Bellman-Ford判断负环)