数据结构&算法
goodluckwhh
这个作者很懒,什么都没留下…
展开
-
链表常见的问题
关于单链表,常见的两个问题是 1.怎么判断一个单链表中是否存在循环,即出现如下情形 2.如何判断两个单链表是否交叉,即出现如下情形 一、 第一个问题,如何判断单链表中是否存在循环(并找出循环起点)先来比较下遍历没有循环的单链表和遍历有循环的单链表时的区别:遍历没有循环的单链表:所有结点均只出现一次遍历包含循环的单链表原创 2012-12-18 21:37:02 · 3436 阅读 · 0 评论 -
斐波那契堆
斐波那契堆同二项堆一样,也是一种可合并堆。相对于二项堆,斐波那契堆的优势在于如果不涉及删除元素的操作,则它的平摊运行时间为O(1)。但是由于其算法过于复杂, 因而实际上更多的是用二项堆。一、定义一个斐波那契堆具有如下性质:堆有一组有序树组成,但是堆中的树不一定是二项树斐波那契堆中的树之间是无序的(二项堆中的树是按照其包含的二项树的度数排序的)堆中每个节点的数据结构包含如下域:原创 2013-10-28 21:52:05 · 5647 阅读 · 1 评论 -
二项堆
一、二项树二项树是一种通过递归定义的有序树,其定义如下:度数为0的二项树只包含一个结点度数为k的二项树有一个根结点,根结点下有 个子女,每个子女分别是度数为k-1,k-2,…,0的二项树的根也可以按照如下定义:度数为0的二项树只包含一个结点度为k的二项树由两棵度为k-1的二项树通过连接而组成,其连接方式是:其中一棵树的根成为另一棵树的最左边的孩子。 二项树Bk具有如原创 2013-10-21 20:46:37 · 5384 阅读 · 1 评论 -
B树
B树是另一种平衡查找树,它与AVL树以及红黑树的区别在于,它的一个节点可以由多个子女,由于B树中每个节点子女比ALV树和红黑树多,因而它的高度要比这种两种树更低,不过数量级仍为O(logn)。B树中一个节点的关键字将该节点所处理的关键字域划分成了多个子域,如果一个节点有x个关键字,则它有x+1个孩子。下图即为一棵B树:一、B树的基本性质B树是一种平衡的多路查找树,一棵B树,或者原创 2013-10-20 11:45:38 · 1094 阅读 · 0 评论 -
红黑树之一(基本性质,插入节点)
平衡二叉树(AVL)是一种具有很好的性能的排序二叉树,但是也并不完美。如果所需要维护数据变化也比较频繁,这就需要经常对ALV树进行调整,由于平衡二叉树对其子树的限制太严格,因而进行插入或者删除时经常需要对树进行调整,而且插入时需要调整的子树可能就是树本身,这就需要较长的时间来查找需要调整的子树的根节点;而对于删除操作情况可能更糟,极端情况下,甚至需要递归的对每层进行调整一直调整到根节点。比如:原创 2013-10-14 21:36:23 · 5981 阅读 · 1 评论 -
平衡二叉树之一(基本性质、查询、添加)
平衡二叉树(Balanced BinaryTree)又被称为AVL树。它具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。平衡二叉树的高度为O(logn)。平衡二叉树一般是一个有序树,由于其高度为O(logn),因此可以得到很好的添加、删除、查询效率,即O(logn)。平衡二叉树具有二叉树的所有性子,其遍历操作和二叉树的遍历操作相同。原创 2013-09-14 22:17:12 · 7228 阅读 · 0 评论 -
平衡二叉树之二(删除节点)
类似于添加操作,从平衡二叉树中删除节点也分为两步,第一步完成节点的删除,第二步找到因为删除而导致不满足平衡二叉树要求的子树并对其进行调整。一、 删除节点从平衡二叉树中删除节点更为复杂。首先第一步需要找到要删除的节点x,并分情况进行处理:如果要删除的节点为叶子节点,就找到了要删除的节点如果要删除的节点为只有一棵子树的节点就找到了要删除的节点如果要删除的节点既有左子树,又有右子树,原创 2013-09-17 20:38:00 · 26224 阅读 · 17 评论 -
二叉树
二叉树是一种比较常见的树,其加在树上的限制是树的度为2。每个节点的两棵子树分别为其左子树和右子树。一、基本概念1.1 二叉树的性质二叉树的度为2,它具有如下性质:一棵非空二叉树的第i 层上最多有2i-1 个节点(i≥1)一棵深度为k 的二叉树中,最多具有2k-1 个节点对于一棵非空的二叉树,如果叶子节点数为n0,度数为2 的节点数为n2,则有:n0=n2+1。证原创 2013-09-14 13:42:22 · 1487 阅读 · 0 评论 -
排序和查找-线性排序算法和查找特定值
一、排序算法的时间下界常用排序算法中的冒泡排序、选择排序、插入排序等排序算法都是基于比较的。对于基于比较的排序算法,其时间下界为Ω(nlgn).用决策树模型可以证明该结论。基于比较的排序算法的每一次排序都可以看做是一次决策,决策的结果是比较的两个值是大于或者小于等于。考虑三个元素的排序,以下标表示每个元素,我们可以构造如下的决策树:图中的每个非页节点表示要比较的两个元素的下标,原创 2013-09-01 12:03:43 · 2480 阅读 · 0 评论 -
哈希表
链表的插入和删除效率比较好,但是查找的效率较低,而数组的插入和删除效率较低,但是有很好的查找效率,很自然的想到能否将二者结合起来以得到很好的插入、删除以及查找效率。这种方法就是哈希表。一、基本概念哈希表又叫散列表。它的原理是通过一个哈希函数和一种处理冲突的方法将一组关键字映射到一个有限的连续的地址集上(即数组上)。关键字被当做选定的函数函数的输入,哈希函数的输出结果被用来索引该关键字对应的原创 2013-09-11 22:23:09 · 2038 阅读 · 0 评论 -
常用排序算法
排序是程序设计中的一种重要操作,它的功能是将一个数据元素(或记录)的任意序列,重新排列成一个关键字有序的序列。一、基本概念1.稳定性对序列中存在的任意的两个相等的数据元素A和B,如果A在B之前,在用某个排序算法排序后,A仍然在B之前,则就称该排序算法是稳定的;否则,就称该排序算法是不稳定的。不稳定排序算法可能会更改相等数据元素的相对次序,但是稳定排序算法从来不会更改相等数据元素原创 2013-02-07 15:54:03 · 1153 阅读 · 0 评论 -
写在开篇
毕业几年了,一直都想写点什么,这么做有几个目的:1.做总结:希望通过书写将自己学过、做过的东西系统化2.做备忘:每天要做的事情太多,时间长了,难免遗忘,记录下来就可以随时查看,可以当作自己的一个小工具3.做分享:工作几年,有一个深深的感触就是有时候自己觉得理解了、掌握了的东西实际上自己并没有真正的理解、掌握,而如果可以向同事、朋友描述一遍,就会发现很多自己没有理解透的东西,一旦能够将这原创 2012-12-12 23:03:47 · 942 阅读 · 0 评论 -
数组和字符串
本文仅作备忘。。。数组和字符串都是线性表。一、数组一维数组即为采用顺序存储映像的线性表,其大小固定。二维数组可以看做:它的每个数据元素也是一个定长线性表的定长线性表。N维数组一次类推。约定N维数组array[n1][n2]…[nN]中,n1指第一维,n2指第二维,…nn为第N维。 由于数组各个维度的长度都固定,因而N维数组中任意一个元素的存储位置可以表示为:Lo原创 2013-01-13 11:37:04 · 831 阅读 · 0 评论 -
线性表基础
线性表是最常用最简单的一种数据结构。它是n个元素的有序序列。其中的元素可能是一个数值,也可能是一个由若干数值组成的结构,也可能是其它任意的结构。 一、线性表的特点线性结构的特点是:在数据元素的非空有限集中存在唯一一个被称为“第一个”的数据元素;存在唯一的一个被称为“最后一个”的数据元素除第一个元素之外,集合中每个数据元素均只有一个前驱(循环链表是特例)除最后一个元素之外,集合中原创 2012-12-16 21:44:57 · 1603 阅读 · 1 评论 -
栈和队列
栈和队列是两种很常见很有用的线性表。它们是在线性表上添加了限制后的特殊线性表。一、栈1.栈的定义栈是只能在表尾添加和删除元素的线性表。在栈中,表尾元素称为栈顶,表头元素称为栈尾。不含元素的栈为空栈。由于只能在栈顶添加和删除,因此最后被添加进栈的元素必定最先被删除,因此栈具有“后进先出”即LIFO(last in firstout)的特性。2.栈的基本操作栈的基本操作包括创建原创 2012-12-26 20:04:05 · 773 阅读 · 0 评论 -
红黑树之二(删除节点)
红黑树的另一个重要的操作是删除节点,它也可以分为两步:找到要删除的节点,并删除它对树进行调整使得树满足红黑树的要求一、删除节点从排序树中删除节点的思路是一样的,首先找到要删除的节点,并做如下处理:如果该节点不存在非空子节点,则直接删除它如果该节点存在一个非空子节点,则用其非空子节点替换其位置即可如果该节点有两个非空子节点,则可以找到该节点的前驱或者后继,然后更换原创 2013-10-15 21:50:08 · 12817 阅读 · 4 评论