软考《软件设计师》第九章:数据结构与算法

第九章:数据结构与算法

考点1:矩阵

  1. 数组

    在这里插入图片描述

  2. 矩阵:计算时采用带点排除法,注意一维数组的起始位置

    在这里插入图片描述

考点2:表

  1. 线性表

    1. 顺序表:顺序存储,即用一组地址连续的存储单元依次存储线性表中的数据元素

    2. 链表:链式存储,即通过指针链接起来的结点来存储数据元素

      1. 单链表:每个结点中除包含数据域外,只设置一个指针域用以指向其直接后继结点

        在这里插入图片描述

      2. 双链表:每个结点中除包含数值域外,设置两个指针域,分别用以指向直接前驱结点和直接后继结点

        在这里插入图片描述

      3. 循环链表:头结点的指针域指向尾结点的指针域

        在这里插入图片描述

        在这里插入图片描述

    3. 队列(先进先出)和栈(先进后出)

      1. 循环队列
        1. 队空条件:head=tail;
        2. 队满条件:(tail+1)%size=head
      2. 解题技巧
        1. 按照一定顺序输入栈,那么出栈的可能有很多,因为进去的同时就立马出去
        2. 队列和栈结合时,将选项带入,使用两者的规则进行选择
  2. 广义表

    1. 广义表是n个表元素组成的有限序列,是线性表的推广,LS=(a0, a1,…, an)。
    2. 长度(最外层表(LS)含有多少个元素),深度(包含括号的重数)
    3. 取表头head(Ls)(最外层表的第一个元素),取表尾tail(Ls)(除了最外层表中第一个元素之外的其他所有元素)

考点3:树

  1. 树与二叉树的特性
    1. 树的概念
      1. 孩子(结点的子树的根称为该结点的孩子)、双亲(该结点称为其子结点的双亲)、和兄弟(具有相同双亲的结点互为兄弟)
      2. 结点的度:一个结点的子树的个数
      3. 叶子节点(终端结点):指度为0的结点
      4. 内部结点(分支节点):指度不为0的结点
      5. 结点的层次:若某节点在第i层,则其孩子结点在第i+1层
      6. 树的深度:一颗树的最大层次数
    2. 二叉树的特性
      1. 在二叉树的第i层上最多有2i-1个结点(i≥1);
      2. 深度为k的二叉树最多有2k -1个结点(k≥1);
      3. 对任何一棵二叉树,如果其叶子结点数为n0,度为2的结点数为n2,则n0=n2+1。
      4. 如果对一棵有n个结点的完全二叉树的结点按层序编号(从第1层到 L log2n ˩+1层,每层从左到右),则对任一结点i(1≤i≤n),有:
        1. 如果i=1,则结点i无父结点,是二叉树的根;如果i>1,则父结点是L i/2 ˩ ;
        2. 如果2i>n,则结点i为叶子结点,无左子结点;否则,其左子结点是结点2i;
        3. 如果2i+1>n,则结点i无右子叶点,否则,其右子结点是结点2i+1。
  2. 特殊的二叉树
    1. 二叉树:二叉树是每个结点最多有两个孩子的有序数,可以为空树,可以只有一个结点。
    2. 满二叉树:任何结点恰有两棵非空子树
    3. 完全二叉树:最多可以有两个叶子结点,并且都在左边
    4. 平衡二叉树:树中任一结点的左右子树高度之差不超过1
    5. 排序二叉树:任一结点的权值,大于其左孩子结点,小于其右孩子结点。
    6. 线索二叉树:在每个结点中增加两个指针域来存放遍历时得到的前驱和后继信息。
    7. 最优二叉树:又称为哈弗曼树,它是一类带权路径长度最短的树。
      1. 路径长度:从树根到每一个叶子结点的通路数目之和。
      2. 结点的带权路径长度:路径长度与该结点权值的乘积。
      3. 树的带权路径长度:树中所有叶子结点的带权路径长度之和。
      4. 哈弗曼树的构造
        1. 根据给定的权值集合,找出最小的两个权值,构造一棵子树最为其孩子结点,二者权值之和作为根结点
        2. 在原集合中删除这两个结点的权值,并引入根节点的权值
        3. 重复步骤(1)和步骤(2),直到原权值集合为空
  3. 树的遍历
    1. 先序遍历:按根à左à右的顺序进行遍历
    2. 后序遍历:按左à右à根的顺序进行遍历
    3. 中序遍历:按左à根à右的顺序进行遍历
    4. 层次遍历:按层次顺序进行遍历

考点4:图

  1. 完全图

    1. 在无向图中,若每对顶点之间都有一条边相连,则称该图为完全图
    2. 在有向图中,若每对顶点之间都有二条有向边相互连接,则称该图为完全图
  2. 图的存储

    1. 邻接矩阵:具有对称性,存储时可以只存出其中一个三角

      在这里插入图片描述

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

    在这里插入图片描述

    1. 图的遍历

      在这里插入图片描述

    2. 图的拓扑排序:在AOV网点中从顶点Vi到Vj用有向边表示活动开始的顺序

    3. 最小生成树

      1. 选择入度为0的顶点作为起点
      2. 选择顶点之间最短(代价最小)路径的几条边,不能形成环路

考点5:算法基础及常见算法

  1. 算法的特性
    1. 有穷性:执行有穷步之后结束
    2. 确定性:算法中每一条指令都必须有确切的含义,不能含糊不清
    3. 输入(>=0),输出(>=1)
    4. 有效性(可行性):算法的每个步骤都能有效执行并能得到确定的结果。例如a=0,b/a就无效
  2. 分治法
    1. 特征:把一个大问题拆分成多个小规模的相同子问题,一般可用递归解决。
    2. 经典问题:斐波那契数列、归并排序、快速排序、矩阵乘法、二分搜索、大整数乘法、汉诺塔
  3. 动态规划法(用于求最优解)
    1. 特征:划分子问题(最优子结构),并把子问题结果使用数组存储,利用查询子问题结果构造最终问题结果
    2. 经典问题:斐波那契数列、矩阵乘法、背包问题、 LCS最长公共子序列
  4. 回溯法(通用的解题法)
    1. 特征:包含问题的所有解的树中,按照深度优先的策略,从根节点出发搜索树。系统的搜索一个问题的所有解或任一解
    2. 经典问题:N皇后问题、迷宫、背包问题
  5. 贪心法(用于求满意解)
    1. 特征:局部最优,但整体不见得最优。每步有明确的,既定的策略
    2. 经典问题:背包问题(如装箱)、多机调度、找零钱问题

考点6:时间复杂度与空间复杂度(★★★★★)

  1. 时间复杂度:程序运行从开始到结束所需要的时间

    1. 常见时间复杂度排序:O(1)<O(log2n)<O(n)<O(nlog2n)<O(n2)<O(n3)<O(2n)

      1. O(1):单个语句,无循环
      2. O(n)~O(n3):单层循环、双层嵌套循环、三层嵌套循环
      3. O(log2n):树形结构、二分法、构建堆过程
      4. O(nlog2n):堆排序、归并排序
      5. O(2n):所有不同可能的排列组合
    2. 主定理求固定形式递归式的时间复杂度

      在这里插入图片描述

  2. 空间复杂度:算法在运行过程中临时占用存储空间大小

考点7:排序和查找

  1. 查找

    1. 顺序查找:将待查找的关键字依次与表中元素进行比较,时间复杂度为O(n)

    2. 二分法查找:比较次数最多为log2n +1 ,时间复杂度为 O(log2n),

      1. 确定中点位置:mid=(low+high)/2

      2. 将待查的值K与R[mid].key比较

      3. 若R[mid].key>k,新的查找区间是左子表,其中high=mid–1。

      4. 若R[mid].key< k,新的查找区间是右子表,其中low=mid+1。

      5. 若R[mid].key=k,则查找成功,算法结束。

      6. 例题:请给出在含有12个元素的有序表{1,4,10,16,17,18,23,29,33,40,50,51}中二分查找关键字17的过程。

        在这里插入图片描述

    3. 散列表查找:已知关键字集合U,最大关键字为m,根据函数Hash的值存储到对应的空间

      1. 开放定址法:按照某种探测方法,逐个查找此地址中是否存储了数据元素,如果没有,将关键字存入,否则,继续查找下一个地址

        1. 线性探测法:将关键字存储在下一个没有被占的位置
        2. 伪随机数法:随机的将关键字存储在没有被占的位置
      2. 例题:记录关键码为(3,8,12,17,9),取m=10(存储空间为10),p=5,散列函数h=key%p

        在这里插入图片描述

  2. 排序

    在这里插入图片描述

    1. 直接插入排序

      1. 排序规则:第i个记录Ri依次与Ri-1,…,R2,R1进行比较,找到合适的位置插入
      2. 特点:效率低
    2. 希尔排序

      1. 排序规则

        1. 取一个小于n的整数d1将记录分成d1个组,距离为d1的倍数的记录放在同一个组中,各组内进行直接插入排序
        2. 取第二个增量d2<d1重复1步骤,直至所取的增量dt=1,将最后得到的组进行直接插入排序即可
      2. 特点:效率高

        在这里插入图片描述

    3. 直接选择排序

      1. 排序规则

      2. 在所有记录中选出排序码最小的记录,把它与第1个记录交换

      3. 在其余的记录内选出排序码最小的记录,与第2个记录交换……依次类推,直到所有记录排完为止

        在这里插入图片描述

    4. 堆排序

      1. 堆的定义:设有n个元素的序列{K1,K2,…,Kn}
        1. 若Ki ≤ K2i 且 Ki ≤ K2i +1,称为小顶堆
        2. 若Ki ≥ K2i 且 Ki ≥ K2i +1,称为大顶堆
      2. 排序规则:先将序列建立堆,然后输出堆顶元素,再将剩下的序列建立堆,然后再输出堆顶元素,依此类推,直到所有元素均输出为止
        1. 将顺序表R[1…n]中元素建立为一个堆,堆顶位于R[1],待序区为R[1…n]
        2. 循环执行步骤3~步骤4,共n-1次
        3. 假设为第i 运行,则待序区为R[1…n-i+1],将堆顶元素R[1]与待序区尾元素R[n-i+1]交换,此时顶点元素被输出,新的待序区为R[1…n-i ]
        4. 待序区对应的堆已经被破坏,将之重新调整为大顶堆
    5. 冒泡排序

      1. 排序规则:通过相邻元素之间的比较和交换,将排序码较小的元素逐渐从底部移向顶部

        在这里插入图片描述

    6. 快速排序

      1. 排序规则:将原问题分解成若干个规模更小但结构与原问题相似的子问题。通过递归地解决这些子问题,然后再将这些子问题的解组合成原问题的解

        1. 在待排序的n个记录中任取一个记录作为基准
        2. 使用基准和最后一个元素作比较
        3. 然后用第二个元素和基准作比较,依次类推,最后基准在中间

        在这里插入图片描述

    7. 归并排序

      1. 排序规则

        1. 将两个或两个以上的有序子表合并
        2. 比较A[i]和A[j]的排序码大小,若A[i]的排序码小于等于A[j]的排序码,则将第一个有序表中的元素A[i]复制到R[k]中,并令i和k分别加1
        3. 如此循环下去,直到其中一个有序表比较和复制完,然后再将另一个有序表的剩余元素复制到R中

        在这里插入图片描述

    8. 基数排序

      1. 排序规则:基数的选择和关键字的分解是根据关键字的类型来决定的,例如关键字是十进制数,则按个位、十位来分解

      在这里插入图片描述

视频来源 软件设计师

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

流年师兄要努力りゅう

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

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

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

打赏作者

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

抵扣说明:

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

余额充值