数据结构知识点汇总

171 阅读3分钟
  1. 队列

    1. 循环队列
      1. 判空:rear == front
      2. 判满:(rear+1) % size == front
    2. 非循环队列
      1. 上溢:rear - front == size
      2. 下溢:front == rear
    1. 判空:top == -1 或 top == 0
    2. 判满:top == size - 1
    3. 卡特兰数 C(n, 2n) / (n+1)
  2. 对称、对角、三角、稀疏矩阵的压缩存储:按行存储

  3. 二叉树

    1. n个结点可构造几种二叉树:(2n)! / n! * (n+1)!
    2. 二叉树度为1、2结点关系:n0 = n2 + 1
    3. 第k层最多2^(k-1)个结点
    4. 满:深度k,结点2^k - 1,叶子结点都在最底层
    5. 完全:与满二叉树编号匹配;只能少最后一层右侧的结点
    6. 完全二叉树,层序:
      1. i的父结点编号:向下取整(i/2);如3的父结点是1
      2. i的左孩子节点编号:2i,右孩子编号:2i+1
      3. 2i > n时无左子结点,即无子节点,即叶子节点
    7. 哈夫曼编码是前缀码,即前缀不能相同
    1. 表示方法
      1. 邻接矩阵
      2. 邻接表:出度
      3. 逆邻接表:入度
    2. 最小生成树
      1. 带权、连通、无向
      2. 最小生成树不唯一,权值加和唯一
      3. 方法:
        1. Prim
          1. 选点V
            1. 时间复杂度O(V^2)
          2. 适合边稠密
          3. 贪心,类似迪杰斯特拉,两个表(+lowCost)
        2. Kruskal
          1. 选边E
          2. 时间复杂度O(Elog2E)
          3. 适合边稀疏
    3. 最短路径
      1. Dijkstra
        1. 单源:某点到其他点的最短距离
        2. 不能有负值
        3. 贪心
        4. 类似Prim,两个表
      2. Floyd
        1. 多源:一次性算出所有点之间最短距离
        2. map[i][j]=min(map[i][j],map[i][k]+map[k][j]),// i到j的最短距离,k为中转点
        3. 动态规划
        4. 代码简单,三层循环
    4. AOV
      1. 求拓扑排序
      2. 活动在点上
    5. AOE
      1. 求关键路径
      2. 活动在边上,边权值表示活动时间
    6. 极小连通子图=生成树,极大连通子图=连通分量
    7. 回路判断:
      1. 判断有向图是否存在回路:
        1. DFS:是否出现后向边
        2. BFS:?
        3. BFS+DFS?
        4. 邻接表?
      2. 判断无向图是否存在回路:
        1. 拓扑排序
        2. DFS:出现后向边=有回路
  4. 排序

    名称适用情况特点
    插入规模小、基本有序大段移动
    选择规模小不稳定(5 8 5 2 9)
    泡排基本有序(带优化的)带优化
    快排规模大、随机挖坑互填
    堆排规模大、随机完全二叉树、特殊的选择排序、升序用大根堆、根结点与最后一个孩子结点交换
    归并总体无序、各子项相对有序求逆序数
    希尔数据量小缩小增量法
    基数"吉祥物"用于整数;按位比较;需要空间多

    总结:4个稳定:插泡归基

image.png

Floyd适合含有负权和回路的带权图,但不适合回路加和为- 时间复杂度与边无关,都是O(n^3)

中缀->后缀:

  1. 数字直接输出
  2. 左括号直接入栈
  3. 右括号:计算符出栈,直到左括号
  4. 计算符入栈前,大的压住小的才能入栈,否则出栈

递归方程求解方法:迭代法、递归树、主方法、代入法——“地主迭代”