数据结构与算法
文章平均质量分 88
喝酸奶舔盖儿的土鳖
事情都是有双面性的。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
线性结构(三) - 队列的原理与实现
一、队列的介绍队列(Queue),是一种线性存储结构。它有以下几个特点:1、队列中数据是按照"先进先出(FIFO, First-In-First-Out)"方式进出队列的。2、队列只允许在"队首"进行删除操作,而在"队尾"进行插入操作。队列通常包括的两种操作:入队列 和 出队列。1. 队列的示意图队列中有10,20,30共3个数据。2. 出队列原创 2015-01-06 22:01:08 · 553 阅读 · 0 评论 -
树结构(三) - 红黑树的实现
红黑树的基本操作是添加、删除和旋转。在对红黑树进行添加或删除后,会用到旋转方法。为什么呢?道理很简单,添加或删除红黑树中的节点之后,红黑树就发生了变化,可能不满足红黑树的5条性质,也就不再是一颗红黑树了,而是一颗普通的树。而通过旋转,可以使这颗树重新成为红黑树。简单点说,旋转的目的是让树保持红黑树的特性。旋转包括两种:左旋 和 右旋。下面分别对红黑树的基本操作进行介绍:原创 2015-01-11 19:25:56 · 498 阅读 · 0 评论 -
树结构(四) - 哈夫曼树的原理与实现
一、哈夫曼树的介绍Huffman Tree,中文名是哈夫曼树或霍夫曼树,它是最优二叉树。定义:给定n个权值作为n个叶子结点,构造一棵二叉树,若树的带权路径长度达到最小,则这棵树被称为哈夫曼树。 这个定义里面涉及到了几个陌生的概念,下面就是一颗哈夫曼树,我们来看图解答。(1) 路径和路径长度定义:在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。通路原创 2015-01-13 13:24:00 · 6578 阅读 · 0 评论 -
堆结构(一) - 二叉堆的原理与实现
一、二叉堆的介绍二叉堆是完全二元树或者是近似完全二元树,按照数据的排列方式可以分为两种:最大堆和最小堆。最大堆:父结点的键值总是大于或等于任何一个子节点的键值;最小堆:父结点的键值总是小于或等于任何一个子节点的键值。二叉堆一般都通过"数组"来实现,下面是数组实现的最大堆和最小堆的示意图:二、二叉堆的图文解析图文解析是以"最大堆"来进行介绍的。最大堆的核心内容是"添加"和原创 2015-01-13 14:38:08 · 796 阅读 · 0 评论 -
堆结构(二) - 左倾堆的原理与实现
一、左倾堆的介绍左倾堆(leftist tree 或 leftist heap),又被成为左偏树、左偏堆,最左堆等。它和二叉堆一样,都是优先队列实现方式。当优先队列中涉及到"对两个优先队列进行合并"的问题时,二叉堆的效率就无法令人满意了,而本文介绍的左倾堆,则可以很好地解决这类问题。左倾堆的定义:上图是一颗左倾树,它的节点除了和二叉树的节点一样具有左右子树指针外,还有两个属原创 2015-01-14 06:53:06 · 1106 阅读 · 0 评论 -
堆结构(三) - 斜堆的原理与实现
一、斜堆的介绍斜堆(Skew heap)也叫自适应堆(self-adjusting heap),它是左倾堆的一个变种。和左倾堆一样,它通常也用于实现优先队列;作为一种自适应的左倾堆,它的合并操作的时间复杂度也是O(lg n)。它与左倾堆的差别是:(1) 斜堆的节点没有"零距离"这个属性,而左倾堆则有。(2) 斜堆的合并操作和左倾堆的合并操作算法不同。斜堆的合并操作(1) 如原创 2015-01-16 06:06:52 · 1001 阅读 · 0 评论 -
图结构(一)- 图的理论基础
一、图的基本概念1、图的定义定义:图(graph)是由一些点(vertex)和这些点之间的连线(edge)所组成的;其中,点通常被成为"顶点(vertex)",而点与点之间的连线则被成为"边或弧"(edege)。通常记为,G=(V,E)。2、图的分类根据边是否有方向,将图可以划分为:无向图和有向图。2.1、无向图上面的图G0是无向图,无向图的所有的边都是不区分方向的原创 2015-01-16 06:26:43 · 672 阅读 · 0 评论 -
图结构(二)- 邻接矩阵无向图
一、邻接矩阵无向图的介绍邻接矩阵无向图是指通过邻接矩阵表示的无向图。上面的图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原创 2015-01-22 06:27:27 · 1047 阅读 · 0 评论 -
线性结构(一) - 数组、单链表和双链表
一、概要 线性表是一种线性结构,它是具有相同类型的n(n≥0)个数据元素组成的有限序列。本文章介绍线性表的几个基本组成部分:数组、单向链表、双向链表以及双向链表的实现。二、数组数组有上界和下界,数组的元素在上下界内是连续的。存储10,20,30,40,50的数组的示意图如下:数组的特点是:数据是连续的;随机访问速度快。数组中稍微复杂一点的是多维数组和动态数组原创 2015-01-04 20:54:21 · 668 阅读 · 0 评论 -
排序算法(三)- 直接插入排序
一、直接插入排序算法介绍直接插入排序(Straight Insertion Sort)的基本思想是:把n个待排序的元素看成为一个有序表和一个无序表。开始时有序表中只包含1个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,将它插入到有序表中的适当位置,使之成为新的有序表,重复n-1次可完成排序过程。二、直接插入排序图文说明代码如下:/* * 直接插入排序原创 2015-01-25 12:42:02 · 676 阅读 · 0 评论 -
排序算法(一)- 冒泡排序
一、冒泡排序介绍冒泡排序(Bubble Sort),又被称为气泡排序或泡沫排序。它是一种较简单的排序算法。它会遍历若干次要排序的数列,每次遍历时,它都会从前往后依次的比较相邻两个数的大小;如果前者比后者大,则交换它们的位置。这样,一次遍历之后,最大的元素就在数列的末尾! 采用相同的方法再次遍历时,第二大的元素就被排列在最大元素之前。重复此操作,直到整个数列都有序为止!二、冒泡排序图文说原创 2015-01-23 06:17:02 · 450 阅读 · 0 评论 -
树结构(二) - 红黑树的原理介绍
一、R-B Tree简介R-B Tree,全称是Red-Black Tree,又称为“红黑树”,它一种特殊的二叉查找树。红黑树的每个节点上都有存储位表示节点的颜色,可以是红(Red)或黑(Black)。红黑树的特性:(1)每个节点或者是黑色,或者是红色。(2)根节点是黑色。(3)每个叶子节点(NIL)是黑色。 [注意:这里叶子节点,是指为空(NIL或NULL)的叶子节点原创 2015-01-08 15:24:32 · 586 阅读 · 0 评论 -
图结构(七)- Kruskal算法
一、最小生成树在含有n个顶点的连通图中选择n-1条边,构成一棵极小连通子图,并使该连通子图中n-1条边上权值之和达到最小,则称其为连通网的最小生成树。例如,对于如上图G4所示的连通网可以有多棵权值总和不相同的生成树。二、克鲁斯卡尔算法介绍克鲁斯卡尔(Kruskal)算法,是用来求加权连通图的最小生成树的算法。 基本思想:按照权值从小到大的顺序选择n-1条边,并保证这n-原创 2015-01-27 19:59:16 · 699 阅读 · 0 评论 -
树结构(一) - 二叉树查找树的原理与实现
一、二叉树查找树的原理二叉查找树(Binary Search Tree),它是特殊的二叉树:对于二叉树,假设x为二叉树中的任意一个结点,x节点包含关键字key,节点x的key值记为key[x]。如果y是x的左子树中的一个结点,则key[y] = key[x]。那么,这棵树就是二叉查找树。如下图所示:在二叉查找树中:1、若任意节点的左子树不空,则左子树上所有结点的值均小于它的原创 2015-01-07 13:43:44 · 2034 阅读 · 0 评论 -
排序算法(六)- 归并排序
一、归并排序的介绍将两个的有序数列合并成一个有序数列,我们称之为"归并"。归并排序(Merge Sort)就是利用归并思想对数列进行排序。根据具体的实现,归并排序包括"从上往下"和"从下往上"2种方式。1. 从下往上的归并排序:将待排序的数列分成若干个长度为1的子数列,然后将这些数列两两合并;得到若干个长度为2的有序数列,再将这些数列两两合并;得到若干个长度为4的有序数列,再将它们两两原创 2015-01-27 15:48:05 · 559 阅读 · 0 评论 -
图结构(三)- 邻接表无向图
一、邻接表无向图的介绍邻接表无向图是指通过邻接表表示的无向图。上面的图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)包含的链表所包原创 2015-01-27 16:19:11 · 2250 阅读 · 0 评论 -
图结构(五)- 邻接表有向图
一、邻接表有向图的介绍邻接表有向图是指通过邻接表表示的有向图。上面的图G2包含了"A,B,C,D,E,F,G"共7个顶点,而且包含了",,,,,,,,"共9条边。上图右边的矩阵是G2在内存中的邻接表示意图。每一个顶点都包含一条链表,该链表记录了"该顶点所对应的出边的另一个顶点的序号"。例如,第1个顶点(顶点B)包含的链表所包含的节点的数据分别是"2,4,5";而这"2,4,5"分别原创 2015-01-27 18:03:48 · 3314 阅读 · 0 评论 -
图结构(六)- 深度优先搜索与广度优先搜索
一、深度优先搜索的图文介绍1. 深度优先搜索介绍图的深度优先搜索(Depth First Search),和树的先序遍历比较类似。 它的思想:假设初始状态是图中所有顶点均未被访问,则从某个顶点v出发,首先访问该顶点,然后依次从它的各个未被访问的邻接点出发深度优先搜索遍历图,直至图中所有和v有路径相通的顶点都被访问到。 若此时尚有其他顶点未被访问到,则另选一个未被访问的顶点作起始点,重复原创 2015-01-27 18:59:01 · 514 阅读 · 0 评论 -
排序算法(五)- 选择排序
一、选择排序介绍选择排序(Selection sort)是一种简单直观的排序算法。它的基本思想是:首先在未排序的数列中找到最小(or最大)元素,然后将其存放到数列的起始位置;接着,再从剩余未排序的元素中继续寻找最小(or最大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。二、选择排序图文说明选择排序代码:/* * 选择排序 * * 参数说明: *原创 2015-01-27 14:33:54 · 565 阅读 · 0 评论 -
线性结构(二) - 栈的原理与实现
注意:本文所说的栈是数据结构中的栈,而不是内存模型中栈。一、栈的介绍栈(stack),是一种线性存储结构,它有以下几个特点:1、栈中数据是按照"后进先出(LIFO, Last In First Out)"方式进出栈的。2、向栈中添加/删除数据时,只能从栈顶进行操作。栈通常包括的三种操作:push、peek、pop。push -- 向栈中添加元素。peek --原创 2015-01-06 21:44:41 · 510 阅读 · 0 评论 -
图结构(八)- Prim算法
一、普里姆算法介绍普里姆(Prim)算法,是用来求加权连通图的最小生成树的算法。 基本思想 对于图G而言,V是所有顶点的集合;现在,设置两个新的集合U和T,其中U用于存放G的最小生成树中的顶点,T存放G的最小生成树中的边。 从所有uЄU,vЄ(V-U) (V-U表示出去U的所有顶点)的边中选取权值最小的边(u, v),将顶点v加入集合U中,将边(u, v)加入集合T中,如此不断重复,原创 2015-01-27 20:16:47 · 508 阅读 · 0 评论 -
排序算法(四)- 希尔排序
一、希尔排序介绍希尔排序(Shell Sort)是插入排序的一种,它是针对直接插入排序算法的改进。该方法又称缩小增量排序,因DL.Shell于1959年提出而得名。希尔排序实质上是一种分组插入方法。它的基本思想是:对于n个待排序的数列,取一个小于n的整数gap(gap被称为步长)将待排序元素分成若干个组子序列,所有距离为gap的倍数的记录放在同一个组中;然后,对各组内的元素进行直接插入排序原创 2015-01-27 14:14:43 · 1350 阅读 · 1 评论 -
图结构(四)- 邻接矩阵有向图
一、邻接矩阵有向图的介绍邻接矩阵有向图是指通过邻接矩阵表示的有向图。上面的图G2包含了"A,B,C,D,E,F,G"共7个顶点,而且包含了",,,,,,,,"共9条边。上图右边的矩阵是G2在内存中的邻接矩阵示意图。A[i][j]=1表示第i个顶点到第j个顶点是一条边,A[i][j]=0则表示不是一条边;而A[i][j]表示的是第i行第j列的值;例如,A[1,2]=1,表示第原创 2015-01-27 16:33:26 · 1840 阅读 · 0 评论 -
排序算法(二)- 快速排序
一、快速排序介绍快速排序(Quick Sort)使用分治法策略。它的基本思想是:选择一个基准数,通过一趟排序将要排序的数据分割成独立的两部分;其中一部分的所有数据都比另外一部分的所有数据都要小。然后,再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。快速排序流程:(1) 从数列中挑出一个基准值。(2) 将所有比基准值小的摆放在基准原创 2015-01-23 06:30:17 · 446 阅读 · 0 评论
分享