自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(24)
  • 收藏
  • 关注

原创 回溯法求解TSP问题(旅行商问题)

定义:旅行商问题,即TSP问题(Traveling Salesman Problem)又译为旅行推销员问题、货郎担问题,是数学领域中著名问题之一。假设有一个旅行商人要拜访n个城市,他必须选择所要走的路径,路径的限制是每个城市只能拜访一次,而且最后要回到原来出发的城市。路径的选择目标是要求得的路径路程为所有路径之中的最小值。分支限界法:分支限界法(branch and bound method)按广度优先策略搜索问题的解空间树,在搜索过程中,对待处理的节点根据限界函数估算目标函数的可能取值,从中选取使目标函

2021-03-30 15:33:02 10514 9

原创 贪心算法求解TSP问题

定义:旅行商问题,即TSP问题(Traveling Salesman Problem)又译为旅行推销员问题、货郎担问题,是数学领域中著名问题之一。假设有一个旅行商人要拜访n个城市,他必须选择所要走的路径,路径的限制是每个城市只能拜访一次,而且最后要回到原来出发的城市。路径的选择目标是要求得的路径路程为所有路径之中的最小值。贪心算法:核心思想就是每次都能得到局部最优的解。值得注意的是,这里没有整体最优。所以,采用贪心算法求解TSP问题,不一定是最短路径.代码如下:#include <stdio.h

2021-03-30 00:26:25 2335

原创 递归思想求解全排列问题

递归思想求解全排列问题:首先说明一下全排列的含义,就是给出一组没有重复数字的数,按照有先后顺序进行排列组合,要求编程求出所有的组合。这里用递归的思想,代码会简洁很多,关键理解一下核心代码:swap(x[i],x[t]); //交换两数的位置。刚开始会和自己交换,自我交换就当作每处理一样。接着都是循环寻找数进行交换 prim(t+1);swap(x[i],x[t]); //这里是回溯的时候恢复之前交换的数。谈谈我对这里递归的理解:这里有两步交换函数的代码,第一步是交换,第二步是不断递归,第三步是

2021-03-29 23:59:54 602

原创 递归 -----解决 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 579

原创 数据结构 ------链式串的基本操作

数据结构 ------链式串的基本操作:这里采用串的链式存储结构,在明白了单链表的基本原理基础上,再理解串的链式存储以及相关操作就通俗易懂了。这里要注意的是,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 2371 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 403

原创 字符串匹配 ------- 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 854

原创 字符串的匹配 ----- 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 139

原创 二叉排序树(构造 +插入+删除+路径查找)

二叉排序树(构造 +插入+删除+路径查找):二叉排序树的特点:左孩子的关键字小于父亲结点,右孩子的关键字大于父亲结点,然后不停的递归构造,构造过程中,满足以上特点。树的 基本操作 在前面二叉树的介绍中提到,下面直接看程序代码:代码如下:#include <stdio.h>#include <malloc.h>#define max 50typedef struct node{ int data; struct node *lchild,*rchild;}bstn

2021-03-23 15:53:37 608

原创 哈希表(线性存储)+ 线性探测法解决哈希冲突

哈希表(线性存储)+ 线性探测法解决哈希冲突

2021-03-23 00:08:52 3162

原创 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 2944

原创 有向图的拓扑排序问题 -----邻接表存储

有向图的拓扑排序问题 -----邻接表存储:这里的邻接表存储方式其中在vnnode结构体中加入了count(入度)。在拓扑排序过程中,每次找读入为0的进栈,之后每出栈一个顶点就要循环遍历邻近所有(注意,这里的 所有)有边的顶点,修改对应的读入以及判断是否可以入栈.下面代码以图顶点为例: 方便验证结果。代码如下:#include <stdio.h>#include <malloc.h>#define inf 330 #define max 50typedef st

2021-03-21 01:17:06 1117

原创 创建图的邻接表(顺序表+链表)

创建邻接表(顺序表+链表):图的邻接表采用的顺序分配和链式分配的结合,主要包括头结点,图的结构体数组以及链表结点。具体过程代码中理解:代码如下:#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 691

原创 最短路径----狄克斯特拉 (digkstra)+邻接矩阵

最短路径----狄克斯特拉 (digkstra)+邻接矩阵:采用邻接矩阵的存储方式存储。算法主要用到了三个数组:disp[],path和s数组。 disp数组主要是存储最短路径长度,path存储最短路径上当前顶点的前一个顶点,s用来标志顶点是否处理过。其中主要有两步:循环找(找符合条件的顶点),循环改(改顶点对应的disp,path的值),其他细节均在代码中写出,注意的是,算法的动态过程可以优先理解一下,再来理解下面的代码。代码如下:#include <stdio.h>#includ

2021-03-20 18:01:21 1123

原创 最小生成树 --------克鲁斯卡尔(kruskal)算法+邻接矩阵

最小生成树 --------克鲁斯卡尔(kruskal)算法+邻接矩阵:这里采用邻接矩阵的存储方式,其中用到了直接插入排序,对边权值进行排序,另外,这里定义的e[]数组是存储每条边的相关信息(边的两端点+权值)算法思想就是找边小的边,将边两端点加入构造结合内,循环找(因为是排好序的),循环从小到大就可以了,遇到连通值相同的顶点,如果他们之间有边值,需要舍弃掉,因为加入到构造集合内会形成回路,我们这里要找的是不能形成回路的。代码如下:#include <stdio.h>#include

2021-03-20 15:26:25 3254

原创 最小生成树 -----普里姆(prim)算法+ 邻接矩阵

最小生成树 -----普里姆(prim)算法+ 邻接矩阵:这里采用邻接矩阵的方式存储。prim算法:用两个集合表示,v集合表示选中的顶点,u-v表示待选的顶点的集合。主要是不断的选则两集合之间边值最小的u-v中的顶点。直到顶点全部选完。算法的主要思想是定义了两个数组:lowcost[]:用来表示两个集合之间最小的权值边。 lowset[]:用来 表示最小边对应在v集合里的顶点。代码如下:#include <stdio.h>#include <malloc.h>#defi

2021-03-20 01:40:14 1167

原创 中序线索化二叉树+遍历(带头结点)

中序线索化二叉树+遍历(带头结点):思路:创建过程与前序大同小异,主要在遍历过程中,循环遍历结束的条件需要注意一下,然后遍历思想:最左,接着找后继,接着找右子树,然后重新循环。代码如下:#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 1009 1

原创 前序线索化二叉树+遍历(带头结点)

前序线索化二叉树+遍历(带头结点):思路:构造线索化 二叉树的时候,注意头结点的处理,以及最后一个结点与头结点的处理,另外一个就是遍历的过程中,while()循环的条件,因为构建的线索树是循环的,双链线性表的结构。 其他主要细节处理均在代码中解释出来了代码如下:#include <stdio.h>#include <malloc.h>#include <string.h>#define maxsize 50typedef char elemtype;typ

2021-03-15 13:51:21 943

原创 采用循环队列解决二叉树的层次遍历

采用循环队列解决二叉树的层次遍历:思路:对成功创建的二叉链树进行层次遍历,这里采用循环队列的思想来解决,主要是从根节点开始,将结点进队(下标rear+1,接着进队),然后(front + 1)将元素出对,此时,对出对结点的左右孩子进行判断,有孩子,将孩子进队,先判断左孩子,再判断右孩子,接下来的操作与之前的一样,将孩子进队,接下来的操作与之前一样。下图红色表示5是将其出对。代码如下:#include <stdio.h>#include <stdio.h>#include

2021-03-13 22:20:16 1136 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 425

原创 后序线索化二叉树 +遍历(带头结点)

后序线索二叉树#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 1147 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 910

原创 二叉树的构造以及基本操作

*二叉树的构造以及基本操作:二叉树的构造基本思想:循环遍历一段字符串,遇到"(" 就将父结点入指针栈(数组指针),并将变量k置为1,表示接下来构建的是左子树,遇到",",k值置为2,表示接下来要构建的是右子树,遇到")",表示当前结点左右子树构建完成,将结点出栈。遇到其他的,则创建一个结点指针,并且做相应的赋值操作,每创建的结点要进行定位判断,判断是定位成根结点还是作为左孩子的结点或者作为右孩子的结点。二叉树的销毁思想: //只要当前结点不为空,则先递归销毁左子树,再销毁右子树,最后销毁当前结点本身,最

2021-03-06 19:17:00 2758 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 187

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除