数据结构与算法(上)🌵

线性结构

  1. 顺序存储(顺序表) :

    是指用一组地址连续的存储单元依次存储线性表中的数据元素,从而使得逻辑 上相邻的两个元素在物理位置上也相邻。

    优点:可以随机存取表中的元素,按序号查找元素的速度很快。

    缺点:插入和删除操作需要移动元素。

  2. 链式存储(链表)

    指用节点来存储数据元素,元素的节点地址可以连续,也可以 不连续。节点空间只有在需要时才申请,无需事先分配。

    优点:插入和删除操作不需要移动元素

    缺点:只能按顺序访问元素,不能进行随机存取。

    链表分支:1、单链表 2、循环链表 3、双链表

🎈栈

栈是按“后进先出”的规则进行操作的。

  1. 顺序栈:

    用一组地址连续的存储单元依次存储 自栈顶到栈底的数据元素。 存储空间是预先定义或申请的,因此可能会出现栈满的情况。 每一个元素入栈时都要判断栈是否已满。 需要设置一个头指针指到栈顶。 需要附设指针top指示栈顶元素的位置

  2. 链栈:

    用链表存储栈中的元素。 栈中元素的插入和删除仅在栈顶进行,因此 不必设置头节点,链表的头指针就是栈顶指针。

🎈队列

队列是一种“先进先出”的线性表,队尾入队头出

  1. 顺序存储:
    • 普通顺序队列

    • 循环队列

  2. 链式存储(链队列):

    为了便于操作,可以给链队列添加一个头节点,并令头指针指向头节点。

    队列为空的判定条件就是头指针和尾指针的的值相同,并且均指向头节点

🎈串

字符串是一串文字及符号的简称,是一种特殊的线性表。字符串的基本数据元素是字符,常常把一个串作为一个整体来处理。 串是仅由字符构成的有限序列,是取值范围受限的线性表。

子串:由串中任意长度的连续字符构成的序列称为子串。

串的比较:两个串比较大小时以字符的ASCII码值作为依据。

🎁空串与空格串

空串:长度为0的空串,空串不包含任何字符。

空格串:由一个或多个空格组成的串。

  1. 顺序存储:

    用一组地址连续的存储单元来存储串值的字符序列。

  2. 链式存储:

    字符串可以采用链表作为存储结构,当用链表存储串 中的字符时,每个结点中可以存储一个字符,也可以存储多个字符

     

数组和矩阵

🎈数组

一维数组是长度固定的线性表,数组中的每个数据元素类型相同。n维数组是定长 线性表在维数上的扩张,即线性表中的元素又是一个线性表。 由于数组一般不做插入和删除,且元素个数和元素之间的关系不再发生变动,那么数组适合采用顺序存储结构

🎁数组元素的存储方式及相关计算:

设每个数据元素占用L个单元,m、n为数组的行数和列数

为主序优先存储的地址计算公式为: Loc(aij)=Loc(a11)+((i-1)×n+(j-1))×L

为主序优先存储的地址计算公式为: Loc(aij)=Loc(a11)+((j-1)×m+(i-1))×L

🎈矩阵

我们通常用二维数组来表示矩阵,对多个值相同的元素可以只分配一个存储单元,零元素不分配存储单 元。

  1. 对称矩阵

    矩阵An×n的n2个元素可以压缩存储到可以存放n(n+1)/2个元素的存储空间中

    🎃K= (i(i-1))/2+j-1

    img

  2. 三对角矩阵

    对角矩阵是指矩阵中的非零元素都集中在以主对角线为中心的带状区域中,其余的矩阵元素都为零。

    若以行为主序将n阶三对角矩阵An×n的非零元素存储在一维数组B[k] (0≤k<3n-2)中,则元素位置之间的对应关系为

    🎃k=3×(i-1)-1+j-i+1= 2i+j-3 (1≤i,j≤n)

    img

  3. 稀疏矩阵

    在一个矩阵中,若非零元素的个数远远少于零元素的个数,且非零元 素的分布没有规律,则称之为稀疏矩阵。 可以用一个三元组(i,j,aij)唯一确定矩阵中的一个元素。三元组的存储方式牺牲了随机存储的优点。

     

树是n(n≥0)个结点的有限集合。当n=0时称为空树。在任一非空 树中,有且仅有一个称为根的结点:其余结点可分为m(m≥0)个互不相 交的有限集T1,T2…,Tm,其中每个集合又都是一棵树,并且称为根结点 的子树。

基本概念:

  1. 节点的度:一个节点含有的子树的个数(数节点的子节点数即可);

  2. 树的度:一棵树中,最大的节点的度称为树的度;

  3. 叶节点或终端节点:度为 0 的节点;

  4. 父节点:若一个节点含有子节点,则该节点称为其子节点的父节点;

  5. 子节点:一个节点含有的子树的根节点称为该节点的子节点;

  6. 兄弟节点:具有相同父节点的节点

  7. 节点的层次:从根节点开始定义,根为第 1 层,根的子节点为第 2 层,以此类推;

  8. 树的高度或深度:树种节点的最大层次

  9. 堂兄弟节点:父节点在同一层的节点互为堂兄弟

  10. 节点的祖先:从根到该节点所经分支上的所有点

  11. 子孙:以某节点为根的子树中任一节点都称为该节点的子孙

  12. 森林:由 m(m>0)棵互不相交的树的集合称为森林

二叉树

定义:

二叉树是n(n≥0)个结点的有限集合,它或者是空树(n=0),或者 是由一个根结点及两棵不相交的、分别称为左子树和右子树的二叉树 所组成。

🎁树和二叉树的区别:
  1. 二叉树中结点的子树要区分左子树和右子树, 即使只有一棵子树,而树中不用区分

  2. 二叉树中结点的最大度为

  3. 而树中无限制

二叉树拓展
  • 完全二叉树:对于一课二叉树,假设其深度为d(d>1)。除了第d层外,其它各层的节点数均已达最大值,且第d层所有节点从左向右连续地紧密排列;

  • 平衡二叉树(AVL树):当且仅当任何两棵子树的高度差不大于1的二叉树;

  • 排序二叉树(二叉查找树 Binary Search Tree, 也称二叉搜索树、有序二叉树);

🎈二叉树的性质
  1. 二叉树第i(i≥1)层上至多有2^( i-1)个节点。

  2. 深度为k的二叉树至多有2^ k -1个结点(k≥1)。

  3. 对任何一棵二叉树,若其终端结点数为n0,度为2的结点数为n2,则 n0=n2+1。

满二叉树和完全二叉树
  • 满二叉树:若深度为k的二叉树有2k-1个结点,则称其为满二叉 树。

  • 完全二叉树:当深度为k、有n个结点的二叉树,当且仅当其每一个结 点都与深度为k的满二叉树中编号为1~n的结点一一对应时,称之为 完全二叉树

完全二叉树的性质
  • 设深度为k的完全二叉树共有n个结点,那么可知,除第k层外,其余各层都有最多的结点数。

  • 🎈具有n个结点的完全二叉树的深度为INT(log2n)+1。INT():向下取整

  • 假设有编号为i的结点,则有:

    • 若i=1,则该结点为根结点,无双亲;若i>1,则该结点的双亲 结点为INT(i/2)

    • 若2i≤n,则该结点的左孩子编号为2i,若2i>n,无左孩子。

    • 若2i+1≤n,则该结点的右孩子编号为2i+1,若2i+1>n,无右孩子。

二叉树遍历

🎈CSDN二叉树遍历动画链接

最优二叉树
  • 最优二叉树又称哈夫曼树,是一类带权路径长度最短的树。

  • 权:是一个人为的概念,表示计算机对每个结点的访问频率。

  • 路径长度:是每一个结点到根结点的路径的长度。

  • 结点的带权路径长度:是指从该结点到根结点之间的路径长度与该结 点权的乘积。

  • 树的带权路径长度为树中所有叶子结点的带权路径长度之和

🎁 构造最优二叉树的哈夫曼方法

二叉查找树
  • 二叉查找树又称为二叉排序树。它或者是一棵空树,或者是具有如下 性质的二叉树:

    1. 若它的左子树非空,则左子树上所有结点的关键码值均小于根结 点的关键码值。

    2. 若它的右子树非空,则右子树上所有结点的关键码值均大于根结 点的关键码值。

    3. 左、右子树本身就是两棵二叉查找树。

  • 对二叉查找树进行中序遍历,可得到一个关键码递增有序的结点序列。

  • 二叉查找树的作用:使用二叉查找树来查找树中的数值比普通的二叉树更为方便。

 

一个图G(Graph)是由两个集合:V和E所组成的,V是有限的非空顶点 (Vertex)集合,E是用顶点表示的边(Edge)集合,图G的顶点集和 边集分别记为V(G)和E(G),而将图G记作G=(V,E)。一个顶点集合与连接这些顶点的边的集合可以唯一表示一 个图。 在图中,数据结构中的数据元素用顶点表示,数据元素之间的关系用 边表示。

图的相关概念

  1. 顶点的度:顶点Vi的度(Degree)是指在图中与Vi相关联的边的条数。对于有向图来说,有入度(In-degree)和出度(Out-degree)之分,有向图顶点的度等于该顶点的入度和出度之和。

  2. 邻接:若无向图中的两个顶点V1和V2存在一条边(V1,V2),则称顶点V1和V2邻接(Adjacent);

    若有向图中存在一条边<V3,V2>,则称顶点V3与顶点V2邻接,且是V3邻接到V2或V2邻接直V3;

  3. 路径:在无向图中,若从顶点Vi出发有一组边可到达顶点Vj,则称顶点Vi到顶点Vj的顶点序列为从顶点Vi到顶点Vj的路径(Path)。

  4. 连通:若从Vi到Vj有路径可通,则称顶点Vi和顶点Vj是连通(Connected)的。

  5. 权(Weight):有些图的边或弧具有与它相关的数字,这种与图的边或弧相关的数叫做权(Weight)。

 

  1. 有向图:图中每条边都是有方向的。从顶点vi到顶点vj表示为, 而从顶点vj到顶点vi表示为。有向边也称为弧。起点称为弧尾, 终点称为弧头。

  2. 无向图:图中每条边都是无方向的。顶点vi和vj之间的边用(vi,vj)表 示。在无向图中,(vi,vj)和(vj,vi)表示的是同一条边。

🎁完全图:若一个无向图具有n个顶点,而每一个顶点与其他n-1个顶点 之间都有边,则称之为无向完全图。显然,含有n个顶点的无向完全图 共有n(n-1)/2条边,类似地,有n个顶点的有向完全图中弧的数目为 n(n-1),即任意两个不同顶点之间都存在方向相反的两条弧

图的存储结构

  1. 邻接矩阵表示法

     

     

     

     

     

     

  2. 邻接链表表示法

    邻接链表是为图的每一个顶点建立一个单链表,第i个单链表中的节点 表示依附于顶点vi的表(对于有向图是以vi为尾的弧)

    邻接链表中的表节点有表节点和表头节点两种类型:

     

     

posted @ 2022-05-03 21:26  仙人掌掌掌掌  阅读(58)  评论(0)    收藏  举报