数据结构与算法
文章平均质量分 91
GuityCrown
额...其实我还是个学生,虽然后面几年是要搞嵌入式android的糙汉子...但是以前搞得比较杂,既有C语言,java这些搞android必备的...也有本专业要用到的各种焊电路板高级技工技能...还有各种汇编,matlab等等...还有本专业方向要搞的模式识别和图像处理...好吧,一个本科的孩子也就是接触得比较多,可是学得都不深入...嗯...以后慢慢学呗...
展开
-
AVL树的插入与删除
AVL树是一种高度平衡的二叉搜索树,其每一个结点的左树高和右树高相差不大于1。这个性质使得AVL树的搜索效率要比普通的二叉搜索树要高,因为对于一组递增的数组,其构成的二叉搜索树会是一个链表,搜索时间复杂度自然就是O(n),而其构成的AVL树则肯定是一个搜索效率为O(lg(n))的二叉树。也正因为此,为了保持其平衡的性质,AVL树的插入和删除要比普通二叉搜索树要复杂。1. 通过旋转保持AVL树的原创 2016-05-25 11:00:23 · 17928 阅读 · 8 评论 -
最大流之Ford-Fulkerson方法详解及实现
最大流问题常常出现在物流配送中,可以规约为以下的图问题。最大流问题中,图中两个顶点之间不能同时存在一对相反方向的边。边上的数字为该条边的容量,即在该条边上流过的量的上限值。最大流问题就是在满足容量限制条件下,使从起点s到终点t的流量达到最大。在介绍解决最大流问题的Ford-Fulkerson方法之前,先介绍一些基本概念。1. 残存网络与增广路径根据图和各条边上的流可以画出原创 2016-06-03 19:33:40 · 36280 阅读 · 6 评论 -
单源最短路径之Dijkstra算法
上一篇博客介绍了适用于任何有向图(即使存在负环路)的Bellman-Ford算法,对图G=(V,E)来说,该算法的时间复杂度为O(VE)。本文介绍时间复杂度为O(v^2)的Dijkstra算法,但只适用于没有负权重边的有向图。基本上所有计算图的最短路径的算法都基于一个性质:一条最短路径的子路径肯定也是一条最短路径。该性质用反证法就可以轻易证明。反过来说,我们有可能基于一条最短路径构造出另一条到原创 2016-06-01 21:54:57 · 9205 阅读 · 0 评论 -
结点对最短路径之Floyd算法原理详解及实现
上两篇博客介绍了计算单源最短路径的Bellman-Ford算法和Dijkstra算法。Bellman-Ford算法适用于任何有向图,即使图中包含负环路,它还能报告此问题。Dijkstra算法运行速度比Bellman-Ford算法要快,但是其要求图中不能包含负权重的边。单源最短路径之Bellman-Ford算法单源最短路径之Dijkstra算法在很多实际问题中,我们需要计算图中所有结原创 2016-06-02 14:08:57 · 15551 阅读 · 0 评论 -
快速排序
1. 划分数组现在有一个目标,将一个给定数组划分成两部分,分立于某一个数的两侧,左侧的数均比该数小,右侧的数均比该数大。partition的过程如下图所示。上图中的数组使用数组的最后一个数16作为划分依据,i 为16最终所在的位置,n为数组当前遍历元素位置。首先,n=0,i=0,因为12然后,n=1,因为23>16,所以 i 不变然后,n=2,因为11原创 2016-05-19 22:46:59 · 504 阅读 · 0 评论 -
单源最短路径之Bellman-Ford算法
今天介绍一种计算单源最短路径的算法Bellman-Ford算法,对于图G=(V,E)来说,该算法的时间复杂度为O(VE),其中V是顶点数,E是边数。Bellman-Ford算法适用于任何有向图,并能报告图中存在负环路(边的权重之和为负数的环路,这使得图中所有经过该环路的路径的长度都可以通过反复行走该环路而使路径长度变小,即没有最短路径)的情况。以后会介绍运行速度更快,但只适用于没有负环路的图中的D原创 2016-06-01 13:19:03 · 4977 阅读 · 0 评论 -
图的最小生成树之Prim算法
图的最小生成树是指一颗连接图中所有顶点,具有权重最小的树,树的权重为所有树边的权重之和。最小生成树可以应用在电路规划中,规划出既能连接各个节点又能使材料最为节省的布局。计算最小生成树有两个经典算法,分别是Kruscal算法和Prim算法。本文将会介绍Prim算法的原理以及实现。Prim算法基于贪心算法设计,其从一个顶点出发,选择这个顶点发出的边中权重最小的一条加入最小生成树中,然后又从当前的树原创 2016-05-31 18:48:14 · 13271 阅读 · 2 评论 -
堆排序
1. 堆堆是一种特殊的二叉树结构,其分为最大堆和最小堆两种。对于最大堆来说,父结点的值一定会比子结点大,最小堆类似。下图为一个简单的最大堆示例,父结点30要比子结点12和22要大,至于两个子结点之间的大小关系则没有要求。如果用一个数组来存储一个堆,那么我们需要知道每个元素对应的结点的父子结点分别是数组中的哪一个元素。用数组表示的堆的结构以及各个结点对应的元素下标如下图所示。原创 2016-05-18 20:22:17 · 497 阅读 · 0 评论 -
归并排序
归并排序是分治思想的一个应用,其将原问题分解成规模比较小的问题求解,然后再组合成原问题的解。在讲解归并排序之前,先要编写一个将两个有序数组合并成一个有序数组的程序。int* merge(int *a1, int *a2, int n1, int n2){ int *result = (int *)malloc(sizeof(int)*(n1 + n2)); int *temp = res原创 2016-05-18 19:51:18 · 494 阅读 · 0 评论 -
图的深度优先搜索及拓扑排序
本文将介绍图的深度优先搜索,并实现基于深度优先搜索的拓扑排序(拓扑排序适用于有向无环图,下面详细介绍)。1. 图的深度优先遍历要解决的问题图的深度优先搜索与树的深度优先搜索类似,但是对图进行深度优先搜索要解决一个问题,那就是顶点的重复访问,假设图中存在一个环路A-B-C-A,那么对顶点A进行展开后得到B,对B进行展开后得到C,然后对C进行展开后得到A,然后A就被重复访问了。。。这显原创 2016-05-30 23:13:42 · 25255 阅读 · 5 评论 -
图的广度优先遍历
图的广度优先遍历与树的宽度优先遍历类似,实现方法也类似。但是相对树,图存在一种特殊情况——环路,环路使得一个已经遍历过的结点,会在其后代结点的子结点中再次被遍历,从而产生多余的读取操作。为了解决这个问题,我们需要为结点设置一个状态以标记其是否已被遍历过。下面是图和结点及相关定义。typedef enum VertexColor{ Vertex_WHITE = 0, // 未被搜索到原创 2016-05-29 00:30:08 · 2249 阅读 · 0 评论 -
B树操作详解
B树是一颗多路的平衡搜索树,其规定树根至少有两个孩子,每个内部节点有两个或以上的孩子。用来衡量B树规模的一个指标是“最小度数”t,其表示B树所有内部节点的孩子数为t~2t个。B树的一个结点有两个存储域,分别是关键字和孩子结点,关键字用于划分孩子节点,一个关键字的左右两侧各有一个孩子。类似于二叉搜索树,一个关键字x的左孩子的关键字值都比x小,右孩子的关键字值都比x大。因此,一个结点的关键字的个数原创 2016-05-27 23:33:30 · 7300 阅读 · 1 评论 -
二叉搜索树
二叉搜索树是一种有序二叉树,通过对其中序遍历,可以得到一组非递减的数据。如下图所示的一颗二叉搜索树,中序遍历后得到的数组是 8、10、11、12、15、18。二叉搜索树的基本性质:左子树在实际编写代码时,定义一个结点的数据结构和一个二叉搜索树的数据结构,以及一些基本方法。typedef struct Node{ int value; int size; struct Nod原创 2016-05-25 23:37:14 · 1502 阅读 · 0 评论 -
红黑树的插入与删除
红黑树(Red Black Tree) 是一种自平衡二叉查找树。红黑树和AVL树类似,都是在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,从而获得较高的查找性能。红黑树可以在O(log n)时间内完成查找,插入和删除操作。二叉搜索树可以看 二叉搜索树AVL树可以看 AVL树的插入与删除1. 红黑树的性质红黑树的自平衡依赖于它的以下性质:性质1. 结点是红原创 2016-05-26 15:09:52 · 9733 阅读 · 1 评论 -
斐波那契堆
本文将要介绍的斐波那契堆是一种保有最小堆性质的“森林集合”。和二叉堆一样,他可以用来实现优先队列,而且比二叉堆在某些操作上有更优的时间复杂度。比如插入操作,二叉堆插入一个结点需要从底向上调整堆结构,因此需要O(lgn)的时间,而斐波那契堆则只需要O(1)的时间。下面将会解析斐波那契堆的各个基本操作及其c/cpp实现代码。下面是一个斐波那契堆的结构示意图。除了插入操作,斐波那契堆总是保持着一个性质:原创 2016-06-08 16:24:36 · 1787 阅读 · 0 评论