【整理】算法说明书

Hailstone序列

在这里插入图片描述

  1. 程序 ≠ 算法
  2. 对于任意的n,总有 | Hailstone(n) | < 无穷 ?

Turing Machine图灵机

在这里插入图片描述

  • 构成部件:
    1. Tape带:依次均匀地划分为单元格,各存有某一字符,初始均为 ‘#’
    2. Alphabet字符表:字符的种类有限
    3. Head读写头:总是对准某一单元格,并可读取或改写其中字符;每经过一个节拍,可转向左或右侧邻格
    4. State状态:有限状态的一种,每经过一个节拍,可按照规则转向另一种状态
  • 转换函数:
    1. Transition Function: (q, c; d, L/R, p)
    2. 若当前状态为q,且当前字符为c,则将当前字符改为d,转向左/右侧邻格,并转入‘p’状态
    3. 当状态为 ‘ h ’ = halt,则停机

RAM(Random Access Machine)

在这里插入图片描述

  • 寄存器顺序编号,总数没有限制
  • 每一基本操作仅需常熟时间
  • 可通过编号直接访问任意寄存器(call-by-rank)
  • 将算法的运行时间转换为算法需要执行的基本操作次数

2-Subset:NPC

在这里插入图片描述

  1. 定理:| 2S| = 2^| S |^ = 2n
  2. 2-Subset is NP-complete,就目前的计算模型而言,不存在可在多项式时间内回答此问题的算法。

封底估算(Back-Of-Envelope Calculation)

在这里插入图片描述

减而治之Decrease-and-conquer

为求解一个大规模问题,可以将其分解为:其一平凡,另一规模缩减的两个子问题。
在这里插入图片描述

分而治之Divide-and-conquer

为求解一个大规模问题,可以将其分解为若干个(通常为两个)子问题,规模大体相当。
在这里插入图片描述

大师定理/主定理/Master Theorem在这里插入图片描述

fibonacci数

  1. 递归版fibonacci数低效根源:各递归实例均被大量重复地调用
    在这里插入图片描述
  2. 迭代
    · memoization(制表备查)
    · 颠倒计算方法:自底向上递归
    在这里插入图片描述

LCS(Longest Common Sbusequence)最长公共子序列

  • 方法1(递归):最好O(n+m); 最差O(2n)
    1. 递归基:若n=-1或m=-1,则取做空序列
    2. 减而治之:若A[n] = ‘X’ = B[m],则LCS(n-1, m-1)+‘X’
    3. 分而治之:A[n] ≠ B[m],则LCS(n, m-1)与LCS(n-1, m)中取更长者
      在这里插入图片描述
  • 方法2(动态规划—迭代):O(n*m)
    在这里插入图片描述
  • 单调性:每经过一次比对,至少一个序列的长度缩短一个单位

可扩容向量

  1. 容量加倍策略
    在这里插入图片描述
  2. 容量递增策略
    T*oldElem = _elem; _elem = New T[_capacity += INCREMENT]
  3. 对比
    在这里插入图片描述

有序向量唯一化

  1. 低效版O(n2):在有序向量中,重复的元素必然相互紧邻构成一个区间,每一个区间只需保留单个元素即可。低效根源:同一元素可作为被删除元素的后继多次前移
  2. 高效版O(n):将同一元素作为一个区间,不同元素覆盖在其第一个元素后

有序向量查找

1. 二分查找A

  1. 复杂度:线性递归 T(n) = T(n/2) + O(1) = O(nlogn)
  2. 递归跟踪:轴点总能取到中点,递归深度O(nlogn),各递归实例仅耗时O(1)
  3. 成功、失败时的平均查找长度均为O(1.5logn)以任一元素
  4. S[mi] 为界都可将待查找区间 [lo,hi) 分为三部分,且 S[lo,hi) <= S[mi] <= S(mi,hi),因此只需任取x = S[mi]
    在这里插入图片描述

2. 二分查找B

  1. 将左右分支转向代价不平衡的问题,用划分2个分支方向解决
  2. mi取作中点:e < x,则深入左侧的[lo,mi);x <= e,则深入右侧的[mi,hi)
  3. 相对于版本A,最好(怀)情况更坏(好),整体性能更稳定
    在这里插入图片描述

3. 二分查找C

  • 在算法执行过程中的任意时刻
    1. A[lo-1]:总是(截止当前已确认的)不大于e的最大者(m)
    2. A[hi]:总是(截止当前已确认的)大于e的最小者(M)
  • 当算法终止时,A[lo-1] = A[hi-1]即是(全局)不大于e的最大者
  • 代码实现
    在这里插入图片描述

4. Fib查找

通过递归深度的不均衡对转向成本的不均衡做补偿,平均查找长度应能进一步缩短
在这里插入图片描述

5. 插值查找

  1. 适用情况:已知有序向量中各元素随机分布的规律(eg.独立且均匀的随机分布)
  2. 轴点mi的选取
    在这里插入图片描述
  3. 最坏情况:O(n)
  4. 平均:每经一次比较,待查找区间宽度由n缩至√n,意味着有效字长logn减半
    · 插值查找 = 在字长意义上的折半查找
    · 二分查找 = 在字长意义上的顺序查找

有序向量排序

1. 起泡排序

  1. 复杂度:Ω(nlogn) – Θ(n2)
  2. 版本:基本版、提前终止版、跳跃版
    在这里插入图片描述

2. 归并排序(分而治之)

  1. 思路:序列一分为二O(1)、子序列递归排序 2*T(n/2)、合并有序子序列 O(n)
  2. 运行成本:O(nlogn)
  3. 二路归并2-way merge:有序序列,合二为一,保持有序:S[lo,hi) = S[lo,mi) + S[mi,hi)
    在这里插入图片描述
  4. 实现
    在这里插入图片描述

位图/Bitmap

适用于有限整数集,复杂度为O(1)
在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

啊有礼貌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值