数据结构与算法总结(下)

开发工具与关键技术:总结

作者:Mr_恺

撰写时间:2020.5.16

 

5.0:数组

  1. 数组的基本操作主要包括:访问和修改
  2. 所谓数组,是有序的元素序列。

3、二维数组理解:一维数组的每个元素都是一维数组。

4、矩阵:

  1. 零矩阵:内部元素全部为0,一般用0m*n表示
  2. 方阵:对于行数与列数相等的矩阵
  3. 对角矩阵:方阵A中的元素aij=0(i≠j)时,A是一个对角矩阵
  4. 单位矩阵:对角矩阵A的元素aii=1时,A称为n阶单位矩阵,记做En或In
  5. 上/下三角形矩阵:主对角线以下/上元素全为0的矩阵
  6. 行/列矩阵:矩阵中只有一行/一列元素的矩阵

5、稀疏矩阵一般的压缩存储方法有两种:三元组和十字链表

6.0:树

    树形结构是一种应用十分广泛的非线性结构,客观世界中广泛存在的。

1、树的定义:

 树由n(n>=0)个结点组成的有限集合T

 如果n=0,称树为空;

 如果n>0,则满足;

  1. 有一个特定的称之为根(root)的结点,它只有直接后继,但没有前驱
  2. 除根以外的其它结点划分为m(m>0)个互不相交的有限集合T1,T2……Tm,每个集合又是一颗树,并且称之为根的子树(subTree)。
  3. 每棵子树的根结点有且仅有一个直接前驱,但可以有0个或多个直接后继。

2、树的基本术语:

    1. 节点(node)包含一个数据元素及若干个指向其子树的分支
    2. 节点的度(degree)节点的子树的个数
    3. 树的度(degree)树中节点度的最大值
    4. 叶子(leaf)度为零的节点
    5. 分支(branch)度不为零的节点
    6. 孩子(child)某节点的各子树的根
    7. 双亲(parent)该节点的直接前驱节点
    8. 兄弟(sibling)具有相同双亲的节点
    9. 有序树和无序树 如果树中每个节点的各子树是从左到右有次序
    10. 森林 m(m>=0)根互不相交的树的有限集合
    11. 树的深度:树中所有节点的最大层数,也称高度
  1. 由于子树的互不相交性,树中每个节点只属于一颗树(子树),且树中的每一个结点都是该树中某一颗子树的根。

3、在不同的应用场合,可以用不同的方法来表示树,常用的方法有一下几种:

  1. 直观(树形,倒置树)树的形状像一颗倒立的树
  2. 嵌套集合 用集合表示结点之间的层次关系对于其中任意两个集合,或者不相交,或者一个集合包含另一个集合
  3. 凹入(缩进)表示法 类似于书的目录,用结点逐层缩进的方法表示树中各结点之间的层次关系
  4. 广义表(嵌套括号)表示法  用于括号的嵌套表示结点之间的层次关系,主要用于树的理论描述。

 

6.1:二叉树

1. 二叉树是最简单的树形结构,所有的一般树都可以转换为二叉树,转换后的二叉树也能按一定规则还原为一般树。

2. 定义:二叉树是树形结构中的一种最典型、最常用的结构,处理起来比一般树简单,而且树也可以很容易地转换成二叉树。

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

 

4. 二叉树的基本操作:

  1. 初始化InitTree(BT):将二叉树BT初始化为一颗空树。
  2. 判断二叉树是否为空TreeEmpty(BT):判断一颗树BT是否为空,若为空,返回真否则返回假。
  3. 求根结点Root(BT):返回树BT的根结点
  4. 求双亲结点Parent(BT,x):返回二叉树BT中x的双亲结点,如果x为根结点,则返回空。
  5. 求二叉树的高度Depth(BT):返回二叉树BT的高度(深度)。
  6. 求结点的左孩子LChild(BT,x):返回二叉树BT中结点x的左孩子结点,若结点x为叶子结点或x不在二叉树BT中,则返回值为“空”。
  7. 求结点的右孩子RChild(BT,x):返回二叉树BT中结点x的右孩子结点,若结点x为叶子结点或x不在二叉树BT中,则返回值为“空”。
  8. 遍历二叉树Traverse(BT):从根结点开始,按照一定的次序访问二叉树BT中所有的结点。

6.2:二叉树的遍历

  1. 遍历二叉树:以某种次序访问二叉树中的每个结点,且每个结点仅被访问一次
  2. 访问:如查询结点数据域的内容、输出结点的数据、修改结点的数据或是执行对结点的其它操作。
  3. 先根遍历:二叉树为空,则空操作,否则访问根节点(T),先根遍历左子树(L),先根遍历右子树(R)
  4. 中根遍历:二叉树为空,则空操作,否则根遍历左子树(L),访问中根节点(T),中根遍历右子树(R)
  5. 后根遍历:二叉树为空,则空操作,否则后根遍历左子树(L),后根遍历右子树(R),访问根节点(T)
  • 二叉树的定义:

      一颗二叉树是结点的一个有限集合,该集合或者为空,或者是由一个根结点加上两棵分别称为左子树和右子树的、互不相交的二叉树组成。每个结点最多只有两个孩子。

 

 

数据结构与算法总结(下)_第1张图片

 

 

  • 二叉树的顺序存储结构:

用一组连续的存储单元存放二叉树中的元素,即按满二叉树的形式存放一维数组中。

  • 二叉树的链式存储结构:

最常用的是二叉链表的三叉链表

         二叉链表的每个结点有一个数据域和两个指针域,

      一个指针指向左孩子,另一个指向右孩子。

哈夫曼树的基本概念:

路径长度:两个结点之间的路径长度是链接两结点的路径上的分支数

树的路径长度:根结点到个结点的路径长度之和

 

 

数据结构与算法总结(下)_第2张图片数据结构与算法总结(下)_第3张图片

 

特点:哈夫曼树中没有度为一的结点

7.0:图

  1.图结构是一种比树形结构更复杂的非线性结构,任意一个结点都可以有任意多个前驱和后继。图结构是一种重要的数据结构。

定义:图是由顶点和边组成,顶点表示图中数据元素,边表示数据元素之间的关系,记为

                     Graqh=(V,E)

其中  V是顶点的非空有穷集合;E是用顶点对表示边的有穷集合,可以为空

  2.图的基本术语:

  1. 邻接点
  2. 顶点的度、入度的出度
  3. 完全图、稠密图、稀疏图
  4. 子图
  5. 路径
  6. 连通图、连通分量
  7. 强连通图、强连通分量
  8. 权、网

  3.邻接矩阵概念:

  邻接矩阵这种存储结构采用两个数组来表示图,一个是一维数组,存储图中的所有顶点的信息:另一个是二维数组,即邻接矩阵,存储顶点之间的关系。

 

4 . 图的遍历:从图的某一个顶点出发遍历图中其余顶点,且使每一顶点仅被访问一次

5 . 遍历图的基本方法:

深度优先搜索DSF( Depth First Search )

广度优先搜索BFS( Breadth First Search )

 

8.0查找:

静态查找是指在静态查找表上进行的查找操作,查找满足条件的数据元素的存储位置或各种属性。

一、顺序查找

基本思想:1.查找表的存储结构是线性表(顺序表或链表)

                       2.查找过程是依次用查找条件中给定的值与查找表中数据元素的关键字值进行比较。

二、折半查找

      折半查找只适合用于对有序顺序表进行查找。

折半查找的基本思想是:

  1. 每进行一次折半查找,要么查找成功,结束查找,要么将范围缩小一半,如此重复
  2. 直到查找成功或查找范围缩小为空即查找失败为止。

小结:

  1. 二分查找算法平均查找长度为log2n,比较次数少,查找速度快。
  2. 只能应用于有序的顺序表
  3. 二分查找适用于那种一经建立就很少改动,而又经常用需要查找的顺序表。

三、动态查找

特点:表结构是在查找中动态生成,对于给定值k,如表中存在,则查找成功;否则在适当的位置插入k

动态查找的结构主要有二叉树结构和树结构两种类型

 

数据结构与算法总结(下)_第4张图片数据结构与算法总结(下)_第5张图片

 

                                             数据结构与算法总结(下)_第6张图片

四、哈希查找

哈希表又称散列表

哈希表存储的基本思想

以每个记录的关键字k为自变量,通过一种函数H(K)计算出一个函数值

  1. 把这个值解释为一块连续存储空间(即数组空间)的单元地址(即下标),将该记录存储到这个单元中
  2. 在此称该函数H为哈希函数或散列函数

哈希表说明

  1. 查找方法:

通过关键字直接得到记录的存储地址

  1. 冲突

理想的哈希函数是在关键字和存储地址之间建立一一对应,从而使得查找只需一次计算即可完成。但由于关键字值的某种随机性,使得这种一一对应关系难以发现或构造。因而可能会出现不同关键字对应一个存储地址。即k1≠k2,但H(k1)=H(k2),这种现象称为冲突

 

  1. 同义词

把这种具有不同关键字值而具有相同哈希地址的对象称“同义词”

采用的处理冲突的方法有开放地址法链地址法两大类

 

9.0排序:

一、直接插入排序

  1. 直接插入排序的基本思想
  • 开始时有序表中只包含一个元素,无序表中包含有n-1个元素
  • 排序过程中每次从无序表中取出第一个元素,将它插入到有序表中的适当位置,使之成为新的有序表。
  • 每一趟都是将一个记录插入但前面的有序段中。直到所有记录都插入到有序段中。
  • 需进行n-1
  1. 直接插入排序的效率分析
  1. 从空间来看,它只需要一个元素的辅助空间。
  2. 从时间分析,最少比较次数(正序)为O(n),最多比较次数(逆序)O(n2 )。因此,直接插入排序的时间复杂度为O(n2 )。
  3. 直接插入算法的元素移动是顺序的,该方法是稳定的。
  4. 适用于对排序元素较少、且基本有序的数据元素排序。

二、快速排序

(1)快速排序是一种交换排序。

(2)快速排序的基本思想是:

从待排序序列的n个记录中任取一个记录Ri 作为基准记录,以基准记录为界限,将待排序序列划分成两个子序列,所有关键字小于Ki 的记录移到Ri 的前面,所有关键字大于K 的记录移到Ri 的后面,这个过程称作一趟快速排序;然后用同样的方法对两个子序列排序,得到4个子序列;依次类推,直到每一个子序列只有一个记录的为止,此时就得到n个记录的有序序列。

(3)快速排序算法的时间效率:

快速排序算法的时间效率取决于划分子序列次数,对于有n个记录的序列进行划分,共需n-1次关键字的比较,在最好情况下,假设每次划分得到两个大致等长的记录子序列,时间复杂度为O(log2n)。快速排序是一种不稳定的排序方法。

三、选择排序

  1. 选择排序有两种:直接选择排序和堆排序。
  2. 选择排序的基本思想:每一趟从待排序记录中选出关键字最小的记录,按顺序放到已排好的子序列中,直到全部记录排序完毕。

你可能感兴趣的:(总结)