数据结构温习
Coding-lover
Keep hungry,Keep foolish(可通过微信联系我:unilay_yang)
展开
-
红黑树 原理和算法详细介绍(Java)
R-B Tree简介R-B Tree,全称是Red-Black Tree,又称为“红黑树”,它一种特殊的二叉查找树。红黑树的每个节点上都有存储位表示节点的颜色,可以是红(Red)或黑(Black)。红黑树的特性:(1)每个节点或者是黑色,或者是红色。 (2)根节点是黑色。 (3)每个叶子节点(NIL)是黑色。 [注意:这里叶子节点,是指为空(NIL或NULL)的叶子节点!] (4)如果一个节点转载 2015-07-27 13:55:12 · 3930 阅读 · 0 评论 -
邻接表有向图 之 Java详解
邻接表有向图的介绍邻接表有向图是指通过邻接表表示的有向图。上面的图G2包含了”A,B,C,D,E,F,G”共7个顶点,而且包含了”邻接表有向图的代码说明1. 基本定义public class ListDG { // 邻接表中表对应的链表的顶点 private class ENode { int ivex; // 该边所指向的顶点的位置 EN转载 2015-08-18 11:04:54 · 8207 阅读 · 0 评论 -
图的遍历之 深度优先搜索和广度优先搜索
深度优先搜索的图文介绍1. 深度优先搜索介绍图的深度优先搜索(Depth First Search),和树的先序遍历比较类似。它的思想:假设初始状态是图中所有顶点均未被访问,则从某个顶点v出发,首先访问该顶点,然后依次从它的各个未被访问的邻接点出发深度优先搜索遍历图,直至图中所有和v有路径相通的顶点都被访问到。 若此时尚有其他顶点未被访问到,则另选一个未被访问的顶点作起始点,重复上述过程,直至图中所转载 2015-08-18 15:34:56 · 2957 阅读 · 1 评论 -
拓扑排序 之 Java详解
拓扑排序介绍拓扑排序(Topological Order)是指,将一个有向无环图(Directed Acyclic Graph简称DAG)进行排序进而得到一个有序的线性序列。这样说,可能理解起来比较抽象。下面通过简单的例子进行说明! 例如,一个项目包括A、B、C、D四个子部分来完成,并且A依赖于B和D,C依赖于D。现在要制定一个计划,写出A、B、C、D的执行顺序。这时,就可以利用到拓扑排序,它就转载 2015-08-18 17:44:41 · 3777 阅读 · 0 评论 -
Kruskal算法 之 Java详解
最小生成树在含有n个顶点的连通图中选择n-1条边,构成一棵极小连通子图,并使该连通子图中n-1条边上权值之和达到最小,则称其为连通网的最小生成树。例如,对于如上图G4所示的连通网可以有多棵权值总和不相同的生成树。克鲁斯卡尔算法介绍克鲁斯卡尔(Kruskal)算法,是用来求加权连通图的最小生成树的算法。基本思想:按照权值从小到大的顺序选择n-1条边,并保证这n-1条边不构成回路。 具体做法:首先构转载 2015-08-18 19:07:38 · 5645 阅读 · 2 评论 -
Dijkstra算法 之 C语言详解
迪杰斯特拉算法介绍迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径。 它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止。基本思想 通过Dijkstra计算图G中的最短路径时,需要指定起点s(即从顶点s开始计算)。 此外,引进两个集合S和U。S的作用是记录已求出最短路径的顶点(以及相应的最短路径长度),而U则是记录还未求转载 2015-08-19 10:04:56 · 36777 阅读 · 3 评论 -
冒泡排序
冒泡排序介绍冒泡排序(Bubble Sort),又被称为气泡排序或泡沫排序。 它是一种较简单的排序算法。它会遍历若干次要排序的数列,每次遍历时,它都会从前往后依次的比较相邻两个数的大小;如果前者比后者大,则交换它们的位置。这样,一次遍历之后,最大的元素就在数列的末尾! 采用相同的方法再次遍历时,第二大的元素就被排列在最大元素之前。重复此操作,直到整个数列都有序为止!冒泡排序图文说明冒泡排序C实现一转载 2015-08-19 15:32:14 · 993 阅读 · 0 评论 -
Prim算法 之 Java详解
普里姆算法介绍普里姆(Prim)算法,是用来求加权连通图的最小生成树的算法。基本思想 对于图G而言,V是所有顶点的集合;现在,设置两个新的集合U和T,其中U用于存放G的最小生成树中的顶点,T存放G的最小生成树中的边。 从所有uЄU,vЄ(V-U) (V-U表示出去U的所有顶点)的边中选取权值最小的边(u, v),将顶点v加入集合U中,将边(u, v)加入集合T中,如此不断重复,直到U=V为止,最转载 2015-08-19 09:40:30 · 2647 阅读 · 0 评论 -
快速排序
快速排序介绍快速排序(Quick Sort)使用分治法策略。 它的基本思想是:选择一个基准数,通过一趟排序将要排序的数据分割成独立的两部分;其中一部分的所有数据都比另外一部分的所有数据都要小。然后,再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。快速排序流程: (1) 从数列中挑出一个基准值。 (2) 将所有比基准值小的摆放在基准前面,所有比基转载 2015-08-19 17:25:24 · 517 阅读 · 0 评论 -
直接插入排序
直接插入排序介绍直接插入排序(Straight Insertion Sort)的基本思想是:把n个待排序的元素看成为一个有序表和一个无序表。开始时有序表中只包含1个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,将它插入到有序表中的适当位置,使之成为新的有序表,重复n-1次可完成排序过程。直接插入排序图文说明直接插入排序代码/* * 直接插入排序 * * 参数说明:转载 2015-08-19 17:49:28 · 574 阅读 · 0 评论 -
希尔排序
希尔排序介绍希尔排序(Shell Sort)是插入排序的一种,它是针对直接插入排序算法的改进。该方法又称缩小增量排序,因DL.Shell于1959年提出而得名。希尔排序实质上是一种分组插入方法。它的基本思想是:对于n个待排序的数列,取一个小于n的整数gap(gap被称为步长)将待排序元素分成若干个组子序列,所有距离为gap的倍数的记录放在同一个组中;然后,对各组内的元素进行直接插入排序。 这一趟排序转载 2015-08-19 18:30:10 · 1104 阅读 · 2 评论 -
选择排序
选择排序介绍选择排序(Selection sort)是一种简单直观的排序算法。 它的基本思想是:首先在未排序的数列中找到最小(or最大)元素,然后将其存放到数列的起始位置;接着,再从剩余未排序的元素中继续寻找最小(or最大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。选择排序图文说明选择排序代码/* * 选择排序 * * 参数说明: * a -- 待排序的数组转载 2015-08-20 09:23:55 · 567 阅读 · 0 评论 -
堆排序
堆排序介绍堆排序(Heap Sort)是指利用堆这种数据结构所设计的一种排序算法。 因此,学习堆排序之前,有必要了解堆!若读者不熟悉堆,建议先了解堆(建议可以通过二叉堆,左倾堆,斜堆,二项堆或斐波那契堆等文章进行了解),然后再来学习本章。我们知道,堆分为”最大堆”和”最小堆”。最大堆通常被用来进行”升序”排序,而最小堆通常被用来进行”降序”排序。 鉴于最大堆和最小堆是对称关系,理解其中一种即可。转载 2015-08-20 10:22:31 · 866 阅读 · 0 评论 -
基数排序
基数排序介绍基数排序(Radix Sort)是桶排序的扩展,它的基本思想是:将整数按位数切割成不同的数字,然后按每个位数分别比较。 具体做法是:将所有待比较数值统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列。基数排序图文说明基数排序图文说明通过基数排序对数组{53, 3, 542, 748, 14转载 2015-08-20 12:10:17 · 1062 阅读 · 2 评论 -
邻接矩阵有向图 之 Java详解
邻接矩阵有向图的介绍邻接矩阵有向图是指通过邻接矩阵表示的有向图。上面的图G2包含了”A,B,C,D,E,F,G”共7个顶点,而且包含了”邻接矩阵有向图的代码说明1. 基本定义public class MatrixDG { private char[] mVexs; // 顶点集合 private int[][] mMatrix; // 邻接矩阵 ...}Mat转载 2015-08-18 10:57:09 · 3152 阅读 · 0 评论 -
邻接表无向图 之 Java详解
邻接表无向图的介绍邻接表无向图是指通过邻接表表示的无向图。上面的图G1包含了”A,B,C,D,E,F,G”共7个顶点,而且包含了”(A,C),(A,D),(A,F),(B,C),(C,D),(E,G),(F,G)”共7条边。上图右边的矩阵是G1在内存中的邻接表示意图。每一个顶点都包含一条链表,该链表记录了”该顶点的邻接点的序号”。例如,第2个顶点(顶点C)包含的链表所包含的节点的数据分别是”0,1,转载 2015-08-18 10:43:38 · 4646 阅读 · 0 评论 -
哈夫曼树 之 Java详解
哈夫曼树的介绍Huffman Tree,中文名是哈夫曼树或霍夫曼树,它是最优二叉树。定义:给定n个权值作为n个叶子结点,构造一棵二叉树,若树的带权路径长度达到最小,则这棵树被称为哈夫曼树。 这个定义里面涉及到了几个陌生的概念,下面就是一颗哈夫曼树,我们来看图解答。(01) 路径和路径长度 定义:在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。通路中分支的数目称为路径长度。转载 2015-07-29 18:27:10 · 1503 阅读 · 0 评论 -
栈的图文解析 和 对应3种语言的实现(C/C++/Java)
栈的介绍栈(stack),是一种线性存储结构,它有以下几个特点: (01) 栈中数据是按照”后进先出(LIFO, Last In First Out)”方式进出栈的。 (02) 向栈中添加/删除数据时,只能从栈顶进行操作。栈通常包括的三种操作:push、peek、pop。 push – 向栈中添加元素。 peek – 返回栈顶元素。 pop – 返回并删除栈顶元素的操作。1. 栈的示意图转载 2015-07-20 16:35:28 · 821 阅读 · 0 评论 -
二叉查找树 图文解析 和 Java的实现
概要本章先对二叉树的相关理论知识进行介绍,然后给出C语言的详细实现。关于二叉树的学习,需要说明的是:它并不难,不仅不难,而且它非常简单。初次接触树的时候,我也觉得它似乎很难;而之所产生这种感觉主要是由于二叉树有一大堆陌生的概念、性质等内容。而当我真正的实现了二叉树再回过头来看它的相关概念和性质的时候,觉得原来它是如此的简单!因此,建议在学习二叉树的时候:先对二叉树基本的概念、性质有个基本了解,遇到难转载 2015-07-21 10:25:46 · 916 阅读 · 0 评论 -
数组、单链表和双链表介绍 以及 双向链表的C/C++/Java实现
数组数组有上界和下界,数组的元素在上下界内是连续的。存储10,20,30,40,50的数组的示意图如下:数组的特点是:数据是连续的;随机访问速度快。 数组中稍微复杂一点的是多维数组和动态数组。对于C语言而言,多维数组本质上也是通过一维数组实现的。至于动态数组,是指数组的容量能动态增长的数组;对于C语言而言,若要提供动态数组,需要手动实现;而对于C++而言,STL提供了Vector;对于Java而言转载 2015-07-20 15:10:16 · 1181 阅读 · 0 评论 -
二叉堆 之 Java的实现
堆和二叉堆的介绍堆的定义堆(heap),这里所说的堆是数据结构中的堆,而不是内存模型中的堆。堆通常是一个可以被看做一棵树,它满足下列性质: [性质一] 堆中任意节点的值总是不大于(不小于)其子节点的值; [性质二] 堆总是一棵完全树。 将任意节点不大于其子节点的堆叫做最小堆或小根堆,而将任意节点不小于其子节点的堆叫做最大堆或大根堆。常见的堆有二叉堆、左倾堆、斜堆、二项堆、斐波那契堆等等。二叉堆转载 2015-07-30 13:41:24 · 878 阅读 · 0 评论 -
左倾堆 之 Java的实现
左倾堆的介绍左倾堆(leftist tree 或 leftist heap),又被成为左偏树、左偏堆,最左堆等。 它和二叉堆一样,都是优先队列实现方式。当优先队列中涉及到”对两个优先队列进行合并”的问题时,二叉堆的效率就无法令人满意了,而本文介绍的左倾堆,则可以很好地解决这类问题。左倾堆的定义上图是一颗左倾树,它的节点除了和二叉树的节点一样具有左右子树指针外,还有两个属性:键值和零距离。 (01转载 2015-07-31 12:25:00 · 767 阅读 · 0 评论 -
队列的图文解析 和 对应3种语言的实现(C/C++/Java)
队列的介绍队列(Queue),是一种线性存储结构。它有以下几个特点: (01) 队列中数据是按照”先进先出(FIFO, First-In-First-Out)”方式进出队列的。 (02) 队列只允许在”队首”进行删除操作,而在”队尾”进行插入操作。 队列通常包括的两种操作:入队列 和 出队列。1. 队列的示意图队列中有10,20,30共3个数据。2. 出队列出队列前:队首是10,队尾是30。转载 2015-07-20 17:08:29 · 849 阅读 · 0 评论 -
AVL树 之 Java的实现
AVL树的介绍AVL树是高度平衡的而二叉树。它的特点是:AVL树中任何节点的两个子树的高度最大差别为1。 上面的两张图片,左边的是AVL树,它的任何节点的两个子树的高度差别都<=1;而右边的不是AVL树,因为7的两颗子树的高度相差为2(以2为根节点的树的高度是3,而以8为根节点的树的高度是1)。AVL树的Java实现1. 节点1.1 节点定义public class AVLTree<T extend转载 2015-07-21 12:04:49 · 1757 阅读 · 4 评论 -
斐波那契堆 之 Java的实现
斐波那契堆的介绍斐波那契堆(Fibonacci heap)是一种可合并堆,可用于实现合并优先队列。它比二项堆具有更好的平摊分析性能,它的合并操作的时间复杂度是O(1)。 与二项堆一样,它也是由一组堆最小有序树组成,并且是一种可合并堆。 与二项堆不同的是,斐波那契堆中的树不一定是二项树;而且二项堆中的树是有序排列的,但是斐波那契堆中的树都是有根而无序的。斐波那契堆的基本操作1. 基本定义publi转载 2015-08-15 10:51:06 · 1161 阅读 · 0 评论 -
伸展树 之 Java的实现
伸展树的介绍伸展树(Splay Tree)是一种二叉排序树,它能在O(log n)内完成插入、查找和删除操作。它由Daniel Sleator和Robert Tarjan创造。 (01) 伸展树属于二叉查找树,即它具有和二叉查找树一样的性质:假设x为树中的任意一个结点,x节点包含关键字key,节点x的key值记为key[x]。如果y是x的左子树中的一个结点,则key[y] <= key[x];如果转载 2015-07-22 14:18:18 · 1181 阅读 · 0 评论 -
二项堆 之 Java的实现
二项树的介绍二项树的定义二项堆是二项树的集合。在了解二项堆之前,先对二项树进行介绍。二项树是一种递归定义的有序树。它的递归定义如下: (01) 二项树B0只有一个结点; (02) 二项树Bk由两棵二项树B(k-1)组成的,其中一棵树是另一棵树根的最左孩子。 如下图所示:上图的B0、B1、B2、B3、B4都是二项树。对比前面提到的二项树的定义:B0只有一个节点,B1由两个B0所组成,B2由两个B转载 2015-08-15 10:13:43 · 1167 阅读 · 0 评论 -
图的理论基础
图的基本概念1. 图的定义定义:图(graph)是由一些点(vertex)和这些点之间的连线(edge)所组成的;其中,点通常被成为”顶点(vertex)”,而点与点之间的连线则被成为”边或弧”(edege)。通常记为,G=(V,E)。2. 图的种类根据边是否有方向,将图可以划分为:无向图和有向图。2.1 无向图上面的图G0是无向图,无向图的所有的边都是不区分方向的。G0=(V1,{E1})。其中,转载 2015-08-15 19:45:30 · 711 阅读 · 0 评论 -
斜堆 之 Java的实现
斜堆的介绍斜堆(Skew heap)也叫自适应堆(self-adjusting heap),它是左倾堆的一个变种。和左倾堆一样,它通常也用于实现优先队列;作为一种自适应的左倾堆,它的合并操作的时间复杂度也是O(lg n)。 它与左倾堆的差别是: (01) 斜堆的节点没有”零距离”这个属性,而左倾堆则有。 (02) 斜堆的合并操作和左倾堆的合并操作算法不同。斜堆的合并操作 (01) 如果一个空转载 2015-08-05 09:40:29 · 605 阅读 · 0 评论 -
邻接矩阵无向图 之 Java详解
邻接矩阵无向图的介绍邻接矩阵无向图是指通过邻接矩阵表示的无向图。上面的图G1包含了”A,B,C,D,E,F,G”共7个顶点,而且包含了”(A,C),(A,D),(A,F),(B,C),(C,D),(E,G),(F,G)”共7条边。由于这是无向图,所以边(A,C)和边(C,A)是同一条边;这里列举边时,是按照字母先后顺序列举的。上图右边的矩阵是G1在内存中的邻接矩阵示意图。A[i][j]=1表示第i个转载 2015-08-18 10:30:02 · 4010 阅读 · 0 评论 -
归并排序
归并排序介绍将两个的有序数列合并成一个有序数列,我们称之为”归并”。 归并排序(Merge Sort)就是利用归并思想对数列进行排序。根据具体的实现,归并排序包括”从上往下“和”从下往上“2种方式。从下往上的归并排序:将待排序的数列分成若干个长度为1的子数列,然后将这些数列两两合并;得到若干个长度为2的有序数列,再将这些数列两两合并;得到若干个长度为4的有序数列,再将它们两两合并;直接合并成一个转载 2015-08-20 10:40:53 · 539 阅读 · 0 评论