
数据结构
数据结构
【JAVA】玩家
Study is to forget...
展开
-
贪心算法求解TSP问题
定义:旅行商问题,即TSP问题(Traveling Salesman Problem)又译为旅行推销员问题、货郎担问题,是数学领域中著名问题之一。假设有一个旅行商人要拜访n个城市,他必须选择所要走的路径,路径的限制是每个城市只能拜访一次,而且最后要回到原来出发的城市。路径的选择目标是要求得的路径路程为所有路径之中的最小值。贪心算法:核心思想就是每次都能得到局部最优的解。值得注意的是,这里没有整体最优。所以,采用贪心算法求解TSP问题,不一定是最短路径.代码如下:#include <stdio.h原创 2021-03-30 00:26:25 · 2441 阅读 · 0 评论 -
递归 -----解决 n皇后 经典问题
递归 -----解决 n皇后 经典问题:n皇后问题是一个经典的递归求解问题。就是在N * N的 二维数组中放置N个皇后,放置的条件不能在同一行,同一列,不能在45度或者135度的同斜线方向。下面设计的算法思路:对每列开始循环,每循环一列,就开始循环查找每一列的所有行,这里有三个数组,s数组存储的是皇后的个数,L数组与R数组是用来标记45度和135度的所在直线的行,数学中 45度的直线定义为 y + x =d 135度的直线定义为 y - x = d ,下面代码程序中将皇后数往后扩一位,这样编号可以原创 2021-03-27 18:42:47 · 633 阅读 · 0 评论 -
数据结构 ------链式串的基本操作
数据结构 ------链式串的基本操作:这里采用串的链式存储结构,在明白了单链表的基本原理基础上,再理解串的链式存储以及相关操作就通俗易懂了。这里要注意的是,p->next:指向第一个字符,刚开始创建的p为头结点,然后需要注意的地方就是这里的 r->next =q; r =q; 这里的意思是将q指针放在r->next的后面,接着r指针移动q指针的位置. 还有一种就是(q->next =r->next,r->next =q;)主要注意 q->next = r-&原创 2021-03-26 22:22:25 · 2489 阅读 · 3 评论 -
迷宫图------DFS , BFS 搜索路径问题。
迷宫:#include <stdio.h>#include <cstdio>#include <cstring>#include <algorithm>#include <malloc.h>#define MAX_SIZE 100#define M 4 // 行数#define N 4 // 列数 int a[50]={0};/*----------------------------以下定义邻接表类型---------原创 2021-03-25 23:17:52 · 430 阅读 · 0 评论 -
字符串匹配 ------- KMP 算法(快速匹配)
字符串匹配 ------- KNP 算法(快速匹配):简介 KMP 算法是 D.E.Knuth、J,H,Morris 和 V.R.Pratt 三位神人共同提出的,称之为 Knuth-Morria-Pratt 算法,简称 KMP 算法。该算法相对于 Brute-Force(暴力)算法有比较大的改进,主要是消除了主串指针的回溯,从而使算法效率有了某种程度的提高。提取加速匹配的信息这种信息就是对于每模式串 t 的每个元素 t j,都存在一个实数 k ,使得模式串 t 开头的 k 个字符(t 0 t 1原创 2021-03-24 20:45:11 · 1004 阅读 · 0 评论 -
字符串的匹配 ----- BF算法
字符串的匹配 ----- BF算法:也称简单匹配算法,算法的思想采用穷举的思想,采用线性的存储结构,这里的匹配思想就是线性匹配。下图为匹配的思路形式,可参照图理解代码如下:#include <stdio.h>#include <string.h>#define max 50typedef struct{ int length; char data[max];}sqstring;//初始化,这里将字符串初始化到结构体数组中 void initstring(原创 2021-03-23 22:46:40 · 162 阅读 · 0 评论 -
二叉排序树(构造 +插入+删除+路径查找)
二叉排序树(构造 +插入+删除+路径查找):二叉排序树的特点:左孩子的关键字小于父亲结点,右孩子的关键字大于父亲结点,然后不停的递归构造,构造过程中,满足以上特点。树的 基本操作 在前面二叉树的介绍中提到,下面直接看程序代码:代码如下:#include <stdio.h>#include <malloc.h>#define max 50typedef struct node{ int data; struct node *lchild,*rchild;}bstn原创 2021-03-23 15:53:37 · 659 阅读 · 0 评论 -
哈希表(线性存储)+ 线性探测法解决哈希冲突
哈希表(线性存储)+ 线性探测法解决哈希冲突原创 2021-03-23 00:08:52 · 3266 阅读 · 0 评论 -
AOE网求关键路径(关键活动)
AOE网求关键路径(关键活动):AOE网求解关键路径,所需的是有向无环图,注意的是,只有一个源点,有一个汇顶点,然后关键路径不一定只有一条。注意,这里要理解:顶点:事件边:活动还有四个数组下面有介绍:代码如下:#include <stdio.h>#include <malloc.h>#define inf 330 #define max 50typedef struct node{ int adjvex; int weight; //权值 struct原创 2021-03-22 12:39:13 · 3108 阅读 · 0 评论 -
有向图的拓扑排序问题 -----邻接表存储
有向图的拓扑排序问题 -----邻接表存储:这里的邻接表存储方式其中在vnnode结构体中加入了count(入度)。在拓扑排序过程中,每次找读入为0的进栈,之后每出栈一个顶点就要循环遍历邻近所有(注意,这里的 所有)有边的顶点,修改对应的读入以及判断是否可以入栈.下面代码以图顶点为例: 方便验证结果。代码如下:#include <stdio.h>#include <malloc.h>#define inf 330 #define max 50typedef st原创 2021-03-21 01:17:06 · 1165 阅读 · 0 评论 -
创建图的邻接表(顺序表+链表)
创建邻接表(顺序表+链表):图的邻接表采用的顺序分配和链式分配的结合,主要包括头结点,图的结构体数组以及链表结点。具体过程代码中理解:代码如下:#include <stdio.h>#include <malloc.h>#define inf 330 #define max 50typedef struct node{ int adjvex; int weight; //权值 struct node *nextarc;}arcnode;//定义结点的结构体类原创 2021-03-20 23:21:34 · 712 阅读 · 0 评论 -
最短路径----狄克斯特拉 (digkstra)+邻接矩阵
最短路径----狄克斯特拉 (digkstra)+邻接矩阵:采用邻接矩阵的存储方式存储。算法主要用到了三个数组:disp[],path和s数组。 disp数组主要是存储最短路径长度,path存储最短路径上当前顶点的前一个顶点,s用来标志顶点是否处理过。其中主要有两步:循环找(找符合条件的顶点),循环改(改顶点对应的disp,path的值),其他细节均在代码中写出,注意的是,算法的动态过程可以优先理解一下,再来理解下面的代码。代码如下:#include <stdio.h>#includ原创 2021-03-20 18:01:21 · 1167 阅读 · 0 评论 -
最小生成树 --------克鲁斯卡尔(kruskal)算法+邻接矩阵
最小生成树 --------克鲁斯卡尔(kruskal)算法+邻接矩阵:这里采用邻接矩阵的存储方式,其中用到了直接插入排序,对边权值进行排序,另外,这里定义的e[]数组是存储每条边的相关信息(边的两端点+权值)算法思想就是找边小的边,将边两端点加入构造结合内,循环找(因为是排好序的),循环从小到大就可以了,遇到连通值相同的顶点,如果他们之间有边值,需要舍弃掉,因为加入到构造集合内会形成回路,我们这里要找的是不能形成回路的。代码如下:#include <stdio.h>#include原创 2021-03-20 15:26:25 · 3526 阅读 · 0 评论 -
最小生成树 -----普里姆(prim)算法+ 邻接矩阵
最小生成树 -----普里姆(prim)算法+ 邻接矩阵:这里采用邻接矩阵的方式存储。prim算法:用两个集合表示,v集合表示选中的顶点,u-v表示待选的顶点的集合。主要是不断的选则两集合之间边值最小的u-v中的顶点。直到顶点全部选完。算法的主要思想是定义了两个数组:lowcost[]:用来表示两个集合之间最小的权值边。 lowset[]:用来 表示最小边对应在v集合里的顶点。代码如下:#include <stdio.h>#include <malloc.h>#defi原创 2021-03-20 01:40:14 · 1238 阅读 · 0 评论 -
中序线索化二叉树+遍历(带头结点)
中序线索化二叉树+遍历(带头结点):思路:创建过程与前序大同小异,主要在遍历过程中,循环遍历结束的条件需要注意一下,然后遍历思想:最左,接着找后继,接着找右子树,然后重新循环。代码如下:#include <stdio.h>#include <malloc.h>#include <string.h>#define maxsize 50typedef char elemtype;typedef struct node{ elemtype data; st原创 2021-03-15 14:02:47 · 1086 阅读 · 1 评论 -
前序线索化二叉树+遍历(带头结点)
前序线索化二叉树+遍历(带头结点):思路:构造线索化 二叉树的时候,注意头结点的处理,以及最后一个结点与头结点的处理,另外一个就是遍历的过程中,while()循环的条件,因为构建的线索树是循环的,双链线性表的结构。 其他主要细节处理均在代码中解释出来了代码如下:#include <stdio.h>#include <malloc.h>#include <string.h>#define maxsize 50typedef char elemtype;typ原创 2021-03-15 13:51:21 · 1005 阅读 · 0 评论 -
采用循环队列解决二叉树的层次遍历
采用循环队列解决二叉树的层次遍历:思路:对成功创建的二叉链树进行层次遍历,这里采用循环队列的思想来解决,主要是从根节点开始,将结点进队(下标rear+1,接着进队),然后(front + 1)将元素出对,此时,对出对结点的左右孩子进行判断,有孩子,将孩子进队,先判断左孩子,再判断右孩子,接下来的操作与之前的一样,将孩子进队,接下来的操作与之前一样。下图红色表示5是将其出对。代码如下:#include <stdio.h>#include <stdio.h>#include原创 2021-03-13 22:20:16 · 1244 阅读 · 1 评论 -
二叉树的构造(前序+中序)---(后序 + 中序)
#include <stdio.h>#include <malloc.h>#include <string.h>#define maxsize 50typedef char elemtype;typedef struct node{ elemtype data; struct node *lchild;//指向左孩子 struct node *rchild;//指向右孩子 }bnode;bnode * precreatebt(char *pre,原创 2021-03-13 18:45:09 · 444 阅读 · 0 评论 -
后序线索化二叉树 +遍历(带头结点)
后序线索二叉树#include <stdio.h>#include <malloc.h>#include <string.h>#define maxsize 50typedef char elemtype;typedef struct node{ elemtype data; struct node *lchild;//指向左孩子 struct node *rchild;//指向右孩子 struct node *parent;//指向双亲结点原创 2021-03-10 22:09:42 · 1209 阅读 · 3 评论 -
二叉树的遍历(递归思想)
二叉树的遍历(递归思想):采用递归的方式遍历二叉树,主要理解递归的思想,就例如拿前序遍历来理解,前序遍历,先遍历父结点,接着遍历左子树,然后遍历右子树,主要还要理解回溯的过程的思想。代码如下:#include <stdio.h>#include <malloc.h>#define maxsize 50typedef char elemtype;typedef struct node{ elemtype data; struct node *lchild;//指向左原创 2021-03-06 20:54:03 · 971 阅读 · 0 评论 -
二叉树的构造以及基本操作
*二叉树的构造以及基本操作:二叉树的构造基本思想:循环遍历一段字符串,遇到"(" 就将父结点入指针栈(数组指针),并将变量k置为1,表示接下来构建的是左子树,遇到",",k值置为2,表示接下来要构建的是右子树,遇到")",表示当前结点左右子树构建完成,将结点出栈。遇到其他的,则创建一个结点指针,并且做相应的赋值操作,每创建的结点要进行定位判断,判断是定位成根结点还是作为左孩子的结点或者作为右孩子的结点。二叉树的销毁思想: //只要当前结点不为空,则先递归销毁左子树,再销毁右子树,最后销毁当前结点本身,最原创 2021-03-06 19:17:00 · 2816 阅读 · 1 评论 -
排序算法-----基数排序(桶排序)
排序算法-----基数排序(桶排序):基数排序(桶排序)的算法思想:划分10个桶,0到9,接着在要寻找的数组中找到最大值,按照最大数位数个数进行分配到各个桶中,在求出每个桶中数的位置,也就是当前桶的数的位置数是前面桶中数的个数的累和,当中的细节在代码中体现。观察此图,根据上述思想,自行变化。代码如下:#include <stdio.h>#include <malloc.h>void radixsort(int *a, int length){ int i,max=原创 2021-03-01 02:11:55 · 218 阅读 · 0 评论 -
排序算法-----归并排序
排序算法-----归并排序:归并排序的算法思想:主要将两个有序数组比较合成一个数组。这里注意,将原数组用递归的思想不断的划分,直到成为只有一个元素的数组(即递归出口)。不断划分的过程中,具体的步骤:创建两个动态的内存空间用于存放划分成左右的元素,然后,合并过程 中进行比较,合并过程可以看成回溯过程,回溯的数组都是有序数组,然后进行有序数组的比较接着合并,然后不断回溯,也就是不断合并的过程。观察下图,根据上述思想,自行理解。代码如下:#include <stdio.h>#include原创 2021-02-28 23:40:34 · 86 阅读 · 0 评论 -
选择排序算法-----堆排序
选择排序算法-----堆排序:堆排序的结构思想就是:先构建(例如大顶堆)然后调整。构建堆,在构建过程中,用到3个变量,root,last,child,其中有两步:比较左右孩子大小,然后将大的值与root比较并且(是否)交换位置。另外,构建完成之后,接着循环将最后一个元素与第一个元素交换位置,然后接着从第一个元素开始,进行调整。观察下图,数字原始排列为 5,7,3,2,4,8,11,6,1根据上述思想,自行变化。代码如下:#include <stdio.h>void adjusthea原创 2021-02-28 19:26:20 · 136 阅读 · 2 评论 -
交换排序算法-----冒泡排序
C语言之冒泡排序:n个数排序,n-1次趟比较,第j趟比较中,有n-j次比较;#include <stdio.h>int main(){ int ch[]={12,25,34,4,6,9,7}; int t; int length=0; length = sizeof(ch)/sizeof(int); //求数组长度 for(int i=0; i<length; i++) for(int j=0; j<length-i; j++) if(ch[j]&原创 2021-02-04 17:01:49 · 103 阅读 · 0 评论 -
选择排序算法-----简单选择排序算法
选择排序算法-----简单选择排序算法:简单选择排序算法的思想:就是每次循环找出最小的数,并用temp记录最小值以及用index记录最小值的下标;代码如下:#include <stdio.h>void selecksort(int *a, int length) { int i,j,temp,index; for(i = 0; i<length; i++) { //用temp变量记录最小值,index记录最小值的下标 temp = a[i]; inde原创 2021-02-28 01:59:25 · 207 阅读 · 0 评论 -
交换排序算法-----快速排序
排序算法-----快速排序:快速排序的算法思想:递归的排序,每次将起始下标的数组元素值作为基数,然后先从末尾寻找比基数小的数,接着从起始位置寻找比基数大的数,交换位置之后,在起始下标x++的过程中与末尾下标y–的过程中,x==y的时候,将基数放入其中,接着就是递归的思想.观察下图,根据上述思想,自行移动。元素2拿出了。代码如下:#include <stdio.h>void quicksort(int *a, int start, int end)//参数:数组,起始下标,末尾下标原创 2021-02-28 01:27:41 · 174 阅读 · 0 评论 -
插入排序算法-----希尔排序
插入排序算法-----希尔排序:希尔排序思想是将数组每次分成不同的数组同时进行排序,划分的方式是设置增量值,即h= length/2, h /=2;与直接排序最大的不同就是比较的数组值下标间隔不同。希尔排序在数据量庞大的时候进行排序效率高,时间短。代码如下:#include <stdio.h>void insertfun(int *a, int length){ int i,j,temp,h;//h表示增量 h = length/2 for(h = length/2; h&g原创 2021-02-28 00:39:26 · 142 阅读 · 0 评论 -
插入排序算法-----直接排序
排序算法-----直接排序:直接排序:算法思想:将数组的中的每一个的数与它前面的所有数进行比较,找到比它本身小的数,插入进去,比他大的数往后移一位。观察下图,可以根据上面的算法思想自行的进行移动。程序代码如下:#include <stdio.h>void insertfun(int *a, int length){ int i,j,temp; for(i=1; i<length; i++) //这里从数组1开始 { //每i趟比较,i-1个前面的数的大小都是排好原创 2021-02-27 23:45:33 · 121 阅读 · 1 评论