算法的效率度量
1.4 算法复杂性分析
f(n) = n² + 100n + log10n(log10的n次方) + 1000
- 数据规模n逐步增大时,f(n)的增长趋势
- 当n增大到一定值以后,计算公式中影响最大的就是n的幂次最高的项
- 其他的常数项和低幂次项都可以忽略
算法渐进分析:大O表式法
- 函数f,g定义域为自然数,值域非负实数集
- 定义:如果存在正数c和n0,使得对任意的n>=n0,都有f(n)<=cg(n),
- 称f(n)在集合O(g(n))中,简称f(n)是O(g(n))的,或f(n) = O(g(n))
- 大O表示法:表达函数增长率上限
- 一个函数增长率的上限可能不止一个
- 当上、下限相同时则可用Θ表示法
大O最常用,大Θ通常也可简单看做大O
大O表示法的单位时间
- 简单布尔或算术运算
- 简单I/O
- 指函数的输入/输出 例如,从数组读数据等操作
- 不包括键盘文件等I/O
- 函数返回
大O表示法的运算规则
- 加法规则:f1(n) + f2(n) = O(max(f1(n), f2(n)))
- 顺序结构,if结构,switch结构
- 乘法规则:f1(n) * f2(n) = O(f1(n) * f2(n))
-
for, while, do-while结构
for (i=0; j<n; i++) for(j=i; j<n; j++) k++;
-
算法渐进分析:大Ω表示法
- 定义:如果存在正数c和n0,使得对所有的n>=n0,都有f(n) >= cg(n),则称f(n)在集合Ω(g(n))中,或简称f(n)是Ω(g(n))的,或f(n) = Ω(g(n))
- 大O表示法和大Ω表示法的唯一区别在于不等式的方向而已
- 采用大Ω表示法时,最好找出在函数增值率的所有下限中哪个最"紧"(即最大)的下限
算法渐进分析:大θ表示法
-
当上下限相同时则可用θ表示法
-
定义如下:
- 如果一个函数即在集合O(g(n))中又在集合Ω(g(n))中,则称其为θ(g(n))
-
也即,当上、下限相同时则可用大θ表示法
-
存在正常数c1,c2,以及正整数n0,使得对于任意的正整数n > n0,有下列两不等式同时成立:
c1 g(n) <= f(n) <= c2g(n)
问题空间 vs 时间开销
最坏(压力测试) 平均 最佳
顺序找k值
- 顺序从一个规模为n的一维数组中找出一个给定的K值
- 最佳情况
- 数组中国第1个元素就是K
- 只要检查一个元素
- 最差情况
- K是数组的最后一个元素
- 检查数组中所有的n个元素
顺序找K值----平均情况
-
如果等概率分布
- K值出现在n个位置上概率都是1/n
-
则平均代价为O(n)
n + 1 / 2
-
概率不等
- 出现在第1个位置的概率为1/2
- 第2个位置上的概率为1/4
- 出现在其他位置的概率都是 1/4(n-2)
-
平均代价为O(n)
1 + (n + 3) / 8
二分法找K值
对于已排序顺序线性表
- 数组中间位置的元素值Kmid
- 如果Kmid = K,那么检索工作就完成了
- 当Kmid > K时,检索继续在前半部分进行
- 相反地,若Kmid < K ,就可以忽略mid以前的那部分,检索继续在后半部分进行
- 快速
- Kmid = K 结束
- Kmid != K 起码缩小了一半的检索范围
二分法检索性能分析
-
最大检索长度为 log2(n+1)
-
失败的检索长度是 log2(n + 1) 或 log2(n + 1)
-
平均检索代价为O(logn)
在算法复杂性分析中
-
logn是以2为底的对数
-
以其他数值为底,算法量级不变
时间/空间权衡
- 数据结构
- 一定的空间来存储它的每一个数据项
- 一定的时间来执行单个基本操作
- 代价和效益
- 空间和时间的限制
- 软件工程
时空权衡
- 增大空间开销可能改善算法的时间开销
- 可以节省空间,往往需要增大运算时间
数据结构和算法的选择
- 仔细分析所要解决的问题
- 特别是求解问题所涉及的数据类型和数据间逻辑关系 ---- 问题抽象、数据抽象
- 数据结构的初步设计往往先于算法设计
- 注意数据结构的可扩展性
- 考虑当输入数据的规模发生改变时,数据结构是否能够适应求解问题的演变和扩展
思考:数据结构和算法的选择
- 问题求解的目标?
- 数据结构与算法选择的过程?
思考:数据结构的三要素
以下哪几种结构是逻辑结构,而与存储和运算无关()
A 顺序表 B 散列表 C 线性表 D 单链表
下面术语()与数据的存储结构无关
A 顺序表 B 链表 C 队列 D 循环链表
本文来自博客园,作者:寻月隐君,转载请注明原文链接:https://www.cnblogs.com/QiaoPengjun/p/16001118.html