经典数据结构及分析
经典数据结构及分析
~青萍之末~
弱者总有弱者的理由
展开
-
浅谈二叉查找树、AVL树、红黑树、B树、B+树的原理及应用
一、二叉查找树1、简介二叉查找树也称为有序二叉查找树,满足二叉查找树的一般性质,是指一棵空树具有如下性质:任意节点左子树不为空,则左子树的值均小于根节点的值.任意节点右子树不为空,则右子树的值均大于于根节点的值.任意节点的左右子树也分别是二叉查找树.没有键值相等的节点.2、局限性及应用一个二叉查找树是由n个节点随机构成,所以,对于某些情况,二叉查找树会退化成一个有n个...转载 2018-06-22 21:42:19 · 4548 阅读 · 0 评论 -
B树和B+树
一、为什么要有B树? 学习任何一个东西我们都要知道为什么要有它,B树也一样,既然存储数据,我们为什么不用红黑树呢? 这个要从几个方面来说了:(1)计算机有一个局部性原理,就是说,当一个数据被用到时,其附近的数据也通常会马上被使用。 (2)所以当你用红黑树的时候,你一次只能得到一个键值的信息,而用B树,可以得到最多M-1个键值的信息。这样来说B树当然更好了。 (3)另外一方...转载 2018-06-22 21:40:49 · 882 阅读 · 0 评论 -
红黑树(RB-Tree)
1、定义 红黑树是一种二叉查找树,但在每个结点上增加一个存储位表示结点的颜色,可以是red或black。红黑树满足以下五个性质: 1. 每个结点或是红色或是黑色; 2. 根结点是黑色; 3. 每个叶结点是黑的; 4. 如果一个结点是红的,则它的两个儿子均是黑色; 5. 每个结点到其子孙结点的所有路径上包含相同数目的黑色结点。 当对红黑树进行插入和删除操作时,可能...转载 2018-06-22 21:39:04 · 2248 阅读 · 0 评论 -
字典树(Trie)
1、定义 在计算机科学中,trie,又称前缀树或字典树,是一种有序树,用于保存关联数组,其中的键通常是字符串。与二叉查找树不同,键不是直接保存在节点中,而是由节点在树中的位置决定。一个节点的所有子孙都有相同的前缀,也就是这个节点对应的字符串,而根节点对应空字符串。一般情况下,不是所有的节点都有对应的值,只有叶子节点和部分内部节点所对应的键才有相关的值。 核心思想是空间换时间,利用字符串...原创 2018-06-22 21:34:12 · 331 阅读 · 0 评论 -
AOV网络与AOE网络
一、AOV网络与拓扑排序 AOV网(Activity On Vertex NetWork)用顶点表示活动,边表示活动(顶点)发生的先后关系。 若网中所有活动均可以排出先后顺序(任两个活动之间均确定先后顺序),则称网是拓扑有序的。1、算法步骤在网络中选择一个入度为0的顶点输出;在图中删除该顶点及所有以该顶点为起点的边;重复上述过程,直至所有边均被输出。2、算法图解...原创 2018-06-05 20:43:07 · 16395 阅读 · 0 评论 -
图的最短路径之迪杰斯特拉算法和弗洛伊德算法
一、迪杰斯特拉(Dijkstra)算法1、定义描述 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法的时间复杂度为O(N^2)。例如求下图中的1号顶点到2、3、4、5、6号顶点的最短路径: 2、算法思想 设G=(V,E)是一个带权有向图,把图中顶...原创 2018-06-05 20:03:51 · 22566 阅读 · 0 评论 -
最小生成树之克鲁斯卡尔算法和普里姆算法
一、最小生成树简介 假设有一个很实际的问题:我们要在n个城市中建立一个通信网络,则连通这n个城市需要布置n-1一条通信线路,这个时候我们需要考虑如何在成本最低的情况下建立这个通信网? 于是我们就可以引入连通图来解决我们遇到的问题,n个城市就是图上的n个顶点,然后,边表示两个城市的通信线路,每条边上的权重就是我们搭建这条线路所需要的成本,所以现在我们有n个顶点的连通网可以建立不同的生成...原创 2018-06-04 20:23:04 · 37010 阅读 · 8 评论 -
图的深度优先搜索(DFS)与广度优先搜索(BFS)
一、深度优先搜索(DFS) 深度优先搜索的思想:假设初始状态是图中所有顶点均未被访问,则从某个顶点V出发,首先访问该顶点,然后从它的某一个未被访问的邻接点出发深度优先搜索遍历图,直至图中所有和V有路径相通的顶点都被访问到。 若此时尚有其他顶点未被访问到,则另选一个未被访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访问到为止。显然,深度优先搜索是一个递归的过程。1、图解深度优先搜索...原创 2018-05-27 21:29:00 · 1427 阅读 · 0 评论 -
图及其数据表示
一、图形简介 树状结构描述的是节点与节点之间的层次关系,但是图形结构主要是讨论两个节点之间“联通与否”的关系。1、图的相关概念 图的定义:图是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G(V,E),其中,G表示一个图,V是图G中顶点的集合,E是图G中边的集合。(1)无向图 若顶点Vi到Vj之间的边没有方向,则称这条边为无向边,用无序偶对(Vi,Vj)来表示。...原创 2018-05-25 19:44:54 · 1284 阅读 · 0 评论 -
堆(优先队列)
一、堆1、堆的特征 堆是什么?是一种特殊的完全二叉树,就像下面这棵树一样: 这棵二叉树有一个特点,就是所有父结点都比子结点要小。符合这样特点的完全二叉树我们称为最小堆。反之,如果所有父结点都比子结点要大,这样的完全二叉树称为最大堆。 我们对堆中的结点按层进行编号,该数组从逻辑上讲就是一个堆结构,我们用简单的公式来描述一下堆的定义就是:最大堆:arr[i] >= ...原创 2018-05-24 20:53:23 · 718 阅读 · 0 评论 -
哈夫曼树(带权最优二叉树)
一、哈夫曼树1、哈夫曼树简介 哈夫曼树(Huffman)树又称最优二叉树,是指对于一组带有确定权值的叶子结点所构造的具有带权路径长度最短的二叉树。从树中一个结点到另一个结点之间的分支构成了两结点之间的路径,路径上的分支个数称为路径长度。二叉树的路径长度是指由根结点到所有叶子结点的路径长度之和。如果二叉树中的叶子结点都有一定的权值,则可将这一概念拓展:设二叉树具有n个带权值的叶子结点,则从...原创 2018-05-24 19:52:34 · 23385 阅读 · 0 评论 -
AVL树(平衡二叉树)
一、AVL树的特征 虽说二叉查找树是一种优秀的数据结构,能够大大降低数据查询的复杂度。但是,并不是说有情况下二叉树都能够达到快速查找的目的。 我们发现,如果按照[7,10,11,12,14,15,18]这样的顺序一个个元素进行插入的话就会出现右图所示的二叉树,这样的二叉树跟一个链表几乎是没有区别的,查找的效率一样,没有体现出二叉树的优势。出现这种原因是构建二叉树的过程中没有平衡节点...原创 2018-05-21 20:29:39 · 2924 阅读 · 0 评论 -
二叉查找树(BST)及二叉树的遍历
一、二叉查找树(BST)1、二叉查找树的特征 二叉查找树(BST)也称为二叉搜索树或二叉排序树。二叉查找树的节点包含键值key。二叉查找树或者是一棵空树,否则要求: 1. 若它的左子树不为空,那么左子树上所有节点的key都小于根节点的key。 2. 若它的右子树不为空,那么右子树上所有节点的key都大于根节点的key。 3. 它的左右子树也分别为二叉排序树。 2、二叉查...原创 2018-05-18 17:08:17 · 18423 阅读 · 1 评论 -
树及二叉树的基本概念
一、树1、树的特征 树是由一个或一个以上的节点(node)组成,存在一个特殊节点称为树根(root),它是n(n>=0)个节点的有限集。n=0时称为空树。n>0时,有限集的元素构成一个具有层次感的数据结构。 2、树的相关概念 树有许多相关的术语与概念,在学习树的结构之前,我们要熟悉这些概念。 1. 子树:除了根节点外,每个子节点都可以分为多个不相交的子树。...原创 2018-05-18 15:32:53 · 376 阅读 · 0 评论 -
队列及其应用(滑动窗口求最大值)
一、队列(queue)1、队列的特点 队列(Queue)与栈一样,是一种线性存储结构,它具有如下特点:【Note】: (1)队列中的数据元素遵循“先进先出”(First In First Out)的原则,简称FIFO结构。 (2)在队尾添加元素,在队头删除元素。 队列在栈在计算机中应用相当广泛,包括广度优先搜索、CPU的作业调度、缓冲区等等。2、队列的相关概念(1)...原创 2018-05-14 21:48:23 · 1568 阅读 · 1 评论 -
栈及其应用(表达式求值、括号匹配)
一、栈(stack)1、栈的特点 栈(Stack)是一种线性存储结构,它具有如下特点:【Note】: (1)栈中的数据元素遵守”先进后出”(First In Last Out)的原则,简称FILO结构。 (2)限定只能在栈顶进行插入和删除操作。 栈在计算机中应用相当广泛,包括递归的调用和返回、二叉树和森林的遍历、调用子程序及从子程序返回、表达式的转换和求值、CPU的中断处理...原创 2018-05-14 21:06:57 · 15623 阅读 · 2 评论 -
链表的应用之多项式求和
一元多项式的运算包括加法减法和乘法,而多项式的加法和乘法都可以依靠多项式的加法来实现,所以本文仅仅讲解如何用链表实现一元多项式的加法。 数学上的一元多项式的表示是p(x) = p0 + p1 * x + p2 * x^2 + p3 * x^3 + … + pn * x^n; 用链表来表示就是p = (p0, p1, p2, … , pn); 所谓的多项式相加就是同类项的合...原创 2018-05-14 20:22:36 · 2210 阅读 · 0 评论 -
线性表
一、线性表简介 线性表是一种线性结构,它是由零个或多个数据元素构成的有限序列。线性表的特征是在一个序列中,除了头尾元素,每个元素都有且只有一个直接前驱,有且只有一个直接后继,而序列头元素没有直接前驱,序列尾元素没有直接后继。 数据结构中常见的线性结构有数组、单链表、双链表、循环链表等。线性表中的元素为某种相同的抽象数据类型。可以是C语言的内置类型或结构体,也可以是C++自定义类型。...原创 2018-05-14 20:12:03 · 10957 阅读 · 0 评论