数据结构
文章平均质量分 65
菜鸟三号的修仙房
大学生毕设
分享知识,增长见识,需要安装包,私发我邮箱
展开
-
关于KMP算法中next和nextval的算法思路
一,关于next的求法就是比较从0到当前值减一是否有相同值(即正着看和倒着看对比),最后结果加一。直接上图:求abaabc的next值和aabaabaabaac的next值留一个小问题可以自己试着做一下,串“ababaaababaa”的next值为011234223456。二,关于nextval的求法nextval根据next值求,如果x位置和next[x]的字符相同,则nextval[x]=nextval[next[x]],否则nextval[x]=next[x](或.原创 2020-06-23 22:50:06 · 1620 阅读 · 0 评论 -
哈夫曼编码 :: 如何求出一串字符集各个字符对应的哈夫曼编码
只要会构造哈夫曼树,哈夫曼编码特别简单,一眼就能看出来。首先看下面题目已知字符集{ a, b, c, d, e, f },若各字符出现的次数分别为{ 6, 3, 8, 2, 10, 4 },则对应字符集中各字符的哈夫曼编码可能是:A,00, 1011, 01, 1010, 11, 100B,00, 100, 110, 000, 0010, 01C,10, 1011, 11, 0011, 00, 010D,0011, 10, 11, 0010, 01, 000答案:A解题步原创 2020-06-19 21:39:02 · 34991 阅读 · 10 评论 -
入门四种算法思想之一——贪心算法
首先我们应该知道,贪心算法和分治算法、回溯算法、动态规划四种算法。只能说是几种是算法思想,而并不是具体的算法,我们学会他们的目的是来指导我们设计具体的算法和编码等。 贪心算法,又称为贪婪法,即在对问题进行求解时,总是考虑当前情况下的最优解(如同人一样,在面对一些情况时,总是选择当前情况的最优解),而不是全局考虑下的最优解。 这种方法就是将整个事件分为若干个步骤,每一个步骤都按照贪心的策略,选取当前情况下的最优的选择(局部最优),然后希望这所有最优解堆叠出来的结果也是最优解。...原创 2020-06-07 22:19:23 · 454 阅读 · 0 评论 -
递归算法——三行代码的魅力
递归函数的运行过程类似于多个函数的嵌套调用,只是调用函数和被调用函数同一个函数的函数(类似于套娃)在程序中可以看作:从主函数中先调用递归函数,进入第一层; 在递归函数(第一层)中再调用递归函数,进入第二层; 。。。。。。。; 在递归函数(第n层)中再调用递归函数,进入第n+1层; 当第n+1层有结果时,将结果再返回到第n层; 然后一直再往下返回返回到第一层,结果返回到主函数中。 再比如生活中排队的问题,当你不知道你前面排了几个人的时候怎么办?假设你是第n个人,那么原创 2020-06-05 22:50:18 · 286 阅读 · 0 评论 -
图的广度优先搜索详解
广度优先搜索类似于树的按层次遍历的过程遍历过程分析从图中某个顶点v出发,访问v。 依次访问v的各个未曾访问过的邻接点。 分别从这些邻接点出发依次访问它们的邻接点,并使“先访问的顶点的邻接点”先于“后被访问的顶点的邻接点”被访问。重复步骤(3),直至图中所有已经被访问的顶点的邻接点都被访问到。如图:从A开始则为A-BC-DEFG-H 从B开始则为B-ADE-CFH-G 从G开始则为G-CF-A-B-DE-H(具体实现过程每层显示先后是按照输入先后,以具体输出为准,这是大致过程)原创 2020-06-04 10:27:17 · 3801 阅读 · 0 评论 -
散列表(哈希表)——数据结构
一,散列表的基本概念直接将元素的储存位置和其关键字之间建立某种直接关系,那么在进行查找时,就无需做比较或做很少次的比较,按照这种关系直接由关键字找到相应的记录,这就是散列表查找法的思想。它通过对元素关键字值进行某种运算,直接求出元素的地址,即使用关键字到地址的直接转换方法,而不需要反复比较。因此散列查找法又称为杂凑法或散列法散列表中的术语:散列函数和散列地址:在记录的存储位置p和其关键字key之间建立一个确定的对应关系H,使得p=H(key),称这个对应关系H为散列函数,p为散列地址原创 2020-06-03 23:11:51 · 1251 阅读 · 0 评论 -
如何求解关键路径——怎样计算工程所需的最短时间
AOE-网如下:把图中的AOE-网看作一个工程的话,则就需要解决下面两个问题:估算完成整项工程至少需要多少时间 判断哪些活动是影响工程进度的关键分析 整个工程只有一个开始点和一个完成点,所以在正常的情况(无环)下,网中只有一个入度为零的点,称为源点,也只有一个出度为零的点,称为汇点。在整个AOE-网中,一条路径各弧上的权值之和称为该路径的带权路径长度。要估算整项工程完成的最短时间,就是要找一条从源点到汇点的带权路径最长的路径,称为关键路径。关键路径上的活动叫做关键活动,这些活动是...原创 2020-06-02 22:22:29 · 17505 阅读 · 2 评论 -
汉诺塔——我其实还在第一层
汉诺塔问题描述假设有3个分别命名为A,B,C的塔座,在塔座A上插有n个直径大小各不相同,依小从大编号为1,2,........,n的圆盘。现要求将塔座A上的n个圆盘移至塔座C上,并仍按同样的顺序叠排,圆盘移动时必须遵守下列规则:每次只能移动一个圆盘; 圆盘可以插在A,B和C中的任一塔座上; 任何时候都不能将一个较大的圆盘压在较小圆盘上;三个圆盘移动方法所有的移动方法都是按照上图进行移动的可以把上面看成七步,无论有多少圆盘,都是按照这七步进行。(等于实际代码3步实现的分解方法)下原创 2020-05-31 12:49:29 · 404 阅读 · 0 评论 -
线性表的查找——二分查找(折半查找)
一,可以使用二分查找的要求线性表必须采用顺序存储结构 表中元素按关键字有序排列二,查找的过程从表的中间记录开始,如果查找值与中间记录的关键字相等,则查找成功; 如果查找值大于或小于中间记录的关键字,则在表中大于或小于中间记录的那一半中查找; 重复上面步骤,直到查找成功,或者表中无查找值,则返回错误。三,算法步骤定义新的low,high。并将low赋值为0,high赋值为表长 当low小于high时,循环执行下面操作 mid取low和high的中间值,此时有三种方法:mid..原创 2020-05-30 23:19:01 · 3319 阅读 · 0 评论 -
关于队列的链表实现形式
表示形式队列的链表形式与单链表类似,只不过多了两个结点来保存首位结点一,关于链栈的结构体表示结构体定义第一种定义方法struct Node{ int data; //数据域 Node *front; //头 Node *rear; //尾 Node *next; //下一个};第二种定义方法struct Node{ int data; //数据域 Node *n...原创 2020-05-29 20:51:40 · 225 阅读 · 0 评论 -
关于循环队列顺序表示和实现
队列的性质队列满足的基本性质为先进先出,后进后出。eg:生活中类似于排队打饭一样,先排队的先打饭。一,关于顺序栈的结构体表示结构体定义 struct Node{ int data[MaxSize]; //存放队列的数组 int front; //队尾 int rear; //队头};图解:如上图可以得出:判断队...原创 2020-05-29 14:19:33 · 282 阅读 · 0 评论 -
关于链栈的代码编写(我竟然忘了单链表的编写)
一,链栈的形式链栈是指采用链式存储结构实现的栈。通常用单链表来表示,链栈的结点结构与单链表的结构相同。二,链栈的结构体表示struct Node{ Node *next; //下一结点 int data; //当前结点的数据域};图解:类比单链表可以得出两个性质链栈无上限,只要需要入栈,都可添加进去 链栈判断空的方法就是P是否等于NULL当结构体作为形参时,应该如何定义函数这个地方令我突然不会写单链表了。...原创 2020-05-28 22:25:35 · 218 阅读 · 0 评论 -
关于顺序栈的代码编写即解释
一,关于栈我的理解就是一种具有特殊规定的数组结构的称呼(即先进后出,后进先出)eg:类似于生活中往箱子里面放衣服,如果想从箱子里拿衣服,只能拿最上面的一层,即最后放进去的(后进先出)二,栈的结构体表示结构体定义struct Node{ int NodeNum[MaxSize]; //定义顺序栈大小 int top; //栈顶顺序表位置 int base; //栈底顺...原创 2020-05-27 22:52:11 · 370 阅读 · 0 评论 -
拓扑排序代码实现详解
拓扑排序定义:就是将AOV-网中所有顶点排成一个线性序列,该序列满足:若在AOV-网中顶点A到顶点B有一条路径,则在该线性序列中的顶点A必定在顶点B之前。如图原创 2020-05-25 23:41:45 · 1160 阅读 · 0 评论 -
最短路径:弗洛伊德算法代码编写及解释
弗洛伊德算法求的是每一对顶点之间(n->n)的最短路径,而迪杰斯特拉算法求得是某一点到其它顶点(1->n)的最短路径所以第一种方法就是将迪杰斯特拉算法循环n次。第二种就是直接运用弗洛伊德算法:原图:一,大致过程演示解释这里只说所有顶点经过A点得到的最短路径(可以先看后面关于方法的解释,再来理解这段话)首先A点经过A得到最短路径,显然可知都不变。然后B点经过A点得到最短路径,即将B点与其它点的连线与BA和A到其他点连线相比较, (eg:求AC之间最短路径,将A.原创 2020-05-24 22:26:15 · 861 阅读 · 0 评论 -
最短路径:迪杰斯特拉算法保姆级别详解
一,大致的遍历过程图解及过程讲解先从开始点寻找与其他边连接最小的边1,如下图(a)中,找A点与其它五点中C的距离最短弧; 所以连接AC(因为由图可知B点无入度,所以可忽略不计);2,图(b)将与A点连接的顶点和与C点连接的所有顶点的弧相比较,看谁距离最短, (因为此时D点不直接与A相连,而是通过中间点C,所以此时AD的距离可以看作AC+CD) 所以连接AE。3,图(c)与A点连接的顶点和与C点连接的顶点和E点连接的所有顶点的弧相比较,看谁距离最短,...原创 2020-05-23 18:05:37 · 558 阅读 · 0 评论 -
最小生成树:克鲁斯卡尔算法的构造解释及代码编写
一,大致的遍历过程图解及过程讲解总连通网如右下角所示。从所有权值中找到最小值,若不连通,则添加该边无回路则正确1,如下图(a),先找到最小边AC,加入;2,图(b),找到下一个最小边DF,加入;3,图(c),图(d),按照大小排序,一次找到BE,CF加入;4,图(e),因为有三个边的长度都为5,但是由图可知,当AD或者CD加入时,都会产生回路,而BC正好合适,所以BC加入二,实现方法第一步:构造邻接矩阵,只不过这保存方法与前面不同. 只需要构...原创 2020-05-21 17:41:22 · 1029 阅读 · 0 评论 -
最小生成树:普里姆算法编写及演示
一,大致的遍历过程图解及过程讲解先从某一点开始寻找与其他边连接最小的边1,如下图(b)中,A与其它五点中C的距离最短,所以连接AC;2,图(c)将AC相比较,看谁与剩下点相连距离较短则替代, 如AB=6,CB=5,所以取CB;AE,AF都不相连,而CE,CF都相连所以取AE,AF; 此时比较AC与其它四点连接中距离最短的,所以连接CF;3,图(d)将ACF相比较,看谁与剩下点相连距离较短则其替代, 如AD=5,FD=2,所以取FD;CE=6,FE=6,...原创 2020-05-19 20:25:24 · 1354 阅读 · 0 评论 -
图:十字链表的构造以及遍历
图形样式:十字链表是有向图的另一种链式储存结构,每一条弧有一个结点,每一个顶点也有一个结点邻接表法创建无向图过程:一,输入总顶点数和边数eg:如图所示即为4点,7边。二,依次输入点的信息存入顶点表中,并将每个结点的两个指针域都初始化为NULL(每个点一个名字) (十字链表相对于邻表法,有两个指针域,相当于有两个头结点,相对应两串链表,一串代表入,一串出)eg:如图即可以写为ABCD。三,构造邻接矩阵。依次输入每条弧的两个顶点,确定这两个顶点的...原创 2020-05-18 14:30:25 · 1252 阅读 · 0 评论 -
图:邻接表法创建无向图并深度优先搜索遍历
无向图:代码:#include<iostream>using namespace std;#define pointMax 100struct VtNode //权值信息{ int peace; VtNode *nextVt; int data;};struct PoNode //顶点信息{ char data; VtNode *firstPo;};struct A...原创 2020-05-17 09:22:18 · 3516 阅读 · 5 评论 -
图:邻接矩阵表示法创建无向图并深度优先搜索遍历
无向图表示:代码:#include<iostream>using namespace std;#define pointMax 100#define MaxInt 32767struct AMgroup{ char VTchart[pointMax]; //顶点表 int AMchart[pointMax][pointMax]; //邻接矩阵 int point, vert; ...原创 2020-05-16 23:52:27 · 6112 阅读 · 0 评论 -
简单构造哈夫曼树
哈夫曼树称为最优树,即是一类带权路径长度最短的数图解:结构:主要有四部分,data存数据,left,right指向左右。parent=1代表该结点已经被写入树里面,parent=0代表还没被写进树里面下面一行数如何变成哈夫曼树构造后如下:下图可知每一层从左到右都是增加的;构造函数编写思路:第一步:先定义一个Node类型的数组:Node *a[100]...原创 2020-04-27 23:35:30 · 886 阅读 · 0 评论 -
二叉树的迷幻操作(将数据传入二叉树,二叉树遍历,线索二叉树)
一,二叉树的结构类似与双向链表的前驱后继。结构:中间data存数据,left指向左边,right指向右边(结构就不多讲)二,迷幻的存入一串数字正常不论将数据存入数组还是链表,都是需要几个存入几个;但是树的存入数据要多输入的要比实际存入的数多叶子的两倍。如上图,想要存入7个数据实际就要输入7+4*2=15个数据存入的方法为先存取左边,结束后再右边存取(递归)代...原创 2020-04-26 23:48:58 · 579 阅读 · 0 评论 -
单链表,循环链表以及双向链表的代码编写
单链表一,结点构成struct Node{ int data; Node *next;};data即为本结点存放数据的地方(定义更多变量,一个结点存的值也就更多),next即为指向下一个,eg:Node *head; head->data=5;表示head结点存值为5,head->next=NULL,即表示下一个指向为空。一般头结点的值域...原创 2020-04-25 00:12:33 · 494 阅读 · 0 评论 -
串的模式匹配算法 BF算法/KMP算法(字符串匹配)
BF算法:比较移动的位置,每次都只移动一个位置每次重新比较时,总字符串a[i]中下标i和将要比较字符串b[j]中下标j都会变化i的变化情况,每次都到本次比较开始处的第二位所以i=i-j+1(i现在的位置减去字符串中已经比较了j个字符就等于本次的开始位置,在加一即为第二位)j直接每次过后直接到开头所以j=0.代码:int BF(SString a,SStr...原创 2020-04-21 00:33:48 · 493 阅读 · 0 评论 -
归并排序方法及代码图解
归并排序方法:官方用语:利用归并的思想实现的排序方法,该算法采用经典的分治策略(分治法将问题分成一些小的问题然后递归求解,而治的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。我的理解:先将整段元素分为一半,然后再分为一半,直到每部分都为一,然后再递归反过来一步一步排序。图解加代码解释:分主要思想为递归,先通过不断二分,将整段元素分为了六部分。如下代码,先找到中...原创 2020-04-13 20:03:20 · 853 阅读 · 0 评论 -
冒泡,插入,选择,希尔排序方法代码及图解
冒泡排序方法:第一次先从第一个数据开始,比较相邻的元素,如果第一个比第二个大(或者小)就交换他们两个,一直比较到最后一个数,此时找到了一个最大(或者最小的)的数。然后第二次和第一次方法一样,但是比第一次少比较一个数,以后每次比前一次比较数少一;然后一直到第n-1组。需要对比的次数为n-1次,每次需要对比的数为n-1-i个,中间通过x来交换两值的位置。代码: int ...原创 2020-04-13 17:32:35 · 667 阅读 · 0 评论 -
快速排序代码编写及解释
快速排序代码编写及解释排序方法:(1)先把随便的一个值temp定为一个基点(本篇文章把第一个值定为temp)。(2)然后把整串数字与temp进行比较,比temp小的放在左边,比temp大的放在右边,找到n的位置(2.2)方法:左右开始记为low,high。先从左边找到第一个比temp大的数(low值依次增加)暂停,然后从右边开始找第一个小的数(high值依次减小),交换两个数位置,再从左边...原创 2020-02-27 19:10:06 · 553 阅读 · 0 评论