软件设计师考试——数据结构与算法基础

考点提要

  1. 数组与矩阵
  2. 线性表
  3. 广义表
  4. 树与二叉树
  5. 排序与查找
  6. 时间复杂度与空间复杂度
  7. 算法基础及常见的算法

一、数组

数组类型 存储地址计算
一维数组a[n] a[i]的存储地址为:a+i*len
二维数组a[m][n] (从0开始) a[i][j]的存储地址(按行存储)为:a + (i*n+j)*len
a[i][j]的存储地址(按列存储)为:a+(j * m+i)*len

二、稀疏矩阵

  1. 上三角矩阵
  2. 下三角矩阵

考试的时候,使用代入的方式进行求解

三、线性表

  1. 顺序表
  2. 链表
    1. 单链表
    2. 循环链表
    3. 双向链表
  3. 链表的基本操作
    1. 单链表删除结点
    2. 单链表插入结点
    3. 双向链表删除结点
    4. 双向链表插入结点
  4. 顺序存储与链式存储对比
    • 空间性能:顺序表的存储比链式表好
    • 时间性能:顺序表的读运算优于链式表;查找、插入、删除,链表性能更好
  5. 队列与栈
    • 队列:先进先出
    • 栈:先进后出
    • 循环队列:队空条件:head = tail;队满条件:(tail + 1) % maxsize = head

四、广义表

  1. 概念:线性表的推广,是由0个或多个单元素子表所组成的有限序列。
  2. 记作:LS = (α1, α2, … , αn)
    α既可以是单个元素,也可以是广义表,分别称为原子和子表。
  3. 深度与长度
    • 深度:广义表展开后所含的括号的最大层数。
    • 长度:广义表中元素的个数。
    • eg:LS1 = (a, (b, c), (d, e)),其长度为3,深度为2.
  4. 基本操作
    • 取表头head(LS)。非空广义表LS的第一个元素称为表头。它可以是一个单元素,也可以是一个子表。
    • 取表尾tail(LS)。在非空广义表中,除表头元素之外由其余元素所构成的表称为表尾。非空广义表的表尾必定是一个表
    • eg:LS1 = (a, (b, c), (d, e)),取出元素b的操作?
      head(head(tail(LS1)))
      解析:tail(LS1) >>> ((b, c), (d, e)); head(tail(LS1)) >>> (b,c); head(head(tail(LS1))) >>> b

五、树与二叉树

  1. 树的基本概念
    在这里插入图片描述

    • 结点的度:结点1:2;结点3: 1
    • 树的度:2(所有结点的度中最大的一个)
    • 叶子结点:4、5、7、8(没有孩子的结点)
    • 分支结点:1、2、3、6(度不为0的结点)
    • 内部结点:2、3、6(除根节点之外的分支结点)
    • 父结点:有孩子的结点
    • 子结点:有爹的结点
    • 兄弟结点:4与5 、7与8、2与3
    • 层次(树的深度(高度)):4
  2. 二叉树的定义与基本性质

    • 识别满二叉树、完全二叉树、非完全二叉树。
      满二叉树:每个结点的度都为2;
      完全二叉树:从左到右没有断裂,也即有右结点必有左结点;
      非完全二叉树:从左到右出现断层。
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
    • 二叉树的重要性质
      • 二叉树第i层上的节点数目最多为2i-1(i ≥ 1)
      • 深度为k的二叉树至多有2k-1个结点(k≥1)
      • 在任意一颗二叉树中,若叶子节点数为n0,度为2的节点数为n2,则n0=n2+1
      • 具有n个节点的完全二叉树的深度为⌊log2n⌋+1
      • 对一颗有n个节点的完全二叉树,对任一节点i有:
        • 若 i > 1, 则其父节点为⌊i/2⌋
        • 若 2i > n,则节点i无左孩子,否则其左孩子为2i
        • 若2i + 1 > n,则节点i无右孩子,否则其右孩子为2i+1
    • 二叉树的遍历
      在这里插入图片描述
      • 前序遍历:1 2 4 5 7 8 3 6(根左右)

      • 中序遍历:4 2 7 8 5 1 3 6(左根右)

      • 后序遍历:4 8 7 5 2 6 3 1(左右根)

      • 层次遍历:1 2 3 4 5 6 7 8(从上到下,从左到右)

      • 中序遍历讲解、后序遍历可以模仿这个来
        在这里插入图片描述

        参考资料:https://blog.csdn.net/qq_33243189/article/details/80222629

    1. 反向构造二叉树
      必须有中序遍历
      eg:前序遍历ABHFDECG、中序遍历HBEDFAGC
      解题步骤
    2. 树转二叉树
      1. 孩子节点——变成左子树节点
      2. 兄弟节点——变成右孩子节点
    3. 查找二叉树(二叉排序树)
      在这里插入图片描述
      1. 基本特性:
        左孩子小于根
        右孩子大于根
      2. 操作:
        1. 插入节点:按照基本特性进行插入
        2. 删除节点:
          1. 删除叶子节点51,直接删除
          2. 删除有一个孩子的节点56,将56删除,将其孩子51放到56原来的位置
          3. 删除有两个孩子的节点89,先在左子树上进行中序遍历寻找到最大的节点56
    4. 最优二叉树(哈夫曼树)
      1. 基本概念
        1. 树的路径长度
        2. 带权路径长度
        3. 树的带权路径长度(树的代价)
      2. 构造哈夫曼树
    5. 线索二叉树:将树型转化为线性,了解即可
    6. 平衡二叉树
      1. 什么是平衡二叉树?
        1. 任意结点左右子树深度相差不超过1
        2. 任意结点左子树深度-右子树深度 = 1 或 0 或 -1

六、图

1.基本概念

  1. 完全图:
    1. 无向图中,若每对定点之间都有一条边相连,则称该图为完全图
      在这里插入图片描述
    2. 有向图中,若每对顶点之间都有二条有向边相互连接,则称该图为完全图。
      在这里插入图片描述

2. 图的存储——邻接矩阵

用一个n阶方阵R来存放图中各节点的关联信息,其矩阵元素Rij定义为
在这里插入图片描述
eg:
在这里插入图片描述

3. 图的存储——邻接表

首先把每个顶点的邻接顶点用链表示出来,然后用一个一维数组来顺序存储上面每个链表的头指针。

4. 图的遍历

在这里插入图片描述

  1. 深度优先遍历:1 2 4 8 5 3 6 7(优先向下,左边优先)
  2. 广度优先遍历:1 2 3 4 5 6 7 8(优先横向,左边优先)
  3. 使用邻接表复原图

5. 拓扑排序(了解就行了)

在这里插入图片描述
我们把用有向边表示活动之间开始的先后关系。即AOV网络

6. 图的最小生成树

在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章