减而治之(Decrease and conquer) 什么是“减而治之”?
为求解一个大规模的问题,可以将其划分为两个问题,其一平凡,另一规模缩减 ,分别求解子问题,由子问题的解得原问题的解
比如说,对于一个数组A的求和问题,可以设计如下的算法
sum( int A[], int n ) { return n < 1? 0 : sum(A, n - 1) + A[n - 1]; } 当规模缩减到一定程度后,抵达递归基,返回0
复杂度分析 1. 递归跟踪
绘出计算过程中出现过的所有递归实例(及其调用关系) ,那么它们各自所需时间之总和,即为整体运行时间
上例中,共计n+1个递归实例(分析),各自只需O(1)时间 故总体运行时间为:
T(n) =O(1) × (n+1) =O(n)
2.递推方程
对于大规模的问题、复杂的递归算法,递归跟踪不再适用 此时可采用另一抽象的方法…
在本例中,有T(n)=T(n-1) + O(1),T(0)=O(1)
则,T(n) = T(n-2)+O(2) = T(n-3)+O(3) = T(n-n)+O(n)=O(n)
可以看到,两种分析方法的出来复杂度都为O(n)
分而治之(Divide and conquer) 什么是“分而治之”?...
导论 所谓算法,即特定计算模型下,旨在解决特定问题的指令序列。输入:待处理的信息(问题)输出:经处理的信息(答案)
正确性 的确可以解决指定的问题
确定性 任一算法都可以描述为一个由基本操作组成的序列
可行性 每一基本操作都可实现,且在常数时间内完成
有穷性 对于任何输入,经有穷次基本操作,都可以得到输出
::: tip Algorithms + Data Structures = Programs
(Algorithms + Data Structures) x Efficiency = Computation
:::
如何评判算法的其优劣(计算模型) 实验统计是最直接的方法,但足以准确反映算法的真正效率?不足够! - 不同的算法,可能更适应于不同规模的输入 - 不同的算法,可能更适应于不同类型的输入 - 同一算法,可能由不同程序员、用不同程序语言、经不同编译器生成 - 同一算法,可能实现并运行于不同的体系结构、操作系统… 为给出客观的评判,需要抽象出一个理想的平台或模型 - 不再依赖于上述种种具体的因素 - 从而直接而准确地描述、测量并评价算法
1.图灵机模型(TM)
组成 说明 Tape 依次均匀地划分为单元格 各存有某一字符,初始均为'#' Head 总是对准某一单元格,并可 读取或改写其中的字符。每经过一个节拍,可 转向左侧或右侧的邻格 Alphabet 字符的种类有限 State TM总是处于有限种状态中的某一种 。每经过一个节拍 可按照规则转向另一种状态 。统一约定,‘h’ = halt(停止) 2....