【1.4】算法复杂性分析
一、算法的渐进分析
$$f(n)= n^{2} + 100n +log_{10}n + 1000$$
- 数据规模 n 逐步增大时, f(n) 的增长趋势
- 当 n 增大到一定值以后,计算公式中 影响最大的就是 n 的幂次最高的项 – 其他的常数项和低幂次项都可以忽略
1.1 大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 表示法:表达函数增长率上限
-
一个函数增长率的上限可能不止一个
-
当上、下限相同时则可用 Θ 表示法
f(n) = O(g(n)) , 当且仅当
- 存在两个参数 c > 0 ,n0 > 0, 对于所有的 n ≥ n0 , 都有 f(n) ≤ cg(n)
• iff ∃ c, n0 > 0 s.t. ∀ n ≥ n0 : 0 ≤ f(n) ≤ cg(n)
大 O 表示法的单位时间
- 简单布尔或算术运算 *简单 I/O
- 指函数的输入/输出。例如,从数组读数据等操作
- 不包括键盘文件等 I/O
- 函数返回
大 O 表示法的运算法则
1.2 大 Ω 表式法
- 定义 :如果存在正数 c 和 n0,使得对所有的 n ≥ n0, 都有 f(n) ≥ cg(n), 则称 f(n) 在集合 Ω (g(n)) 中,或简称 f(n) 是 Ω (g(n)) 的, 或 f(n) = Ω (g(n))
- 大 O 表示法和大 Ω 表示法的唯一区别在于不等式的方 向而已
- 采用大 Ω 表示法时, 最好找出在函数增值率的所有下 限中那个最“紧”(即最大)的下限
1.3 大 Θ 表示法
1.4 问题空间 vs 时间开销
二、例子
2.1 顺序找 k 值
- 顺序从一个规模为 n 的一维数组中, 找出一个给定的 K 值
- 最佳情况
- 数组中第 1 个元素就是 K
- 只要检查一个元素
- 最差情况
- K 是数组的最后一个元素
- 检查数组中所有的 n 个元素
顺序找 k 值——平均情况
如果等概率分布
- K 值出现在 n 个位置上概率都是 1/n
2.2 二分法找 k 值
对于已排序顺序线性表
- 数组中间位置的元素值 kmid
- 如果 kmid = k,那么检索工作就完成了
- 当 kmid > k 时,检索继续在前半部分进行
- 相反地,若 kmid < k,就可以忽略 mid 以前的那部分,检索继续在后半部分进行
- 快速
- kmid = k 结束
- Kmid ≠ k 起码缩小了一半的检索范围
三、讨论
3.1 时间/空间权衡
- 数据结构
- 一定的空间来存储它的每一个数据项
- 一定的时间来执行单个基本操作
- 代价和效益
- 空间和时间的限制
- 软件工程
3.2 数据结构和算法的选择
- 仔细分析所要解决的问题
- 特别是求解问题所涉及的数据类型和数据间逻辑关系 —— 问题抽象、数据抽象
- 数据结构的初步设计往往先于算法设计
- 注意数据结构的可扩展性
- 考虑当输入数据的规模发生改变时, 数据结构是否能够适应求解问题的演变和扩展
3.3 数据结构和算法的选择
- 问题求解的目标?
- 数据结构与算法选择的过程?
参考资料
北京大学 《数据结构与算法》 张铭、赵海燕、宋国杰、黄骏、邹磊、陈斌、王腾蛟
这里是一个广告位,,感兴趣的都可以发邮件聊聊:tiehan@sina.cn
个人公众号,比较懒,很少更新,可以在上面提问题,如果回复不及时,可发邮件给我: tiehan@sina.cn
个人公众号,比较懒,很少更新,可以在上面提问题,如果回复不及时,可发邮件给我: tiehan@sina.cn