数据结构与算法(续上)

二元组可用图形表示:中间标有元素值的方框表示数据元素,称为借点。用有向线段从前件到后件。

基本概念含义
根节点数据结构中,没有前件的节点
终端节点(叶子节点)数据结构中,没有后件的节点
内部节点数据结构中,除了根节点和终端节点以外的节点

线性结构与非线性结构

线性表及其顺序存储结构

基本概念含义
线性结构一个非空的数据结构如果满足以下两条件:1. 有且只有一个根节点 2. 每个节点最多有一个前件和最多一个后件
非线性结构不满足以上两个条件的数据结构,主要是树形和网型结构

空数据结构:没有数据元素把只有一个数据元素的数据结构中的元素删除,就可以得到

线性表的基本概念

n个数据元素构成的有限序列

表中除第一个元素每个元素有且只有一个前件

除最后一个元素外每个元素有且只有一个后件

同一线性表中的数据元素必定具有相同的特性,即属同一数据对象。数组、矩阵、向量等都是线性表

非空线性表结构特征:

  • 只有一个根节点,即节点a1,它无前件;
  • 有且只有一个终端节点,即节点an,它无后件;
  • 除根结点与终端节点外,其他所有节点有且只有一个前件,也有且只有一个后件。
节点个数n称为线性表长度,当n=0时,成为空表

线性表的顺序存储结构

基本特征:

  • 线性表中所有元素所占存储空间是连续的;
  • 线性表中各数据元素在存储空间中是按逻辑顺序依次存放的。

线性表中各数据元素在存储空间中是紧邻的,且前件元素一定存储在后件元素前面。

栈和队列

栈及其基本运算

一种特殊的线性表,它所有的插入和删除都限定在同一段进行,允许插入和删除的一端称为栈顶,不允许的另一端称为栈底。栈中没有元素称为空栈。

修改原则:后进先出或先进后出

指针top——栈顶;指针bottom——栈底 top反映栈的状态不断发生变化

基本运算:

  • 入栈
  • 退栈
  • 读栈顶元素
通常采用顺序方式和链接方式实现栈

队列及其基本运算

(1). 队列定义

允许在一端进行插入,而在另一端进行删除的线性表

允许进行删除的一端称为对头(或排头)

允许进行插入的一端称为队尾

对列:Q=(q1,q2,…,qn)

q1为队头元素(排头元素)

qn为队尾元素

其退栈原则与栈相反:先进先出或先进后出

(2). 队列运算

队头指针——front; 队尾指针——rear 队头指针front总指向队头元素的前一位置,rear和front共同反映队列中元素动态变化情况

(3). 循环队列及其运算

将队列存储空间的最后一个位置绕到第一个位置,形成逻辑上的环状空间,供队列循环使用。

增加标志s区分队空和队满:s=0为空;
					 s=1且front=rear为满

线性链表

线性链表的基本概念

(1). 线性链表

线性表的链式存储结构,简称链表。

每一个节点只有一个指针域,又称为单链表。

在线性链表中,第一个元素没有前件,指向链表中的第一个节点的指针称为头指针(HEAD),最后一个元素没有后件,最后一个节点的指针域为空,用NULL或0表示。

空表:HEAD = NULL 或 0

对线性链表中每个节点设置两个指针

左指针(Llink):一个指针域存放前件地址

右指针(Rlink):一个指针域存放后件地址

(2). 带链的栈

栈也可采用链式存储结构表示,把栈组织成一个单链表。

(3). 带链的队列

队列也可采用链式存储表示,队列中每个元素与栈中节点对应。

(4). 顺序表与链表的比较

类型优点缺点
顺序表1.可以随机存储表中的任意节点 2.无须为表示节点间的逻辑关系额外增加存储空间1.顺序表的插入和删除运算效率很低 2.顺序表的存储空间不便于扩充 3.顺序表不便于对存储空间的动态分配
链表1.在进行插入和删除时,只需要改变指针即可,不需要移动元素 2.存储空间易于扩充并且方便空间的动态分配需要额外空间(指针域)来表示数据元素间的逻辑关系,存储密度比顺序表低

循环链表

在单链表第一个节点钱增加一个表头节点,队头节点指针指向表头结点,最后一个节点的指针域的值由NULL改为指向表头节点

循环链表中,所有节点的指针构成一个环状链

表头节点是循环表中固有的节点,表中没有数据元素的情况下,表中至少有一个节点存在,从而统一空表与非空表的运算

树与二叉树

树的基本概念

树是一种简单的非线性结构

基本概念含义
父节点 (根)在树结构中,每一个节点只有一个前件,称为该节点的父节点;没有前件的节点只有一个,称为树的根节点(根)
节点和叶子节点在树的结构中,每一个节点可以有多个后件,称为该节点的子节点。没有后件的节点称为叶子节点
在树的结构中,一个节点所拥有的后件个数称为该节点的度,树的度为所有节点中最大的
深度定义一棵树的根节点所在层次为1,其他节点所在层次等于它的父节点所在层次加1。树的最大层次称为树的深度
子树在树中,以某节点的一个子节点为根构成的树称为该节点的一棵子树

在树中,树中的节点数等于树中所有节点的度数之和加1

二叉树及其基本性质

(1). 二叉树定义

特点:

  • 二叉树可以为空,空二叉树无节点,非空有且只有一个根节点;
  • 每个节点最多有两棵子树,即二叉树不存在度大于2的节点;
  • 二叉树的子树有左右之分,其次序不能任意颠倒。

(2). 二叉树性质

性质1:在二叉树第K层上,最多有2k-1(k>=1)个节点。

性质2:深度为m的二叉树中,最多有2m-1个节点。

性质3:对任何一棵二叉树,度为0的节点(即叶子节点)总是比度为2的节点多一个。

性质4:具有n个节点的二叉树,其深度至少为[log2n]+1,其中[log2n]表示其整数部分。

(3).满二叉树和完全二叉树

满二叉树:除最后一层外,每一层上所有节点都有两个子节点的二叉树

即满二叉树在其第k层上有2k-1个节点,且深度为m的满二叉树共有2m-1个节点

完全二叉树:除最后一层外,每一层上的节点数均达到最大值,在最后一层上只缺少右边的若干节点的二叉树

有完全二叉树知,满二叉树一定是完全二叉树,完全二叉树一般不是满二叉树

完全二叉树特点:

  • 叶子节点只可能在最后两层出现;
  • 对任一节点,若其右子树的深度为m,则该结点左子树的深度为m或为m+1。

性质5:具有n个节点的完全二叉树的深度为[log2n]+1。

二叉树的存储结构

二叉树通常采用链式存储结构。存储节点由数据域和指针域构成。(二叉树表)

由于每个元素可有两个后件,所以存储结点的指针域有两个:一个用于指向该节点的左子节点,即左指针域;另一个用于指向该节点的右子节点,即右指针域。

对于满二叉树和完全二叉树可按层次进行顺序存储。

二叉树的遍历

不重复地访问二叉树中的所有节点

二叉树的遍历:

  • 前序遍历(DLR)
  • 中序遍历(LDR)
  • 后序遍历(LRD)

(1). 前序遍历

首先访问根节点,然后遍历左子树,最后遍历右子树;并且在遍历左、右子树时,仍然先访问根节点,然后遍历左子树,最后遍历右子树

(2). 中序遍历

首先遍历左子树,然后访问根节点,最后遍历右子树;并且在遍历左、右子树时,仍然先遍历左子树,然后访问根节点,最后遍历右子树

(3). 后序遍历

首先遍历左子树,然后遍历右子树,最后访问根节点;并且在遍历左、右子树时,仍然先遍历左子树,然后遍历右子树,最后访问根节点

若已知二叉树前、中中、后 可唯一确定二叉树,已知前、后不能唯一确定。

查找技术

顺序查找

逐个查找,若相等,查找成功;若扫描完,未找到相等元素,则查找失败。

  • 最好情况,第一元素就是查找元素,则比较次数为1次。
  • 最坏情况,最后一元素才是查找元素或没有查找元素,则比较次数为n次。
  • 平均情况,大约需要比较n/2次。

顺序查找唯一选择的两种情况:

(1). 线性表为无序表(即表中的元素是无序的),则不管是顺序存储结构还是链式存储结构,都只能顺序查找。

(2). 即使线性表是有序的,如果采用链式存储结构,也只能顺序查找。

二分法查找

条件:

  • 用顺序存储结构

  • 线性表是有序表

对于一个长度为n的有序线性表,将中间值设为M,利用二分法查找元素X过程如下:
将X与M相比较:
(1).若X=M,则查找成功,结束查找;
(2).若X<M,则在线性表的前半部分以二分法继续查找;
(3).若X>M,则在线性表的后半部分以二分法继续查找。

顺序查找每一次比较,只将查找范围减1,

而二分法每一次比较,可将范围减少为原来的一半,效率大大提高。最坏情况,只需比较log2n次。

排序技术

交换类排序法

借助数据元素的“交换”来进行排序的一种方法

(1). 冒泡排序法

两两相邻数据元素之间比较和交换,不断消去***逆序***,直到所有数据元素有序为止

最坏情况,对于长度为n的线性表排序,需要比较次数为log2n次。

(2). 快速排序

待排序的n个元素中取一元素K(通常为第一个元素),以K为分割标准,把所有小于K的移至其前面,把所有大于K的移至其后面,这样,以K为分割线,分割为两个子表,称为一趟 排序。将两子表重复上述步骤,直至子表长度为1,此时,线性表已排好序了。

最坏情况,需进行n(n-1)/2次比较, 实际排序效率要比冒泡排序高得多

插入类排序法

每次将一待排元素,按其元素值大小插入到前面已排好序的子表中的适当位置,直至全部元素插入完成为止

(1). 简单插入元素

把n个待排序的元素看成是一个无序表和一个有序表,开始时,有序表只包含一个元素,而无序表包含另外n-1个元素,每次取无序表中的第一个元素插入到有序表中的正确位置,使其成为增加一个元素的新有序表。插入元素时,插入位置及其后的记录依次向后移动。最后有序表的长度为n,而无序表的长度为空,此时排序完成。

最坏情况,需要n(n-1)/2次比较

(2). 希尔排序

先取一整数(称为增量)d1<n,把全部数据元素分为d1组,所有距离为d1倍数的元素放在一组中,组成一个子序列,对每个子序列分别进行简单插入排序。然后取d2<d1重复上述分组和排序工作,直到di=1,即所有记录在一组中为止。

其排序效率与所选增量序列有关,最坏情况,需要比较nr(1<r<2)

选择类排序法

通过每一趟从待排序序列选出值最小元素,顺序放在已排好序的有序子表后面,直到全部序列满足排序要求为止

(1). 简单选择排序

先选出最小元素a,将a与第一个元素交换,在从剩下的n-1个元素中选出最小元素b与第二个元素交换·····重复直到所有元素有序为止

最坏情况,需要比较n(n-1)/2次

(2). 堆排序法

若有n个元素的序列(h1,h2,···,hn),将元素按顺序组成一棵完全二叉树,当且仅当满足下列条件时称为堆。

hi>=h2i and hi>=h2i+1

或者

hi<=h2i and hi<=h2i+1

其中,i=1,2,3···,n-2。

第一种情况称为大根堆,所有结点的值大于或等于左右子节点的值。

第二种情况称为小根堆,所有节点的值小于或等于左右子节点的值。

最坏情况,需要nlog2n此比较

二元组可用图形表示:中间标有元素值的方框表示数据元素,称为借点。用有向线段从前件到后件。

基本概念含义
根节点数据结构中,没有前件的节点
终端节点(叶子节点)数据结构中,没有后件的节点
内部节点数据结构中,除了根节点和终端节点以外的节点

线性结构与非线性结构

线性表及其顺序存储结构

基本概念含义
线性结构一个非空的数据结构如果满足以下两条件:1. 有且只有一个根节点 2. 每个节点最多有一个前件和最多一个后件
非线性结构不满足以上两个条件的数据结构,主要是树形和网型结构

空数据结构:没有数据元素把只有一个数据元素的数据结构中的元素删除,就可以得到

线性表的基本概念

n个数据元素构成的有限序列

表中除第一个元素每个元素有且只有一个前件

除最后一个元素外每个元素有且只有一个后件

同一线性表中的数据元素必定具有相同的特性,即属同一数据对象。数组、矩阵、向量等都是线性表

非空线性表结构特征:

  • 只有一个根节点,即节点a1,它无前件;
  • 有且只有一个终端节点,即节点an,它无后件;
  • 除根结点与终端节点外,其他所有节点有且只有一个前件,也有且只有一个后件。
节点个数n称为线性表长度,当n=0时,成为空表

线性表的顺序存储结构

基本特征:

  • 线性表中所有元素所占存储空间是连续的;
  • 线性表中各数据元素在存储空间中是按逻辑顺序依次存放的。

线性表中各数据元素在存储空间中是紧邻的,且前件元素一定存储在后件元素前面。

栈和队列

栈及其基本运算

一种特殊的线性表,它所有的插入和删除都限定在同一段进行,允许插入和删除的一端称为栈顶,不允许的另一端称为栈底。栈中没有元素称为空栈。

修改原则:后进先出或先进后出

指针top——栈顶;指针bottom——栈底 top反映栈的状态不断发生变化

基本运算:

  • 入栈
  • 退栈
  • 读栈顶元素
通常采用顺序方式和链接方式实现栈

队列及其基本运算

(1). 队列定义

允许在一端进行插入,而在另一端进行删除的线性表

允许进行删除的一端称为对头(或排头)

允许进行插入的一端称为队尾

对列:Q=(q1,q2,…,qn)

q1为队头元素(排头元素)

qn为队尾元素

其退栈原则与栈相反:先进先出或先进后出

(2). 队列运算

队头指针——front; 队尾指针——rear 队头指针front总指向队头元素的前一位置,rear和front共同反映队列中元素动态变化情况

(3). 循环队列及其运算

将队列存储空间的最后一个位置绕到第一个位置,形成逻辑上的环状空间,供队列循环使用。

增加标志s区分队空和队满:s=0为空;
					 s=1且front=rear为满

线性链表

线性链表的基本概念

(1). 线性链表

线性表的链式存储结构,简称链表。

每一个节点只有一个指针域,又称为单链表。

在线性链表中,第一个元素没有前件,指向链表中的第一个节点的指针称为头指针(HEAD),最后一个元素没有后件,最后一个节点的指针域为空,用NULL或0表示。

空表:HEAD = NULL 或 0

对线性链表中每个节点设置两个指针

左指针(Llink):一个指针域存放前件地址

右指针(Rlink):一个指针域存放后件地址

(2). 带链的栈

栈也可采用链式存储结构表示,把栈组织成一个单链表。

(3). 带链的队列

队列也可采用链式存储表示,队列中每个元素与栈中节点对应。

(4). 顺序表与链表的比较

类型优点缺点
顺序表1.可以随机存储表中的任意节点 2.无须为表示节点间的逻辑关系额外增加存储空间1.顺序表的插入和删除运算效率很低 2.顺序表的存储空间不便于扩充 3.顺序表不便于对存储空间的动态分配
链表1.在进行插入和删除时,只需要改变指针即可,不需要移动元素 2.存储空间易于扩充并且方便空间的动态分配需要额外空间(指针域)来表示数据元素间的逻辑关系,存储密度比顺序表低

循环链表

在单链表第一个节点钱增加一个表头节点,队头节点指针指向表头结点,最后一个节点的指针域的值由NULL改为指向表头节点

循环链表中,所有节点的指针构成一个环状链

表头节点是循环表中固有的节点,表中没有数据元素的情况下,表中至少有一个节点存在,从而统一空表与非空表的运算

树与二叉树

树的基本概念

树是一种简单的非线性结构

基本概念含义
父节点 (根)在树结构中,每一个节点只有一个前件,称为该节点的父节点;没有前件的节点只有一个,称为树的根节点(根)
节点和叶子节点在树的结构中,每一个节点可以有多个后件,称为该节点的子节点。没有后件的节点称为叶子节点
在树的结构中,一个节点所拥有的后件个数称为该节点的度,树的度为所有节点中最大的
深度定义一棵树的根节点所在层次为1,其他节点所在层次等于它的父节点所在层次加1。树的最大层次称为树的深度
子树在树中,以某节点的一个子节点为根构成的树称为该节点的一棵子树

在树中,树中的节点数等于树中所有节点的度数之和加1

二叉树及其基本性质

(1). 二叉树定义

特点:

  • 二叉树可以为空,空二叉树无节点,非空有且只有一个根节点;
  • 每个节点最多有两棵子树,即二叉树不存在度大于2的节点;
  • 二叉树的子树有左右之分,其次序不能任意颠倒。

(2). 二叉树性质

性质1:在二叉树第K层上,最多有2k-1(k>=1)个节点。

性质2:深度为m的二叉树中,最多有2m-1个节点。

性质3:对任何一棵二叉树,度为0的节点(即叶子节点)总是比度为2的节点多一个。

性质4:具有n个节点的二叉树,其深度至少为[log2n]+1,其中[log2n]表示其整数部分。

(3).满二叉树和完全二叉树

满二叉树:除最后一层外,每一层上所有节点都有两个子节点的二叉树

即满二叉树在其第k层上有2k-1个节点,且深度为m的满二叉树共有2m-1个节点

完全二叉树:除最后一层外,每一层上的节点数均达到最大值,在最后一层上只缺少右边的若干节点的二叉树

有完全二叉树知,满二叉树一定是完全二叉树,完全二叉树一般不是满二叉树

完全二叉树特点:

  • 叶子节点只可能在最后两层出现;
  • 对任一节点,若其右子树的深度为m,则该结点左子树的深度为m或为m+1。

性质5:具有n个节点的完全二叉树的深度为[log2n]+1。

二叉树的存储结构

二叉树通常采用链式存储结构。存储节点由数据域和指针域构成。(二叉树表)

由于每个元素可有两个后件,所以存储结点的指针域有两个:一个用于指向该节点的左子节点,即左指针域;另一个用于指向该节点的右子节点,即右指针域。

对于满二叉树和完全二叉树可按层次进行顺序存储。

二叉树的遍历

不重复地访问二叉树中的所有节点

二叉树的遍历:

  • 前序遍历(DLR)
  • 中序遍历(LDR)
  • 后序遍历(LRD)

(1). 前序遍历

首先访问根节点,然后遍历左子树,最后遍历右子树;并且在遍历左、右子树时,仍然先访问根节点,然后遍历左子树,最后遍历右子树

(2). 中序遍历

首先遍历左子树,然后访问根节点,最后遍历右子树;并且在遍历左、右子树时,仍然先遍历左子树,然后访问根节点,最后遍历右子树

(3). 后序遍历

首先遍历左子树,然后遍历右子树,最后访问根节点;并且在遍历左、右子树时,仍然先遍历左子树,然后遍历右子树,最后访问根节点

若已知二叉树前、中中、后 可唯一确定二叉树,已知前、后不能唯一确定。

查找技术

顺序查找

逐个查找,若相等,查找成功;若扫描完,未找到相等元素,则查找失败。

  • 最好情况,第一元素就是查找元素,则比较次数为1次。
  • 最坏情况,最后一元素才是查找元素或没有查找元素,则比较次数为n次。
  • 平均情况,大约需要比较n/2次。

顺序查找唯一选择的两种情况:

(1). 线性表为无序表(即表中的元素是无序的),则不管是顺序存储结构还是链式存储结构,都只能顺序查找。

(2). 即使线性表是有序的,如果采用链式存储结构,也只能顺序查找。

二分法查找

条件:

  • 用顺序存储结构

  • 线性表是有序表

对于一个长度为n的有序线性表,将中间值设为M,利用二分法查找元素X过程如下:
将X与M相比较:
(1).若X=M,则查找成功,结束查找;
(2).若X<M,则在线性表的前半部分以二分法继续查找;
(3).若X>M,则在线性表的后半部分以二分法继续查找。

顺序查找每一次比较,只将查找范围减1,

而二分法每一次比较,可将范围减少为原来的一半,效率大大提高。最坏情况,只需比较log2n次。

排序技术

交换类排序法

借助数据元素的“交换”来进行排序的一种方法

(1). 冒泡排序法

两两相邻数据元素之间比较和交换,不断消去***逆序***,直到所有数据元素有序为止

最坏情况,对于长度为n的线性表排序,需要比较次数为log2n次。

(2). 快速排序

待排序的n个元素中取一元素K(通常为第一个元素),以K为分割标准,把所有小于K的移至其前面,把所有大于K的移至其后面,这样,以K为分割线,分割为两个子表,称为一趟 排序。将两子表重复上述步骤,直至子表长度为1,此时,线性表已排好序了。

最坏情况,需进行n(n-1)/2次比较, 实际排序效率要比冒泡排序高得多

插入类排序法

每次将一待排元素,按其元素值大小插入到前面已排好序的子表中的适当位置,直至全部元素插入完成为止

(1). 简单插入元素

把n个待排序的元素看成是一个无序表和一个有序表,开始时,有序表只包含一个元素,而无序表包含另外n-1个元素,每次取无序表中的第一个元素插入到有序表中的正确位置,使其成为增加一个元素的新有序表。插入元素时,插入位置及其后的记录依次向后移动。最后有序表的长度为n,而无序表的长度为空,此时排序完成。

最坏情况,需要n(n-1)/2次比较

(2). 希尔排序

先取一整数(称为增量)d1<n,把全部数据元素分为d1组,所有距离为d1倍数的元素放在一组中,组成一个子序列,对每个子序列分别进行简单插入排序。然后取d2<d1重复上述分组和排序工作,直到di=1,即所有记录在一组中为止。

其排序效率与所选增量序列有关,最坏情况,需要比较nr(1<r<2)

选择类排序法

通过每一趟从待排序序列选出值最小元素,顺序放在已排好序的有序子表后面,直到全部序列满足排序要求为止

(1). 简单选择排序

先选出最小元素a,将a与第一个元素交换,在从剩下的n-1个元素中选出最小元素b与第二个元素交换·····重复直到所有元素有序为止

最坏情况,需要比较n(n-1)/2次

(2). 堆排序法

若有n个元素的序列(h1,h2,···,hn),将元素按顺序组成一棵完全二叉树,当且仅当满足下列条件时称为堆。

hi>=h2i and hi>=h2i+1

或者

hi<=h2i and hi<=h2i+1

其中,i=1,2,3···,n-2。

第一种情况称为大根堆,所有结点的值大于或等于左右子节点的值。

第二种情况称为小根堆,所有节点的值小于或等于左右子节点的值。

最坏情况,需要nlog2n此比较

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值