数据结构和算法
文章平均质量分 64
any_ways
这个作者很懒,什么都没留下…
展开
-
数据结构之红黑树的生成、添加以及删除详解(附代码)
要了解红黑树,那必须得了解它的。原创 2022-12-28 19:53:27 · 1503 阅读 · 1 评论 -
数独的生成以及解答--回溯算法c++附详细代码
首先准备一个空的数独,从第一个格子开始,按照数独的规则,把1-9依次试探性的填入,如果合法,就填入.如果不合法就判断下一个数合不合法,这样,一直到把第81个格子填完,就生成了一个完整的数独,但是因为这样生成的数独是一个固定的,所以,现在我们要随机把它打乱,根据数独的特性,在同一个小九宫格中的行和行之间交换位置,列与列之间交换位置,数独依然成立,打个比方,第0行和第2行,交换位置,第0列和第2列交换位置,数独依然成立.。这样直到把所有空格都遍历完成.。原创 2022-11-27 14:31:25 · 3466 阅读 · 0 评论 -
数据结构之平衡二叉树详解
平衡二叉树(balanced binary tree)又称AVL树(Adelson-Velskii and Landis)一棵平衡二叉树或者是空树,或者是具有下列性质的二叉排序树: 1,左子树与右子树的高度之差的绝对值小于等于1; 2,左子树和右子树也是平衡二叉排序树.为了方便起见,给每个结点附加一个数字,给出该结点左子树与右子树的高度差.这个数字称为结点的平衡因子(BF).平衡因子 = 结点左子树的高度 - 结点右子树的高度根据平衡二叉树的定义,平衡二叉树上所有结点的平衡因子只原创 2022-06-05 14:58:24 · 17027 阅读 · 3 评论 -
数据结构之二叉排序树的生成以及增删改查(C语言的实现)
定义:二叉排序树或是空树,或是满足如下性质的二叉树:1,若其左子树非空,则左子树上所有的结点的值均小于根结点的值;2,若其右子树非空,则右子树上所有的结点的值均大于等于根结点的值;3,其左右子树本身又各是一棵二叉排序树例如:这就是一棵二叉排序树,左子树小于根结点,右子树大于等于根结点,再比如下面:这就不是一个二叉排序树了,因为左子树上面的48大于根结点45二叉排序树的特点:中序遍历下面二叉排序树得到的结果是:3 12 24 37 45 53 61 78 9原创 2022-06-02 12:25:10 · 4092 阅读 · 7 评论 -
有向无环图的应用之拓扑排序(C语言)
有向无环图:无环的有向图,简称DAG图(Directed Acycline Gragh),不存在回路有向无环图常用来描述一个工程或系统的进行过程.(通常把计划,施工,生产,程序流程等当成是一个工程)一个工程可以分为若干个子工程,只要完成了这些子工程(活动),就可以使整个工程完成.AOV网:用一个有向图表示一个工程的各子工程及其相互制约的关系,其中以顶点表示活动,弧表示活动之间的优先制约关系,称这种有向图为顶点表示活动的网,简称AOV网(Activity on Vertex network)原创 2022-05-22 09:47:05 · 1653 阅读 · 0 评论 -
最短路径之Floyd(弗洛伊德)算法,以及显示完整路径
简介:Floyd算法又称为插点法,是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法,与Dijkstra算法类似。该算法名称以创始人之一、1978年图灵奖获得者、斯坦福大学计算机科学系教授罗伯特·弗洛伊德命名。我的上一篇文章讲的dijjstra算法,是图中某一个顶点,到其它顶点之间的最短路径.时间复杂度为O(n2),是单源最短路径而Floyd算法,是图中每一个顶点,到其它顶点之间的最短路径.时间复杂度为O(n3).也被称为多源最短路径问题.算法思想:1,逐个顶点试探2原创 2022-05-20 12:23:15 · 7702 阅读 · 4 评论 -
图的最短路径之(迪克斯特拉)Dijkstra算法代码实现
一,Dijkstra算法1,初始化:先找出从源V0到各终点Vk的直达路径(V0,Vk),即通过一条弧到达的路径.如果一条弧不能到达的点记为 无穷大2,选择:从这些路径中找出一条长度最短的路径(V0,U).3,更新:然后从其余各条路径进行适当调整:若在图中存在弧(U,Vk),且(V0,U) + (U,Vk) < (V0,Vk),则以路径(V0,U,Vk)代替(V0,Vk)4,在调整后的各条路径中,再找长度最短的路径(依此类推).具体的操作为:1,把V(顶点)分成两组:..原创 2022-05-15 13:50:16 · 3107 阅读 · 0 评论 -
数据结构之生成树,最小生成树,普里姆(Prim)算法与克鲁斯卡尔(Kruskal)算法,以及C语言的实现
一,生成树生成树:所有顶点均由边连接在一起,但不存在回路的图.一个图可以有许多棵不同的生成树,所有生成树具有以下共同特点:1,生成树的顶点个数与图的顶点个数相同;2,生成树是图的极小连通子图,去掉一条边则非连通;3,一个有n个顶点的连通图的生成树有n-1条边;4,在生成树中再加一条边必然形成回路;5,生成树中任意两个顶点间的路径是唯一的;6,含n个顶点n-1条边的图不一定是生成树.用深度优先遍历无向图,而得到的生成树称为深度优先生成树用广度优先遍历无向图,而得到的生成原创 2022-05-08 22:51:03 · 2788 阅读 · 2 评论 -
图的遍历(深度优先遍历DFS,广度优先遍历BFS)以及C语言的实现
遍历的定义:从已给的连通图中某一顶点出发,沿着一些边访遍图中所有的顶点,且使每个顶点仅被访问一次,就叫做图的遍历,它是图的基本运算.一:深度优先遍历(DFS)1,在访问图中某一起始顶点V后,由V出发,访问它的任一邻接顶点W12,再从W1出发,访问与W1邻接但还未被访问过的顶点W2;3,然后再从W2出发,进行类似的访问......4,如此进行下去,直至到达所有的邻接顶点都被访问过的顶点U为止.5,接着,退回一步,退到前一次刚访问过的顶点,看是否还有其它没有被访问过的邻接点6,如原创 2022-05-01 17:28:16 · 27209 阅读 · 8 评论 -
数据结构 图的存储结构(邻接矩阵,邻接表,十字链表,邻接多重表)的实现
图的逻辑结构是多对多,所以图没有顺序存储结构,但可以借助二维数组来表示元素间的关系,这就是数组表示法(邻接矩阵)链式存储结构:可以用多重链表(邻接表,邻接多重表,十字链表)来表示重点:邻接矩阵(数组)表示法 和 邻接表(链式)表示法一:数组(邻接矩阵)表示法1,先建立一个顶点表(记录各个顶点的信息)和一个邻接矩阵(表示各个顶点之间的关系).顶点表是一个一维数组Vexs[n]无向图邻接矩阵是一个二维数组arcs[n][n],如果两个顶点间有边相连,那么arcs[n][n] = 1,否则原创 2022-04-27 12:10:46 · 5462 阅读 · 0 评论 -
数据结构 图的定义和术语
图:G=(V,E) Graph = (Vertex, Edge)V:顶点(数据元素)的有穷非空集合.E:边的有穷集合.无向图:每条边都是无方向的.有向图:每条边都是有方向的.完全图:任意两个点都有一条边相连无向完全图如果有n个顶点,那么它就有n(n-1)/2条边有向完全图如果有n个顶点,那么它就有n(n-1)条边稀疏图:有很少边或弧的图稠密图:有较多边或弧的图网:边/弧带权的图.邻接:有边/弧相连的两个顶点之间的关系存在(Vi, Vj),则称Vi原创 2022-04-25 21:36:20 · 912 阅读 · 0 评论 -
哈夫曼树详解及其应用(哈夫曼编码)
一,哈夫曼树的基本概念路径:从树中一个结点到另一个结点之间的分支构成这两个结点间的路径结点的路径长度:两结点之间路径上的分支数树的路径长度:从树根到每一个结点的路径长度之和.记作:TL权(weight):将树中结点赋给一个有着某种含义的数值,则这个数值秒针为该结点的权结点的带权路径长度:从根结点到该结点之间的路径长度与该结点的权的乘积.树的带权路径长度:树中所有叶子结点的带权路径长度之和.记作:WPL(Weighted Path Length)哈夫曼树:最优树(带权路径长度(WP原创 2022-04-22 20:09:37 · 32737 阅读 · 9 评论 -
树,森林的实现和操作以及他们的遍历
一,树的实现和操作要实现树的操作,我们需要把树转换成二叉树,再对二叉树实现操作后,再转回树,那怎么把树转换成二叉树呢,前面我们讲过了树的存储,有一种方法叫孩子兄弟法(二叉链法)上面的树用孩子兄弟法表示出来是这样:这个图看上去和二叉树一模一样,我们用...原创 2022-04-17 10:49:48 · 738 阅读 · 0 评论 -
树和森林,树的存储结构
一,定义树的定义:树是n(n>=0)个结点的有限集.若n = 0,称为空树;若n > 0 则:1,有且仅有一个特定的称为根的结点,2,其余结点可分为m(m>=0)个互不相交的有限集T1,T2,T3.....,Tm,森林的定义:是m(m>=0)棵互不相交的树的集合.二,树的存储结构1:双亲表示法实现:定义结构数组,存放树的结点,每个结点含两个域,数据域(存放结点本身信息),双亲域(指示本结点的双亲结点在数组中的位置)双亲域-1表示根结点,B,C,D的双亲原创 2022-04-15 16:36:10 · 1205 阅读 · 0 评论 -
二叉树的一些常用方法(求结点数,叶子数,深度,复制,打印)
下面介绍一下,二叉树的一些常用方法,结合前面写的二叉树的创建和遍历,那么二叉树的基本知识也就差不多了#include <stdio.h>#include <stdlib.h>#define MAXSIZE 10#include <string.h>typedef struct BinaryTree{ char data; struct BinaryTree* lchild; struct BinaryTree* rchild;}B原创 2022-04-12 12:18:14 · 2591 阅读 · 0 评论 -
二叉树的创建以及先序,中序,后序递归法遍历,普通循环遍历
一:创建既然有先序法遍历,那应该也有先序法创建.二叉链的数据模型是:typedef struct BinaryTree{ char data;struct BinaryTree* lchild;struct BinaryTree* rchild;}BT;下面就用二叉链的数据类型,创建一个二叉树...原创 2022-04-10 18:02:38 · 2922 阅读 · 2 评论 -
二叉树的性质和存储结构
定义:二叉树(binary tree)是指树中节点的度不大于2的有序树,它是一种最简单且最重要的树。二叉树的递归定义为:二叉树是一棵空树,或者是一棵由一个根节点和两棵互不相交的,分别称作根的左子树和右子树组成的非空树;左子树和右子树又同样都是二叉树性质1:在二叉树的第i层上最多有2^i-1个结点(i>=1)这个不用多说,满二叉树,第一层1个结点,第二层2个结点,第三层4个性质2:深度为K的二叉树最多有(2^k)-1个结点(k>=1),最少K个结点这个就是.原创 2022-04-09 17:57:02 · 585 阅读 · 0 评论 -
广义表的创建和操作(C语言)
定义:广义表是n(n≥0)个元素a1,a2,…,ai,…,an的有限序列。其中:①ai--或者是原子或者是一个广义表。②广义表通常记作:Ls=( a1,a2,…,ai,…,an)。③Ls是广义表的名字,n为它的长度。④若ai是广义表,则称它为Ls的子表。注意:①广义表通常用圆括号括起来,用逗号分隔其中的元素。②为了区分原子和广义表,书写时用大写字母表示广义表,用小写字母表示原子。③若广义表Ls非空(n≥1),则al是Ls的表头,其余元素组成的表(a2,a3,…,a原创 2022-04-08 23:01:24 · 3270 阅读 · 2 评论 -
数据结构之压缩矩阵(三角矩阵,对角矩阵,稀疏式矩阵)
1,三角矩阵是对称矩阵的一种,对称矩阵的最大特点就是a[m][n] = a[n][m]那既然是这样,我们在内存中,就没有必要把这个矩阵全部保存,只要保存一半就可以了,余下的一半就用a[m][n] = a[n][m],来表示,这样就节省下来一半的内存.那么这个三角矩阵在内存中是怎么存储的呢我们看到这个是有规律的,第一行1个元素,第二行2个元素,第N行就用N个元素那么我们就可以计算出,在内存中的位置是:i*(i-1)/2+j-12,对角矩阵(带状矩阵)在一般的矩阵中,数据全部..原创 2022-04-05 15:58:25 · 3695 阅读 · 0 评论 -
字符串匹配之BF算法和KMP算法(看不懂算我输),j = next(j)的原理
网上关于这个算法,五花八门,看得我是眼花瞭乱,脑抽筋,都说包会,可能是我确实脑细胞不够用,各种版本看了一整天,通过自己的理解和实践,总结出我这种小白都能理解的方法来,以供我以后忘记了,还能通过看一遍就能理解首先先来一断BF暴力穷举法:#include <stdio.h>#include <stdlib.h>#include <string.h>int main(){ char Primary[100] = "abcdabccabcbabca";原创 2022-04-04 17:34:43 · 599 阅读 · 0 评论 -
队列的顺序结构和链结构的实现和操作
1,顺序结构的队列队列的特点,只能在尾部进入,头部出去,所以也叫做first in first out 简称FIFO结构这个我们也称之为循环对列,就是当头指针或者尾指针,在插入元素或删除元素时,如果自身的位置就在下标为n-1处,那么它们插入元素或删除元素后,下标+1时,就会回到队列的起点,下标变成0#include <stdio.h>#include <stdlib.h>#define MAXSIZE 10typedef struct SequenceQueue/原创 2022-04-02 17:30:45 · 1474 阅读 · 0 评论 -
栈的顺序结构和链结构的实现和操作
一,栈的顺序结构的实现利用结构体的成员来定义栈的底部指针和顶部指针,以及栈的大小#include <stdio.h>#include <stdlib.h>#define MAX(X,Y) (X>Y?X:Y)#define MAXSIZE 10typedef struct Sq//创建栈的结构体{ int* top;//栈顶 int* base;//栈底 int sz;//栈的大小}Sq;void Creat_stack(Sq* p原创 2022-04-01 21:29:04 · 367 阅读 · 0 评论 -
顺序表和链表的归并,归并排序
1,顺序表的归并#include <stdio.h>#include <stdlib.h>#define MAX(X,Y) (X>Y?X:Y)#define MAXSIZE 10typedef struct List//创建一个顺序表类型{ int arr[MAXSIZE]; int size;}List;int check(int a, List*b)//检查顺序表里是否包含某个整型{ int i = 0; for(i =原创 2022-03-30 23:00:17 · 1580 阅读 · 0 评论 -
单循环链表和双向循环链表
循环链表就是普通的单链表,最后一个元素存的地址本来是NULL,现在改成头结点的地址,从而形成循环.#include <stdio.h>#include <stdlib.h>#define MAX(X,Y) (X>Y?X:Y)#include <math.h>//尾部插入法创建一个包含5个元素的循环链表,从一个开始元素依次插入到头部typedef struct S//创建一个链表元素{ int data;//数据域 struct S*原创 2022-03-28 20:47:08 · 1991 阅读 · 0 评论 -
创建一个链表
1,用头部插入法创建一个链表:#include <stdio.h>#include <stdlib.h>#define MAX(X,Y) (X>Y?X:Y)#include <math.h>//头部插入法创建一个包含5个元素的链表,从最后一个元素开始依次插入到头部typedef struct S//创建一个链表元素{ int data;//数据域 struct S* p;//地址域,指向下一个元素的地址}S;int main()原创 2022-03-27 17:02:14 · 4461 阅读 · 0 评论