Hailstone序列
- 程序 ≠ 算法
- 对于任意的n,总有 | Hailstone(n) | < 无穷 ?
Turing Machine图灵机
- 构成部件:
- Tape带:依次均匀地划分为单元格,各存有某一字符,初始均为 ‘#’
- Alphabet字符表:字符的种类有限
- Head读写头:总是对准某一单元格,并可读取或改写其中字符;每经过一个节拍,可转向左或右侧邻格
- State状态:有限状态的一种,每经过一个节拍,可按照规则转向另一种状态
- 转换函数:
- Transition Function: (q, c; d, L/R, p)
- 若当前状态为q,且当前字符为c,则将当前字符改为d,转向左/右侧邻格,并转入‘p’状态
- 当状态为 ‘ h ’ = halt,则停机
RAM(Random Access Machine)
- 寄存器顺序编号,总数没有限制
- 每一基本操作仅需常熟时间
- 可通过编号直接访问任意寄存器(call-by-rank)
- 将算法的运行时间转换为算法需要执行的基本操作次数
2-Subset:NPC
- 定理:| 2S| = 2^| S |^ = 2n
- 2-Subset is NP-complete,就目前的计算模型而言,不存在可在多项式时间内回答此问题的算法。
封底估算(Back-Of-Envelope Calculation)
减而治之Decrease-and-conquer
为求解一个大规模问题,可以将其分解为:其一平凡,另一规模缩减的两个子问题。
分而治之Divide-and-conquer
为求解一个大规模问题,可以将其分解为若干个(通常为两个)子问题,规模大体相当。
大师定理/主定理/Master Theorem
fibonacci数
- 递归版fibonacci数低效根源:各递归实例均被大量重复地调用
- 迭代
· memoization(制表备查)
· 颠倒计算方法:自底向上递归
LCS(Longest Common Sbusequence)最长公共子序列
- 方法1(递归):最好O(n+m); 最差O(2n)
- 递归基:若n=-1或m=-1,则取做空序列
- 减而治之:若A[n] = ‘X’ = B[m],则LCS(n-1, m-1)+‘X’
- 分而治之:A[n] ≠ B[m],则LCS(n, m-1)与LCS(n-1, m)中取更长者
- 方法2(动态规划—迭代):O(n*m)
- 单调性:每经过一次比对,至少一个序列的长度缩短一个单位
可扩容向量
- 容量加倍策略
- 容量递增策略
T*oldElem = _elem; _elem = New T[_capacity += INCREMENT] - 对比
有序向量唯一化
- 低效版O(n2):在有序向量中,重复的元素必然相互紧邻构成一个区间,每一个区间只需保留单个元素即可。低效根源:同一元素可作为被删除元素的后继多次前移
- 高效版O(n):将同一元素作为一个区间,不同元素覆盖在其第一个元素后
有序向量查找
1. 二分查找A
- 复杂度:线性递归 T(n) = T(n/2) + O(1) = O(nlog
n
) - 递归跟踪:轴点总能取到中点,递归深度O(nlog
n
),各递归实例仅耗时O(1) - 成功、失败时的平均查找长度均为O(1.5log
n
)以任一元素 - S[mi] 为界都可将待查找区间 [lo,hi) 分为三部分,且 S[lo,hi) <= S[mi] <= S(mi,hi),因此只需任取x = S[mi]
2. 二分查找B
- 将左右分支转向代价不平衡的问题,用划分2个分支方向解决
- mi取作中点:e < x,则深入左侧的[lo,mi);x <= e,则深入右侧的[mi,hi)
- 相对于版本A,最好(怀)情况更坏(好),整体性能更稳定
3. 二分查找C
- 在算法执行过程中的任意时刻
1. A[lo-1]:总是(截止当前已确认的)不大于e的最大者(m)
2. A[hi]:总是(截止当前已确认的)大于e的最小者(M) - 当算法终止时,A[lo-1] = A[hi-1]即是(全局)不大于e的最大者
- 代码实现
4. Fib查找
通过递归深度的不均衡对转向成本的不均衡做补偿,平均查找长度应能进一步缩短
5. 插值查找
- 适用情况:已知有序向量中各元素随机分布的规律(eg.独立且均匀的随机分布)
- 轴点mi的选取
- 最坏情况:O(n)
- 平均:每经一次比较,待查找区间宽度由n缩至√n,意味着有效字长logn减半
· 插值查找 = 在字长意义上的折半查找
· 二分查找 = 在字长意义上的顺序查找
有序向量排序
1. 起泡排序
- 复杂度:Ω(nlogn) – Θ(n2)
- 版本:基本版、提前终止版、跳跃版
2. 归并排序(分而治之)
- 思路:序列一分为二O(1)、子序列递归排序 2*T(n/2)、合并有序子序列 O(n)
- 运行成本:O(nlogn)
- 二路归并2-way merge:有序序列,合二为一,保持有序:S[lo,hi) = S[lo,mi) + S[mi,hi)
- 实现
位图/Bitmap
适用于有限整数集,复杂度为O(1)