
数据结构
一只荣
武汉大学在校生
展开
-
排序——冒泡排序
基本思想: 首先,在R[1]~R[n]范围内,依次比较两个相邻元素的排序码,若R[i]较大,则交换R[i]和R[i+1],否则就不交换(i=1,2,...),经过这样一遍处理(称为一趟冒泡),就把R[1]到R[n]中排序码最大的元素换到了R[n]中;然后,在R[1]~R[n-1]范围内,再进行一趟冒泡,将该范围内最大的元素换到R[n-1];依次进行下去,最多只需要进行N-1趟冒泡。如果在某趟...原创 2018-03-15 15:07:29 · 647 阅读 · 0 评论 -
背包问题
实例问题: 当物品件数为4,每件物品的质量分别为11、8、19和6,背包容量为29时,描述问题求解过程的状态树如图所示,图中每个结点只标注了代表当前放入背包中的物品总质量,没有标注当前背包的剩余容量。这个背包问题的最优解是x[1]=0,x[2]=1,x[3]=1,x[4]=0。它表示放入背包的是第2件和第3件物品,背包中物品总质量是27。代码:const int n=4; /...原创 2018-03-25 18:30:54 · 899 阅读 · 0 评论 -
单源最短路径-迪杰斯拉特算法
思路: 在网络中,从某个顶点Vx出发到达另外一个顶点Vi,往往有多条路径,其中,边的权值之和最小的路径称为最短路径,并称Vx为这条最短路径的源点,Vi为终点。 显然,边最少的路径不一定是最短路径。 求网络中从指定源点到其余各顶点的最短路径的问题,通常称为单源最短路径问题。迪杰斯拉特方法: 当n个顶点的有向网络和源点都给定以后,如何求得该源点到其余各顶点的最短路径? 迪...原创 2018-03-26 12:34:16 · 1014 阅读 · 0 评论 -
关键路径求法
关键路径概念: 在无回路的有向网络中,假设只有一个入度为0的顶点(称为源点)和一个出度为0的顶点(称为汇点),则从源点到汇点之间的最长的路径称为关键路径。AOE网: 无回路有向网络可以用来表示一个包含多项活动的工程计划:有向边表示一项活动,边上的权表示完成这项活动需要的时间;顶点表示"所有入边代表的活动已完成,出边代表的活动可以开始"这样一种状态或者事件,其中源点表示工程的开始,汇...原创 2018-03-26 13:15:05 · 32843 阅读 · 5 评论 -
平衡二叉搜索树
1、平衡二叉树的性质 --平衡二叉搜索树是一种具有平衡性质的二叉搜索树: 平衡二叉搜索树中,任何一个节点的左、右子树高度相差不超过1 --平衡因子: 平衡二叉搜索树中,每个结点的平衡因子定义为该节点的左子树的高度减去右子树的高度 --平衡二叉搜索树的插入过程: a.插入 b.平衡 c.重组 --插入步骤:...原创 2018-03-31 21:27:15 · 302 阅读 · 0 评论 -
关于表达式(中缀表达式,后缀表达式)
后缀表达式的求值过程:从左到右逐个扫描后缀表达式中的每个字符,对所遇到的字符作如下处理: a.遇到操作符,进栈 b.遇到运算符,从栈中弹出两个操作数,执行该运算符规定的运算,将结果进栈 c.遇到表达式结束符#,弹出栈顶元素,结束处理过程代码:#include<iostream.h>#include"seqstack.h"class Calculator{ pu...原创 2018-03-21 22:40:32 · 215 阅读 · 0 评论 -
搜索——基本概念
关键字:用来标识一个数据元素的某个数据项主关键字:可以唯一标识一个数据元素的关键字次关键字:不能唯一标识一个数据元素的关键字搜索成功:在数据结构中找到了关键字值等于给定值的元素搜索失败:在数据结构中找不到关键字值等于给定值的元素平均搜索长度:搜索过程中关键字值之间的平均比较次数内搜索:元素全在内存,搜索过程只用到内存的搜索方法外搜索:内外存并用的搜索方法静态搜索:无论搜索结果如何,数据结构状态保持...原创 2018-03-28 13:55:34 · 828 阅读 · 0 评论 -
搜索——一些搜索方法
1、顺序搜索 ---无序表的顺序搜索:从前往后(从后往前)逐个比较;可以在顺序表上实现,也可以在链表上实现。for (i=0; i<n; i++) if(L[i]==x) return Success; //搜索成功 return NotPresent; ...原创 2018-03-28 14:24:24 · 900 阅读 · 0 评论 -
搜索——搜索树
1、二叉搜索树 ---性质:每个结点的关键字,都大于其左子树中所有结点的关键字,而小于其右子树所有结点的关键字。 (若中序遍历一棵二叉搜索树,将得到一个以关键字值递增排列的有序序列) ---搜索: 比较待搜索元素关键字x与根结点关键字;若x较小,进入左子树搜索;若x较大进入右子树搜索。 BTNode<T> *p=root; while ...原创 2018-03-28 15:08:22 · 239 阅读 · 0 评论 -
堆和优先权队列
堆: 最小堆--一个大小为n的最小堆是一棵包含n个结点的顺序存储的完全二叉树,该二叉树中每个结点的关键字值大于等于其双亲结点的关键字值。 完全二叉树的根称为堆顶,它的关键字值是整颗二叉树上最小的。 最大堆--类似定义。如何将一棵顺序存储的完全二叉树调整成...原创 2019-01-17 10:44:59 · 177 阅读 · 0 评论 -
最小代价生成树构造算法
prim方法: 首先,从n个顶点中任选一个顶点Vx加入到原来为空的生成树中; 然后,重复执行以下操作:从一个顶点在生成树中,而另一个顶点不在生成树中的那些边中,选取一条权值最小的边,并将这些边以及它所关联的目前还不在生成树中的那个顶点加入到生成树中。 当生成树中的顶点达到n时,整个构造过程结束。 ...原创 2019-01-17 10:45:10 · 1493 阅读 · 1 评论 -
哈夫曼树和哈夫曼算法
1、最优二叉树 具有最小加权路径长度的二叉树2、哈夫曼算法 由哈夫曼给出,用于构造最优二叉树的算法3、哈夫曼树 用哈夫曼算法构造的最优二叉树4、哈夫曼算法 很熟,所以就略了5、函数CreateHfmTree的步骤: -首先,构造n棵哈夫曼树的对象,每棵树只有一个权值为w[i]的根节点,且该对象的weight为w[i],将它们逐一加入优先权队列。 -从优先权队列中...原创 2018-03-25 18:26:49 · 1280 阅读 · 0 评论 -
堆和优先权队列
堆 1、最小堆 一个大小为n的最小堆是一棵包含n个结点的顺序存储的完全二叉树,该二叉树中每个结点的关键字值大于等于其双亲结点的关键字值。 完全二叉树的根称为堆顶,它的关键字值是整棵二叉树上最小的。 2、最大堆 类似定义 3、如何将一颗顺序存储的完全二叉树调整为最小堆? 从最后一个分支结点开始,逐个调整以每个分支结点为根的完全二叉树中结点的值...原创 2018-03-25 13:24:38 · 258 阅读 · 0 评论 -
排序——快速排序
基本思想:首先,从R[1]~R[n]中任取一个元素,以该元素的排序码为标准把n个元素分成左右两组,即左边一组中所有元素的排序码都不大于标准元素的排序码,右边一组中所有元素的排序码都不小于标准元素的排序码,并将该标准元素放到这两组的中间;然后,用同样的方法分别对这两组元素进行分组,如此反复进行,直到所有元素都被放到正确位置为止。一次分组过程: 用第一个元素为...原创 2018-03-15 16:33:38 · 210 阅读 · 0 评论 -
图——图的遍历
图的两种表示方法:1、图的邻接矩阵2、图的邻接表图的两种遍历方法:1、深度优先搜索: 访问顶点v,并对v做已访问标记;依次从v的未访问的邻接点出发,对图进行深度优先搜索 (图中所有顶点,以及在遍历时经过的边(即从已访问的顶点到达未访问的顶点的边)构成的子图,称为图的深度优先搜索生成树)(或生成森林) 代码:template<class T>void ExtLGrap...原创 2018-03-16 22:09:25 · 194 阅读 · 0 评论 -
排序——基本概念
排序:将线性表中的元素按关键字从小到大(或从大到小)的顺序重新排列的过程。内排序:元素的个数不多,排序过程中只用到了内存。外排序:元素的个数很多,排序过程中需要内外存并用。排序码:作为排序依据的关键字,通常是次关键字 在线性表中可能存在多个排序码相同的元素,如果排序前后这些元素的相对位置有可能被改变,则称这种排序方法是不稳定的排序;否则就是稳定的排序。内排序的过程一般都涉及到排序码的比较和元素的移...原创 2018-03-11 15:44:28 · 300 阅读 · 0 评论 -
排序——简单选择排序
基本思想: 首先,在R[1]-R[n]中选出排序码最小的元素,将它与R[1]交换位置;然后,在R[2]-R[n]中选出排序码最小的元素,将它与R[2]交换位置;依次做下去,在进行了n-1次选择后排序过程结束。图示: 代码:void selectsort() { int i,j,k; for(...原创 2018-03-11 16:12:26 · 131 阅读 · 0 评论 -
排序——直接插入排序
基本思想: 首先,将R[1]看成是一个有序表,将R[2]插入其中,得到一个两个元素的有序表;然后,将R[3]插入其中,得到一个三个元素的有序表;依次进行下去,直到有序表的长度等于n为止。图示: 代码:void insertsort() { int i,j; for(i=2;i<=n;i++) ...原创 2018-03-11 16:54:04 · 105 阅读 · 0 评论 -
图——拓扑排序
思想:1、任选一个入度为0的点,并输出之2、从图中删除该顶点及其所有的边3、重复步骤1、2,直到所有顶点都已输出,或者直到剩下的图中再也没有入度为0的顶点为止,后者表示图中包含有有向回路。数据结构:1、采用邻接表表示图2、InDegree[i],保存顶点i的入度3、数组order保存所求得的一个拓扑序列算法步骤:1、计算每个顶点的入度,存于InDegree数组中2、检查InDegree数组中顶点的...原创 2018-03-17 16:53:51 · 360 阅读 · 0 评论 -
图——prim算法
用途:构造无向连通网络最小代价生成树步骤: 首先,从n个顶点中任选一个顶点Vx加入到原来为空的生成树中;然后,重复执行以下操作:从一个顶点在生成树中,而另一个顶点不在生成树的那些边中,选取一条权值最小的边,并将这条边以及它所关联的目前还不在生成树中的那个顶点加入生成树中。 当生成树中的顶点数达到n时,整个构造过程结束。三个辅助数组的作用:1、mark数组标记顶点是否已进入生成树vi未进...原创 2018-03-17 23:08:34 · 546 阅读 · 0 评论 -
树和二叉树的遍历
前序遍历(VLR): a)访问根节点 b)前序遍历左子树 c)前序遍历右子树中序遍历(LVR): a)中序遍历左子树 b)访问根节点 c)中序遍历右子树后序遍历(LRV): a)后序遍历左子树 b)后序遍历右子树 c)访问根节点层次遍历: 若二叉树为空,则空操作;否则,从上到下,同一层从左往右,访问二叉树上的节点。...原创 2018-03-24 14:32:02 · 151 阅读 · 0 评论 -
树和森林
树和森林的存储表示: 1、孩子兄弟链表示法 2、双亲表示法---孩子兄弟链表示法 ---双亲表示法 树的遍历: 1、前序遍历访问根节点从左往右前序遍历根的每一个子树 2、后序遍历从左往右后序遍历根的每一个子树访问根节点 3、层次遍历 从上往下,同一层从左往右遍历森林的遍历: 加入一个虚结点,作为各棵树的根;遍历这棵树;删去虚结点...原创 2018-03-24 15:21:46 · 445 阅读 · 0 评论 -
排序——归并排序
基本思想: 首先,将R[1]~R[n]看成n个长度为1的有序表,将相邻的有序表成对归并,得到n/2个长度为2的有序表;然后,再将这些有序表成对归并,得到n/4个长度为4的有序表,如此反复进行下去,得到一个长度为n的有序表。 (与前面介绍的几种排序方法不同,归并排序需要用到一个和R同类型的辅助数组S)算法关键步骤: 1、定义两组归并算法 merge(list R,li...原创 2018-03-20 22:34:26 · 528 阅读 · 0 评论 -
字典树的建立
struct node { int count; node* tire[26];}* a;void init() { a = new node(); for (int i = 0; i < 26; i++) { a->tire[i] = NULL; }}void insert(char str[]) { int len = 0 , cur = 0; n...原创 2019-06-28 19:44:36 · 275 阅读 · 0 评论