数据结构与算法的知识点

数据结构

数据结构与算法的知识点_第1张图片
数据结构

1. 数组

数组的定义:由一组具有相同类型的数据元素组成,并存储在一组连续的存储单元中的数组元素我们称之为数组。数组有一维数组、二维数组、N维数组。
数组的特点
元素类型是固定的、长度是固定的、通过角标查询,查询快,增删慢。

2. 链表

链表从连接方式看可以分为:单链表循环链表双向链表
链表节点的逻辑顺序和物理顺序不一定相同。
单链表的结构:链表中的节点包括数据域和指针域两个域。数据域data用来存储节点的值,指针域nest用来存储下一个节点的地址。头指针H指向第一个节点,最后一个节点的指针域为空(NULL)。
为方便统一表的运算处理,在单链表的第一节点之前附设一个头节点,头结点的数据域可存储线性表的长度附加信息,也可什么都不存,头结点的指针域存储指向第一个节点的存储位置。
单链表的操作必须从头指针开始依次访问表中的节点。查询慢,增删快。

3. 线性表

线性表的定义
线性表是由n个类型相同的数据元素的有限序列。除第一个和最后一个元素以外,其余的每个元素都只有唯一的直接前驱和直接后继。
线性表的特点
<1>同一性:数据元素类型相同。
<2>有穷性:数据元素有限的。
<3>有序性:相邻数据元素之间存在序偶关系。
线性表的顺序存储结构
用一组地址连续的存储单元依次存储线性表中的各个元素,逻辑上相邻的数据元素在物理上也相邻。
随机查找速度快,大量插入删除效率低。
线性表的链式存储

线性表的基本运算
查找、插入、删除

4. 哈希表

散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,理想情况下它应该计算起来简单,并且应该保证任何两个不同的关键字映射到不停的单元。存放记录的数组叫做散列表。
给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希(Hash) 函数。
若关键字为k,则其值存放在f(k)的存储位置上。由此,不需比较便可直接取得所查记录。称这个对应关系f为散列函数,按这个思想建立的表为散列表。对不同的关键字可能得到同一散列地址,即k1≠k2,而f(k1)=f(k2),这种现象称为碰撞。
若对于关键字集合中的任一个关键字,经散列函数映象到地址集合中任何一个地址的概率是相等的,则称此类散列函数为均匀散列函数,这就是使关键字经过散列函数得到一个“随机的地址”,从而减少碰撞。
选取散列函数的常用方法
<1> 直接寻址法。
<2> 平方取中法。
<3> 除留余数法。
处理冲突的常用方法
<1> 开放寻址法。
<2> 链地址法(拉链法)。
<3> 再散列法。
查找性能
查找过程中,关键码的比较次数,取决于产生冲突的多少,产生的冲突少,查找效率就高,产生的冲突多,查找效率就低。因此,影响产生冲突多少的因素,也就是影响查找效率的因素。
如果输入的关键字是整数,则一般合理的方法就是直接返回 key mod tableSize。如果关键字是字符串,一种选择方法是把字符串中字符的ASCII码(或Unicode码)值加起来之后再对tableSize取余。

5. 栈

栈作为一种限定性的线性表,是一种先进后出(LIFO)的线性表,是将线性表的插入和删除运算限制为仅在表的一端进行。
通常将表中允许进行插入和删除操作的一端称为栈顶,它由一个称为栈顶指针的位置指示器指示,另一端称为栈底,插入操作称为进栈或入栈,删除操作称为出栈或退栈。
栈的两种存储结构顺序栈是用顺序存储结构实现的栈,即利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素。链栈即采用链表作为存储结构实现的栈,为便于操作,这里采用带头结点的单链表实现栈,采用链栈不必预先估计栈的最大容量,只要系统有可用空间,链栈就不会出现溢出。
栈的应用
<1> 括号匹配问题
<2> 表达式求值问题
<3> 十进制正整数转换为R进制。

6. 队列

队列是另一种限定性的线性表,它只允许在表的一端(队尾)插入元素,而在另一端(队头)删除元素,所以队列具有先进先出(FIFO)的特性。
用链表表示的队列简称为链队列。队列的一种顺序存储称为顺序队列,由于它存在假溢出的问题,可以使用循环队列解决该问题,为了区分循环队列是空队还是满队的两种方法是:第一是损失一个元素空间,第二种方法是增设标志量tag。

7. 串

字符串是由零个或多个字符组成的有限序列。串也是一种特定的线性表。串的顺序存储结构:定长顺序串堆串。串也可以采用链式存储结构称为块链串

8. 树

树是n(n >= 0)个结点的有限集合T。当n=0时,称为空树;当n>0时,该集合满足如下条件:
<1> 其中必有一个称为根(root)的特定结点,它没有直接前驱,但有零个或多个直接后继。
<2> 其余n-1个节点可以划分为m(m>=0)个互不相交的有限集。
树的相关术语
结点:包括一个数据元素及若干指向其他节点的分支信息。
结点的度:一个结点的子树个数称为此节点的度。
叶节点:度为零的节点。
分支结点:度不为零的节点。
结点的层次:从根结点开始定义,根结点的层次为1,跟的直接后继的层次为2,以此类推。
结点的层序编号:将树中的节点按从上层到下层,同层从左到右的次序排成一个线性序列,依次给它们编以连续的自然数。
树的度:树中所有节点的度的最大值。
树的高度(深度):树中所有节点的层次的最大值。
森林:m(m>=0)棵互不相交的树的集合。
孩子节点:一个结点的直接后继称为该节点的孩子节点。
双亲结点:一个结点的直接前驱称为该节点的双亲结点。
兄弟结点:同一双亲结点的孩子节点之间互称兄弟结点。

二叉树:

二叉树的定义:把满足以下两个条件的树形结构叫做二叉树:
<1> 每个节点的度都不大于2
<2> 每个节点的孩子节点次序不能任一颠倒位于左边的孩子叫做左孩子,右边的叫做右孩子。
二叉树的性质
<1> 在二叉树的第i层上至多有2的(i-1)次方个节点(i>=1)。
<2> 深度为k的二叉树至多有2的k次方减1个节点(k>=1)。
<3> 对任意一颗二叉树T,若终端节点数为x,而其度数为2的节点数为y,则x=y+1。
满二叉树
深度为k且有2的k次方减1个节点的二叉树。
完全二叉树
深度为k,节点数为n的二叉树,如果其节点1到n的位置序号分别与满二叉树的节点1到n的位置序号一一对应,则为完全二叉树。
二叉树的存储结构
<1> 顺序存储。
<2> 链式存储(二叉链表):每个节点至少包括三个域:数据域、左孩子域、右孩子域。
二叉树的遍历
<1> 先序遍历:访问根结点---按先序遍历左子树---按先序遍历右子树。
<2> 中序遍历:按中序遍历左子树---访问根结点---按中序遍历右子树。
<3> 后序遍历:按后序遍历左子树---按后序遍历右子树---访问根结点。
<4>深度优先遍历:在深度优先级中,我们希望从根结点访问最远的结点。
<5>广度优先遍历:广度优先遍历会先访问离根节点最近的节点。二叉树的广度优先遍历又称按层次遍历。算法借助队列实现。
树的主要存储方法
<1> 双亲表示法
<2> 孩子表示法
<3> 孩子兄弟表示法
将n叉树转换为二叉树
一般有序树可映射为二叉树,但反之未必成立。
n叉树转换为二叉树的方法:二叉树中结点x的左子结点为n叉树中结点x的左子结点;二叉树中结点x的右子结点为n叉树中结点x的第一个右边的同级结点y。
二叉树当且仅当根节点没有右子结点时可转换为n叉树。
二叉查找树
二叉排序树(Binary Sort Tree),又称二叉查找树(Binary Search Tree),亦称二叉搜索树。二叉排序树或者是一棵空树,或者是具有下列性质的二叉树

  1. 若左子树不空,则左子树上所有结点的值均小于它的根结点的值;
  2. 若右子树不空,则右子树上所有结点的值均大于它的根结点的值;
  3. 左、右子树也分别为二叉排序树;
  4. 没有键值相等的节点。

AVL树
AVL树是最先发明的自平衡二叉查找树。在AVL树中任何节点的两个子树的高度最大差别为1,所以它也被称为高度平衡树。增加和删除可能需要通过一次或多次树旋转来重新平衡这个树。AVL树本质上还是一棵二叉搜索树,它的特点是

  1. 本身首先是一棵二叉搜索树。
  2. 带有平衡条件:每个结点的左右子树的高度之差的绝对值(平衡因子)最多为1。
    也就是说,AVL树,本质上是带了平衡功能的二叉查找树(二叉排序树,二叉搜索树)。

红黑树
对红黑树的操作在最坏的情形下花费O(log N)时间。红黑树是具有下列着色性质的二叉查找树:

  1. 每一个节点或者着成红色,或者着成黑色;
  2. 根是黑色的;
  3. 如果一个节点是红色的,那么他的子节点必须是黑色的;
  4. 从一个节点到一个nu l l应用的每一条路径必须包含相同数目的黑色节点。

9. 堆

堆是一种特别的树状数据结构。
若是满足以下特性,即可称为堆:“给定堆中任意节点 P 和 C,若 P 是 C 的母节点,那么 P 的值会小于等于(或大于等于) C 的值”。若母节点的值恒小于等于子节点的值,此堆称为最小堆。反之,若母节点的值恒大于等于子节点的值,此堆称为最大堆。在堆中最顶端的那一个节点,称作根节点,根节点本身没有母节点。

10. 图

图的定义
图(Graph)是一种网状数据结构,其形式化定义如下:
Graph=(V, R)
V={X | X属于DataObject}
R={VR}
VR={ | P(x, y) ^ (x, y属于V)}
DataObject为一个集合,该集合中所有的元素具有相同的特性。V中的数据元素通常称为顶点,VR是两个顶点之间的关系的集合。P(x, y)表示x和y之间有特定的关联属性P。
属于VR,则表示从顶点x到顶点y的一条弧(arc),并称x为弧尾(tail)或起始点,称y为弧头(head)或终端店,此时图中的边是有方向的,称这样的图为有向图。
属于VR,必有属于VR,及VR是对称关系,这时以无序对(x,y)来代替两个有序对,表示x和y之间的一条边(edge),此时的图称为无向图。
基本术语
设n表示图中顶点的个数,用e表示图中边或者弧的数目,并且不考虑图中每个顶点到自身的边或弧。对于无向图而言,其边数e的取值范围是0 ~ n(n-1) / 2,有n(n-1) / 2条边(图中每个顶点和其中n-1个顶点都有边相连)的无向图为无向完全图。对于有向图而言,其边数e的取值范围是0 ~ n(n-1) ,有n(n-1) 条边(图中每个顶点和其中n-1个顶点都有弧相连)的有向图为有向完全图。对于有很少条边的图称为稀疏图,反之称为稠密图。带权的图称为有向无环图(DAG)是指一个无环的有向图。
图的存储结构
<1> 邻接矩阵表示法。
<2> 邻接表。
<3> 邻接多重表。
<4> 十字链表。
图的遍历
<1> 深度优先搜索。
<2> 广度优先搜索。

你可能感兴趣的:(数据结构与算法的知识点)