Machine LearningData Structures and Algorithm Analysis

数据结构与算法的知识点

2018-03-18  本文已影响18人  盗梦者_56f2

数据结构

数据结构

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> 再散列法。
查找性能
查找过程中,关键码的比较次数,取决于产生冲突的多少,产生的冲突少,查找效率就高,产生的冲突多,查找效率就低。因此,影响产生冲突多少的因素,也就是影响查找效率的因素。

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> 后序遍历:按后序遍历左子树---按后序遍历右子树---访问根结点。
树的主要存储方法
<1> 双亲表示法
<2> 孩子表示法
<3> 孩子兄弟表示法
哈夫曼树
它是由n个带权叶子结点构成的所有二叉树中带权路径长度最短的二叉树。

9. 图

图的定义
图(Graph)是一种网状数据结构,其形式化定义如下:
Graph=(V, R)
V={X | X属于DataObject}
R={VR}
VR={<x, y> | P(x, y) ^ (x, y属于V)}
DataObject为一个集合,该集合中所有的元素具有相同的特性。V中的数据元素通常称为顶点,VR是两个顶点之间的关系的集合。P(x, y)表示x和y之间有特定的关联属性P。
若<x, y>属于VR,则<x, y>表示从顶点x到顶点y的一条弧(arc),并称x为弧尾(tail)或起始点,称y为弧头(head)或终端店,此时图中的边是有方向的,称这样的图为有向图。
<x, y>属于VR,必有<y,x>属于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> 广度优先搜索。

上一篇下一篇

猜你喜欢

热点阅读