第七章 数据结构

  • 数据结构:线性结构、数组、矩阵和广义表、树和二叉树、图

1.线性结构

  • 线性结构:每个元素最多只有一个出度和入度,表现为一条线状。线性表按存储方式分为顺序表和链表。

  • 存储结构:

    • 顺序存储:用一组地址连续的存储单元依次存储线性表中的数据元素,使得逻辑上相邻的元素物理上也相邻。
    • 链式存储:存储各数据元素的结点的地址并不要求是连续的,数据元素逻辑上相邻,物理上分开。

2.线性表

  • 顺序存储和链式存储对比:
性能类别 具体项目 顺序存储 链式存储
空间性能 存储密度 =1,更优 <1
容量分配 事先确定 动态改变,更优
时间性能 查找运算 O(n/2) O(n/2)
读运算 O(1),更优 O([n+1]/2),最好情况为1,最坏情况为n
插入运算 O(n/2),最好情况为0,最坏情况为n O(1),更优
删除运算 O([n-1]/2) O(1),更优

对于顺序存储和链式存储,进行查找的时间复杂度显然就是O(n/2)。

读运算:顺序存储中,无论元素在哪个位置,直接访问数组下标即可,所以是O(1);链式存储中,如果读取第一个,则为最好情况1,如果读取最后一个,则为最坏情况n,因为要依次访问这些元素的指针域,所以总的为O((n+1)/2)。

插入运算:顺序存储中,假设元素依次为2、5、6、1、9(n=5),那么最好情况是在最后一个元素后面插入一个新元素,此时不需要移动任何元素,为0,最坏情况是在第一个元素前面插入一个新元素,此时需要将2、5、6、1、9全部向后移动一个位置,为5,所以平均下来需要移动(0+5)/2个元素,即为O(0+5)/2=O(n/2);链式存储中,只需要移动插入元素位置的前驱指针和后继指针就可以了,所以为O(1)。

删除运算:顺序存储中,假设元素依次为2、5、6、1、9(n=5),那么最好情况是将最后一个元素删除,此时不需要移动任何元素,为0,最坏情况是将第一个元素删除,此时需要将5、6、1、9全部向前移动一个位置,为4,所以平均下来需要移动(0+4)/2个元素,即为O(0+4)/2=O((n-1)/2);链式存储中,只需要移动删除元素位置的前驱指针和后继指针就可以了,所以为O(1)。

3.栈和队列

  • 队列、栈也是线性结构,结构如下图,队列是先进先出,分队头和队尾;
  • 栈是先进后出,只有栈顶能进出。

  • 循环队列中,头指针指向第一个元素,尾指针指向最后一个元素的下一个位置,因此,当队列空时,head=tail,当队列满时,head=tail,这样就无法区分了,因此,一般将队列少存一个元素,这样,队列满时的条件就变为tail+1=head,而考虑是循环队列,必须除以最大元素数来取余数,即(tail+1)%size=head,如上图右边两个公式。循环队列的长度公式为(Q.tail–Q.head)%size。

例题:

我们再来看上面这道例题,左端可进可出,右端只能进不能出。四个元素依次入队,得不到哪种出队序列???

A选项:e1、e2、e3、e4依次从左端入队,就得到了e4、e3、e2、e1这样的队列,此时依次出队即可得到A选项的结果。

B选项:e1、e2先从左端入队,之后e3从右端入队,最后e4从左端入队,就能得到e4、e2、e1、e3的队列,满足B选项。

C选项:e1、e2先从右端入队,之后e3、e4再从左端入队,就可以得到e4、e3、e1、e2的队列,即符合C选项。

D选项:仔细分析这个队列的入队出队规则,我们发现e1和e2无论如何都是相邻的元素,所以无法得到D选项这样的队列。

4.串

  • 字符串是一种特殊的线性表,其数据元素都为字符。
  • 空串:长度为0的字符串,没有任何字符。
  • 空格串:由一个或多个空格组成的串,空格是空白字符,占一个字符长度。
  • 子串:串中任意长度的连续字符构成的序列称为子串。含有子串的串称为主串,空串是任意串的子串。
  • 串的模式匹配算法:子串的定位操作,用于查找子串在空串中第一次出现的位置的算法。
    • 基本的模式匹配算法:也称为布鲁特–福斯算法,基本思想就是从主串的第1个字符起与模式串的第1个字符比较,若相等,则继续逐个字符进行后续的比较;否则从主串中的第2个字符起与模式串的第1个字符重新比较,直至模式串中每个字符依次和主串中的一个连续的字符序列相等时为止,此时称为匹配成功。
    • KMP算法:对基本模式匹配算法的改进,每当匹配过程中出现相比较的字符不相等时,不需要回溯主串的字符位置指针,而是利用已经得到的“部分匹配”结果将模式串向右“滑动”尽可能远的距离,再继续进行比较。

5.数组

  • 数组是定长线性表在维度上的扩展,即线性表中的元素又是一个线性表。
  • 数组结构的特点:数据元素数目固定,数据元素类型相同,数据元素的下标关系具有上下界的约束且下标有序。
  • 数组数据元素固定,一般不做插入和删除运算,适用于采用顺序结构

对于一维数组来说,a[i]的存储地址计算公式为:a + i×len,a代表起始位置,i代表数组下标,len代表每个元素所占字节数。

假设数组a中每个元素占两个字节,那么对于起始位置为0、元素a[1]来说,它的存储地址为:0 + 1×2=2,因为0和1两个位置被数组的第一个元素a[0]占用。

对于上面这道例题,二维数组中,根据计算公式,元素a[2][3]按行优先存储的存储地址为:a + (2×5+3)×2=a + 26。

6.矩阵

  • 特殊矩阵:矩阵中的元素(或非0元素)的分布有一定的规律。常见的特殊矩阵有对称矩阵、三角矩阵(上三角矩阵和下三角矩阵)和对角矩阵。
  • 稀疏矩阵:在一个矩阵中,若非零元素的个数远远少于零元素个数,且非零元素的分布没有规律。
  • 存储方式为三元组结构,即存储每个非零元素的(行,列,值)

7.广义表

  • 就是线性表的推广,是由0个或多个单元素或字表组成的有限序列。
  • 广义表和线性表的区别:线性表的元素都是结构上不可分的单元素,而广义表的元素既可以单元素,也可以是有结构的表。
  • 广义表一般记为:LS=(a1,a2...an)LS=(a_1,a_2...a_n)LS=(a1​,a2​...an​)

例1:广义表LS1的长度为元素的个数(单个元素算一个元素,子表这个整体算一个元素),所以LS1中,a是一个元素,(b,c)是一个元素,(d,e)是一个元素,即长度为3。深度为所含括号的层数,LS1中最外层有一层括号,内部的(b,c)和(d,e)算同样的一层,所以总层数为2,即深度为2。

例2:要获取LS1中的字母b,则需要的操作为:先取表尾,得到((b,c),(d,e));再取表头,得到(b,c);再取表头即可得到字母b。即操作序列为:Head(Head(Tail(LS1)))。

8.树

  • 树结构是一种非线性结构,树中的每一个数据元素可以有两个或两个以上的直接后继元素,用来描述层次结构关系。

没有入度的结点称为根节点。

9.二叉树

  • 二叉树是n个节点的有限集合,它或者是空树,或者是由一个根节点及两颗互不相交的且分别称为左、右子树的二叉树所组成。与树的区别在于每个根节点最多只有两个孩子结点。
  • 二叉树的重要特性如下:
    1. 二叉树第i层(i≥1)上最多有2i−12^{i-1}2i−1个结点。
    2. 高度为k的二叉树最多有2k−12^k-12k−1个结点(k≥1)
    3. 对于任何一棵二叉树,若其终端结点数为n0n_0n0​,度为2的结点数为n2n_2n2​,则n0=n2+1n_0=n_2+1n0​=n2​+1
    4. 具有n个结点的完全二叉树的深度为[log2n]+1[log_2^n]+1[log2n​]+1。
  • 满二叉树:每层都是满结点的。
  • 完全二叉树:完全二叉树的k–1层是满结点的,第k层结点从左到右是满的,但是左边缺一个即为非完全二叉树。

10.二叉树的存储结构

  1. 二叉树的顺序存储结构:

    • 就是用一组连续的存储单元存储二叉树中的节点,按照从上到下,从左到右的顺序依次存储每个节点。
    • 对于深度为k的完全二叉树,除第k层外,其余每层中节点数都是上一层的两倍。假设有编号为i的节点,则有:
      1. 若i=1,孩结点为根节点,无双亲。
      2. 若i>1,该结点的双亲为(i+1)/2(取整数)。
      3. 若2i≤n2i≤n2i≤n,则该结点的左孩子编号为2i,否则无左孩子。
      4. 若2i+1≤n2i+1≤n2i+1≤n,则该结点的右孩子编号为2i+1,否则无右孩子。
      5. 若iii为奇数且不为1,则该结点左兄弟的编号为i−1i-1i−1,否则无左兄弟。
      6. 若iii为偶数且小于n,则该结点右兄弟的编号为i+1i+1i+1,否则无右兄弟。
  2. 二叉树的链式存储结构:
    • 一般用二叉树链表来存储二叉树节点,二叉链表中除了该节点本身的数据外,还存储有左孩子结点的指针、右孩子结点的指针,即一个数据+两个指针。
    • 每个二叉链表节点存储一个二叉树节点,头指针则指向根节点。

11.二叉树的遍历

  • 一颗非空的二叉树由根节点、左子树、右子树三部分组成。

对于上面的二叉树,我们来求一下它的先序、中序、后序以及层次遍历:

软考笔记——第七章--数据结构相关推荐

  1. Effective C++ 学习笔记 第七章:模板与泛型编程

    第一章见 Effective C++ 学习笔记 第一章:让自己习惯 C++ 第二章见 Effective C++ 学习笔记 第二章:构造.析构.赋值运算 第三章见 Effective C++ 学习笔记 ...

  2. 《Go语言圣经》学习笔记 第七章 接口

    <Go语言圣经>学习笔记 第七章 接口 目录 接口是合约 接口类型 实现接口的条件 flag.Value接口 接口值 sort.Interface接口 http.Handle接口 erro ...

  3. [云数据中心] 《云数据中心网络架构与技术》读书笔记 第七章 构建多数据中心网络(1/3)

    7.1 多数据中心的业务诉求场景 7.1.1 多数据中心的业务场景分析 主流需求:虚拟化和资源池化,形成多活,可就近提供服务 1. 业务跨数据中心部署 2. 两地三中心 是指在同城双活的数据中心基础上 ...

  4. 软考中级【数据库系统工程师】第1章:计算机系统知识,自学软考笔记,备考2022年5月份软考,计算机硬件系统CPU组成指令寄存器组总线输入输出的程序控制方式计算机体系结构与存储系统加密技术流水线技术

    前情提要:笔记只整理与考试相关的重点知识,也就是历年真题出现过的考点我都会记录笔记,一些不重要的内容我就不记录了,大家可以自行查看教材. 1.1计算机硬件基础知识 考点1:计算机硬件系统的组成 考点2 ...

  5. 软考笔记(八)高级系统架构师/分析师:系统架构

    目录 软考官网 报名通道 软考架构师笔记(一):计算机系统基础 软考架构师笔记(二):计算机网络基础与信息安全 软考架构师笔记(三):操作系统基础 软考架构师笔记(四):企业信息化与系统规划 软考架构 ...

  6. 软考笔记(一)高级系统架构师/分析师:计算机系统基础

    目录 软考官网 报名通道 软考架构师笔记(一):计算机系统基础 软考架构师笔记(二):计算机网络基础与信息安全 软考架构师笔记(三):操作系统基础 软考架构师笔记(四):企业信息化与系统规划 软考架构 ...

  7. 系统集成项目管理工程师软考知识点(第一章已完结)

    各章节总体考分分布 章节 上午选择 案例分析 说明 第1章信息化知识 7'左右 没考过 重点看,重点练习,<综合知识>一本通多看 第2章信息系统集成及服务管理 2'左右 很少考 第3章信息 ...

  8. 软考笔记(二)高级系统架构师/分析师:计算机网络基础与信息安全

    目录 软考官网 报名通道 软考架构师笔记(一):计算机系统基础 软考架构师笔记(二):计算机网络基础与信息安全 软考架构师笔记(三):操作系统基础 软考架构师笔记(四):企业信息化与系统规划 软考架构 ...

  9. 软考笔记(五)高级系统架构师/分析师:系统需求工程 需求分析

    目录 软考官网 报名通道 软考架构师笔记(一):计算机系统基础 软考架构师笔记(二):计算机网络基础与信息安全 软考架构师笔记(三):操作系统基础 软考架构师笔记(四):企业信息化与系统规划 软考架构 ...

最新文章

  1. 记录猫眼电影的自定义字体反爬
  2. Java:包的使用Pack
  3. 模板元编程实现素数判定
  4. 浅谈移动Web开发:深入概念
  5. html 按需加载插件,htmlwebpackplugin
  6. php Function split() is deprecated 的解决办法(转)
  7. java安全编码指南之:序列化Serialization
  8. 【已解决】IDEA:Cannot start compiler:the SDK is not specified for module...
  9. 本特利3500_本特利技术控的自我修养之 轴位移探头安装
  10. 关于软考高级作文的几点想法
  11. mac系统如何显示和隐藏文件
  12. 利用python和pygame模块实现飞机大战
  13. \xmemory(102): error C4996: 'std::uninitialized_copy::_Unchecked_iterators::_Deprecate':
  14. 画火柴人动画的手机软件_火柴人动漫制作软件下载-火柴人动漫制作手机中文版 v2.1.4_5577安卓网...
  15. 新手入门:圆角使用方法详解,圆角形成原理以及各个值的意义
  16. php preg_replace()漏洞记录
  17. 《机器学习》 线性模型
  18. 英雄联盟原版下载器+解除wegame自动下载
  19. XTU OJ 1397 Patchouli的金字塔
  20. Java虚拟机如何设置环境变量_如果classpath环境变量没有进行设置,Java虚拟机会自动将其设置为“.”,也就是当前目录。...

热门文章

  1. 85.【Vue-细刷-01】
  2. android+手机运行卡,手机运行卡顿,运行内存太小,在购买的时候就需要注意运行速度...
  3. 数据集:Udacity Self-Driving 目标检测数据集
  4. three.js html5,html5 – 使用Three.js进行纹理喷涂
  5. 松翰烧录器在keil仿真时闪退,解决方法
  6. C++学习(三一七)ASCII码表
  7. 1149:最长单词2
  8. <urlopen error [Errno 104] Connection reset by peer>
  9. CornerNet详解
  10. 在进行原理图编译的时候提示警告:Net has no driving source