数据结构与算法分析(C语言)
Coding365
这个作者很懒,什么都没留下…
展开
-
优先队列之左式堆
1.左式堆的性质我们把任一节点X的零路径长(null path length,NPL)Npl(X)定义为从X到一个没有两个儿子的节点的最短路径的长。因此,具有0个或1个儿子的节点的Npl为0,而Npl(NULL) = -1。左式堆性质是:对于堆中的每一个节点X,左儿子的零路径长至少与右儿子的零路径长一样大。下图左边是左式堆,右边不是。2.左式堆的操作(1)合并原创 2017-06-05 13:10:51 · 551 阅读 · 1 评论 -
B+tree详解及实现(C语言)
1 什么是B+tree如果你还不了解B-tree,那么请自行了解。可以参考我的这篇帖子---B-tree详解及实现。B+tree是B-tree的一个变种:在B-tree的基础上,为叶子节点增加链表指针,而且所有的关键字都在叶子节点中出现,且数据只存储在叶子节点中。非叶子节点的关键字仅作为叶子节点的索引。下图是一棵B+tree。B+tree 的插入和删除基本和B-tree一样,只是多了数据结构多了next字段,所以要注意。原创 2017-08-11 18:01:28 · 21432 阅读 · 13 评论 -
伸展树详解及实现(C语言)
1.什么是伸展树简单的说,伸展树是一棵二叉查找树,对每个节点的访问,都要将该节点通过旋转操作,把它翻转到根处。然后进行操作。下图是访问关键字1的过程(自底向上翻转)。可以看到伸展的效果可以让树的深度变小了,这是伸展树的好处所在。另外,当执行其他操作,如插入和删除,也要先进行类似的伸展。2.自顶向下伸展树前面简单地说明自底向上的伸展方式,下面要详细介绍原创 2017-07-27 10:29:05 · 2729 阅读 · 0 评论 -
栈应用之简易计算器算法的原理及实现(C语言)
1.后缀表达式a * b上面表达式称为中缀表达式,其特点是操作符位于中间位置(仅一个操作符)。a b *上面表达式称为后缀表达式,其特点是操作符位于后面位置(仅一个操作符)。计算器算法的原理是将中缀表达式转换为后缀表达式,然后进行计算。我们在下一章节对中缀转后缀进行介绍。表达式:6*(5+(2+3)*8+3)其后缀表达式为:6 5 2 3 +原创 2017-07-25 17:52:44 · 8711 阅读 · 0 评论 -
红黑树详解
红黑树是具有下列着色性质的二叉查找树:1.每一个节点或者着红色,或者着黑色。2.根是黑色的。3.如果一个节点是红色的,那么它的子节点必须是黑色。4.从一个节点到一个NULL指针的每一条路径必须包含相同数目的黑色节点。下面是一棵红黑树。1.自底向上插入通常把新项作为树叶放到树中。如果我们把该项涂成黑色,那么违反条件4,因为将会建立一条更长的原创 2017-07-22 14:02:01 · 2551 阅读 · 5 评论 -
图论算法之最短路径(有向无权图)
1.算法介绍下图是一个无权图G。使用某个顶点s作为输入参数,我们想要找出从s到所有其他顶点的最短路径。设我们选择s为v2.此时立刻可以说出从s到v2的最短路径长为0的路径。把这个信息做个标记。如下图。现在我们可以开始找寻所有与s距离为1的顶点。这些顶点通过考查与s邻接的那些顶点可以找到。此时我们看到,v0和v5与s出发只有一步之遥。标记如下。原创 2017-06-12 02:40:00 · 2055 阅读 · 0 评论 -
图论算法之最短路径(Dijkstra算法)
1 算法介绍如果图是有向赋权图,那么问题将比无权图困难。Dijkstra算法向无权图最短路径算法一样。按阶段进行。在每一个阶段,Dijkstra算法选择一个顶点v。它在所有未知顶点中具有最小距离的dist,同时算法声明从s到v的最短路径是已知的。阶段的其余更新邻接点的信息。表1表示初始配置。假设开始s是v0。第一个选择的顶点是v0.路径长0.该顶点标记为已知。既原创 2017-06-12 02:34:51 · 581 阅读 · 0 评论 -
图论算法之最短路径(具有负边值的图)
1 算法介绍如果图具有负边值,那么Dijkstra算法行不通。但是把赋权的和无权的算法结合起来将会解决这个问题。开始,我们把s放到队列中。然后,在每个阶段我们让一个顶点出队。找出所有与v邻接的顶点w,使得dw > dv + cvw。然后更新dw和pw,并在w不在队列中的时候把它放到队列中。2 算法实现//// main.c// WeightedNegative///原创 2017-06-12 02:22:57 · 1590 阅读 · 0 评论 -
优先队列之二叉堆
1.优先队列简介1.1模型优先队列是允许至少下列两种操作的数据结构:Insert(插入),它的工作是显而易见的,以及DeleteMin(删除最小者),它的工作是找出、返回和删除优先队列中最小的元素。Insert操作等价于Enqueue(入队),而DeleteMin则是队列中的Dequeue(出队)在优先队列中的等价操作。优先队列的基本模型如下图。1.2 一些简单的实现原创 2017-06-02 01:20:00 · 628 阅读 · 0 评论 -
排序(希尔排序,堆排序,归并排序,快速排序)
1.希尔排序1.1 算法希尔排序(shell-sort)使用一个序列h1,h2,...,ht,叫做增量序列。只要h1 = 1,任何增量序列都是可行的。在使用增量hk的一趟排序之后,对于每一个i都有A[i] ≤ A[i + hk]。所有相隔hk的元素都被排序。此时称文件是hk-排序。直到h1排序完成,排序完成。1.2 增量的序列增量序列的选择极大的影响了希尔算法的效率。原创 2017-06-03 19:48:26 · 827 阅读 · 0 评论 -
排序(冒泡,选择,插入)
1.冒泡排序1.1算法冒泡排序(buddle-sort)算法的运作如下:(从后往前)比较相邻的元素。如果第一个比第二个大,就交换他们两个。对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。针对所有的元素重复以上的步骤,除了最后一个。持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。1.2 实现原创 2017-06-03 19:41:34 · 342 阅读 · 0 评论 -
AVL树
AVL树是带有平衡条件的二叉查找树。主要的一种AVL树是这样一种树:它带有平衡条件,它的每个节点的左子树和右子树的的高度最多相差1。下面左边的树是AVL树,右边不是,因为7的左右子树的高度相差大于1。当一个节点插入破坏了某个点的平衡。我们假设这个点是a。可能有下面有下面四种情况破坏了平衡。1.对a的左儿子的左子树进行一次插入。2.对a的左儿子的右子树进行一次插入。原创 2017-05-29 01:16:01 · 727 阅读 · 0 评论 -
优先队列之二项队列
1 二项队列的结构二项队列不同于我们已经看到的所有优先队列的实现之处在于,一个二项队列不是一棵堆序的树,而是堆序树的集合,成为森林。堆序树的每一棵树都是有约束的形式,叫做二项树。每一个高度至多存在一棵二项树。高度为0的二项树是一棵单节点树;高度为k的二项树Bk通过一棵二项树BK-1附接到另一棵二项树Bk-1的根上而构成。如下图,B0,B1,B2,B3,B4皆为二项树。而它们合起来就是二项队原创 2017-06-05 15:26:11 · 856 阅读 · 0 评论 -
B-tree详解及实现(C语言)
M阶的B-tree是一棵具有下列结构特性的树:(1)树的根或者是一片树叶,或者其儿子树在2到M之间。(2)除根外,所有非树叶节点的儿子数在[M/2]到M之间。(符号[]表示向上取整)(3)所有树叶都在相同的深度上。所有的数据都存储在树叶上。也有把数据存储在内部节点的,但我这里选择前者,内部节点只是用来索引。在每一个内部节点上皆含有指向该节点各个儿子的指针P1,P2.原创 2017-08-05 10:54:08 · 11116 阅读 · 6 评论