算法与数据结构 复习

663 阅读9分钟

数据结构

线性结构 栈与队列 栈 分治与递归 回溯(深度优先搜索)

队列 回溯(广度优先搜索) 动态规划 分支限界

非线性结构 树 图 树是有左右之分的,是没有环的 图是有环的

树有三种遍历方法 先序,中序,后序遍历 是唯一的 搞明白 遍历方法

图或者树的物理实现,一定是通过 数组+链式 形成数据图。二维多维链表

螺旋上升 两者相互影响 算法:

算法

五大算法: 动态规划 递归与分治 回溯 贪心 分支限界

动态规划 递归与分治 问题拆分 状态转移

大问题拆小问题 向上整个 动态规划。相反是递归(栈)

递归: 矩阵连乘

动态规划 递归与分治 相同点都包含最优子结构

而递归使用栈结构动态规划使用队列结构。递归使用自顶向下。动态规划则为从下而上


笔记本中的内容


数据结构

  • 队列假溢出

队列 方法一:移动元素 方法二循环表

树的定义: 互不相交的有限集

子树不相交 每个节点有且仅有一个父节点 n树 有 n-1边

节点的度:节点的子树个数 树的度: 树的所有结点中最大的度数 叶结点(Leaf):度为0的结点 父节点 子节点(孩子节点) 兄弟节点 树的深度: 最大层次

二叉树
  • 有左右之分
  • 最多两颗子树

满二叉树 任何节点或是 叶子节点 或有两颗非空子树

完全二叉树 最多只有最下面的两层结点度数可以小于2 最下一层的结点都集中最左边

性质1. 在二叉树中,第 𝒊 层上最多有 𝟐 𝒊 个结点( 𝒊 ≥ 𝟎) 性质2. 深度为 𝒌 的二叉树总结点至多为 𝟐 𝒌+𝟏 − 𝟏 ( 𝒌 ≥ 𝟎 ),其中深度 (depth)定义为二叉树中层数最大的叶结点的层数 性质3. 一棵二叉树,若其终端结点数为 𝒏𝟎,度为2的结点数为 𝒏𝟐,则 𝒏𝟎 = 𝒏𝟐 + 𝟏 性质4. 满二叉树定理:非空满二叉树树叶数目等于其分支结点数加1 性质5. 满二叉树定理推论:一个非空二叉树的空子树数目等于其结点数加1 性质6. 有 𝒏 > 𝟎 个结点的完全二叉树的高度为 𝒍𝒐𝒈𝟐(𝒏 + 𝟏) (深度为 𝒍𝒐𝒈𝟐(𝒏 + 𝟏) − 𝟏)

二叉树的存储结构

顺序存储结构 链式存储结构(不浪费空间,插入删除方便) 完全二叉树: 从上到下 从左到右存储n个节点

父 i 左 2i 右 2i+1

从1开始计数

遍历方式 *

前序遍历 根左右 中序遍历 左根右 后序遍历 左右根

多对多

完全图

  • 有n个顶点和n(n-1)/2条边的无向图

有向完全图

  • 有n个顶点和n(n-1)条边的有向图

  • 加权图

x的边数 出度 以x为弧尾 入度 以x为弧首

图的存储结构

  • 邻接矩阵 就是矩阵
  • 无向图可以节省一半的空间。从对角线劈开

优点

  • 直观
  • 方便查找
  • 方便计算度
  • 缺点浪费

邻接表

  • 节省空间
  • 方便找邻接点
  • 不方便看

图的遍历 深度优先搜索
广度优先搜索

两者的遍历结果 可能的结果 不可能的结果

算法概述

算法是一种解决问题的方法 输入输出 确定性 有限性

时间复杂度O(N) 空间复杂度

同时一般不带系数,只说明层级

复杂度分析

最坏情况 最好情况 平均情况

复杂度的运算规则

  • O(f)+O(g)=O(max(f,g))
  • O(f)O(g)=O(fg)
  • O(Cf(N))=O(f(N)),其中C是一个正的常数;

Ω的定义: f(N)=Ω (g(N)) 即f(N)的阶不低于g(N)的阶

θ的定义:义f(N)= θ (g(N))当且仅当f(N)=O(g(N))且 f(N)= Ω (g(N))。此时称f(N)与g(N)同阶。

o的定义: 则称函数f(N)当N充分大时的阶比g(N)低,记为f(N)=o(g(N))。

复杂度分析

通常情况下我们不需要精确测量,只需要关注量级

(1)O(1):常量阶,运行时间为常量 (2)O(logn):对数阶,如二分搜索算法 (3)O(n):线性阶,如n个数内找最大值 (4)O(nlogn):对数阶,如快速排序算法 (5)O(n^2):平方阶,如选择排序,冒泡排序 (6)O(n^3):立方阶,如两个n阶矩阵的乘法运算 (7)O(2^n):指数阶,如n个元素集合的所有子集的算法 (8)O(n!):阶乘阶,如n个元素全部排列的算法

只关注最高次幂

冒泡排序

比较相邻的两个元素 如果第一个比第二个大就交换

算法复杂度 O(n),其他情况总是O(n2) 具有稳定性

选择排序

O(n2) 不具有稳定性

插入排序

复杂度为O(n2) 具有稳定性

归并排序

分治法的典型应用 稳定排序 时间复杂度为O(nlogn) 空间复杂度为O(n)

快速排序

速度快 复杂度为nlogn 不稳定

堆排序

计数排序

基数排序

八种排序方法的复杂度 选择排序,冒泡排序,插入排序 O(n2) 快速排序,归并排序 O(nlogn) 希尔排序 堆排序 基数排序 O(n1.3) nlogn d(r+n)

稳定的 冒泡排序 插入排序 归并排序 基数排序

不稳定的 选择排序 快速排序 希尔排序 堆排序

递归与分治

总体思想

  • 将求解的较大规模的问题分割为k个更小规模的子问题
  • 分别求解k个子问题。
  • 分解终止条件: 问题规模足够小,容易求解
  • 合并,自底向上逐步求出原问题的解

分治法 规模较小的相同问题

递归的概念

递归算法 递归函数

递归过程反复使用分治手段

递归的例子

我觉得这一部分代码,可能会考得。伪代码 递归方程边界条件 流程图

  1. 阶乘函数
int func(int n){
    if(n==0){
        return 1
    }
    return n*func(n-1)
}
  1. 斐波那契数列
int func(int n){
    if(n<=1) return 1;
    return func(n-1)+func(n-2)
}

  1. hanoi 塔问题
void hanoi(int n,int a,int b,int c){
    if(n>0){
        hanoi(n-1,a,c,b)
        move(a,c)
        hanoi(n-1,b,a,c)
    }
}

(1).把n-1号盘子移动到缓冲区 (2).把1号从起点移动到终点 (3).把缓冲区n-1个盘子从也移动到终点 递归方程 F(n) = F(n-1)+1+F(n-1)

需要多少步

F(n) = 2的N次方+1 复杂度为O(n2)

递归的实现

入栈 出栈 后进先出 栈的实现 数组形式 链表形式

优点:

  • 结构清晰
  • 容易用数学方法证明

缺点:

  • 效率低
  • 耗费时间空间多

分治法

  • 将规模为n的问题分解为k个小规模的问题。且这些问题相互独立且与原问题相同

最优子结构 时间复杂度

二分搜索

  1. 找出特定元素从已排序的n个元素中
  2. 大整数的乘法
  3. 合并排序

乘法 , 分治法 转换为2为底的阶乘

分治法O(n1.59)

大整数的乘法

有点巧妙 乘法变加法降低复杂度

快速傅里叶变换

合并排序

快速排序

以中间为基准对左右分块 而后合并

最坏的情况 左右不对称分 O(n2) 左右对称分 O(nlogn)

快速排序算法的性能取决于划分的对称性。

动态规划

最优子结构 重叠子问题

矩阵连乘问题

最优子结构性质

计算从初始条件开始 计算复杂度: O(n3) 空间复杂度: O(n2)

最优子结构是动态规划算法求解的前提

最长公共子序列

回头看一下leetCode PPT上写的跟shit一样

01 背包问题

看leetCode 吧 写的跟粑粑一样

贪心

局部最优解

活动安排问题

贪心的基本要素

  • 所求问题的整体最优解
  • 整体最优解可以通过局部最优的选择达到
  • 动态规划自底而上解决
  • 贪心算法自顶向下方式解决

单源最短路径

  • Dijkstra 算法是解单源最短路径问题的贪心算法

最小生成树

最小生成树

回溯法的深度优先策略(DFS)

问题的解空间

  • 解向量: 问题的解可由一个n元向量的形式表示
  • 显约束
  • 隐约束
  • 解空间

深度优先搜索,从根节点出发搜索解空间树。先判断该节点是否包含问题的解。如果不包含,则跳过对该节点子树的搜索,逐层返回其祖先节点回溯

求解问题的所有解时,要回溯到根,且根节点的所有子树都已被搜索过才结束

求解问题的一个解时,只要搜索到问题的一个解就结束

深度优先搜索的复杂度 为 O(n2)

用约束函数在拓展节点处剪去不满足约束的子树 用限界函数剪去得不到最优解的子树

为了避免生成那些不可能产生最佳解的问题状态,要不断 地利用限界函数(bounding function)来处死那些实际上不 可能产生所需解的活结点,以减少问题的计算量。  具有限界函数的深度优先生成法称为回溯法

01背包问题

总结

回溯的三要素(1)解空间(2)约束条件(3)状态树

  • 针对所给问题,定义问题的解空间
  • 确定易于搜索的解空间结构
  • 以深度优先搜索的方式解空间,并在搜索过程中用剪纸函数避免无效搜索

n后问题

图的m着色问题

分支界限法

BFS

name回溯法DFS分支界限法BFS
存储节点的数据结构搜索过程中动态产生问题的解空间队列
节点的存储特性只保存根节点到当前节点的路径每个节点只有一次成为活结点的机会
应用范围

DFS 路径探索 BFS层级探索

剪枝: 导致不可行解或导致非最优解的儿子结点被舍弃

01 背包 旅行售货员问题 单源最短路径