![](https://img-blog.csdnimg.cn/20200317152126738.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
数据结构/算法
文章平均质量分 58
数据结构:最基础的课程
959y
奋斗ing
展开
-
最大子段和问题:蛮力、递归及动态规划
最大子段和问题:蛮力、递归及动态规划问题描述求一个序列的最大子段和即最大连续子序列之和。例如序列[4, -3, 5, -2, -1, 2, 6, -2]的最大子段和为11=[4+(-3)+5+(-2)+(-1)+(2)+(6)]。1. 蛮力算法思想:从序列首元素开始穷举所有可能的子序列。代码示例(C++):#include<iostream>using names...原创 2020-01-08 22:27:32 · 578 阅读 · 0 评论 -
蓝桥杯_世纪末的星期
//标题: 世纪末的星期//曾有邪教称1999年12月31日是世界末日。当然该谣言已经不攻自破。//还有人称今后的某个世纪末的12月31日,如果是星期一则会....//有趣的是,任何一个世纪末的年份的12月31日都不可能是星期一!! //于是,“谣言制造商”又修改为星期日......//1999年的12月31日是星期五,请问:未来哪一个离我们最近的一个世纪末年(即xx99年)的12月31...原创 2020-03-08 14:00:05 · 281 阅读 · 0 评论 -
java_数据结构_1
1.稀疏矩阵2.队列文章目录1.稀疏数组2.队列-单向3.队列循环1.稀疏数组ublic class demo01 { public static void main(String[] args) { int chew[][] = new int[11][11]; chew[1][1] = 21; chew[2][1] = 1; for(int[] row : chew) { for(int data : row) { System.out.print(dat原创 2021-01-03 21:53:44 · 145 阅读 · 1 评论 -
b树
B树(B-tree)注意:之前有看到有很多文章把B树和B-tree理解成了两种不同类别的树,其实这两个是同一种树;概念:B树和平衡二叉树稍有不同的是B树属于多叉树又名平衡多路查找树(查找路径不只两个),数据库索引技术里大量使用者B树和B+树的数据结构,让我们来看看他有什么特点;规则:1.排序方式:所有节点关键字是按递增次序排列,并遵循左小右大原则;2.子节点数:非叶节点的子节点数>1,且<=M ,且M>=2,空树除外(注:M阶代表一个树节点最多有多少个查找路径,M=M路,当M=原创 2020-06-04 21:31:10 · 203 阅读 · 0 评论 -
图的应用
最小生成树连通图的生成树是包含图中全部顶点的极小连通子图。注意区分极大连通子图和极小连通子图:极大连通子图是无向图的连通分量,它包含无向图的所有的边;极小连通子图是连通无向图的生成树,既要保持图连通,又要使得边数最小1.Prim算法2.克鲁斯卡尔算法3.广度优先算法广度优先算法求的是无权的最小生成树,或者权都相等的prim和库鲁斯卡尔算法求的是无权或者有权的最小生成树prim算法:基于贪心算法,加点法每次迭代选择代价最小的边对应的点,加入到最小生成树中。算法从某一个顶点s开始,逐渐长大覆原创 2020-06-03 15:49:00 · 260 阅读 · 0 评论 -
数据结构之图
图的定义图由顶点集V(G)和边集E(G)组成,记为G=(V,E)。其中E(G)是边的有限集合,边是顶点的无序对(无向图)或有序对(有向图)。对有向图来说,E(G)是有向边(也称弧(Arc))的有限集合,弧是顶点的有序对,记为<v,w>,v、w是顶点,v为弧尾(箭头根部),w为弧头(箭头处)。对无向图来说,E(G)是边的有限集合,边是顶点的无序对,记为(v, w)或者(w, v),并且(v, w)=(w,v)。基本术语顶点(Vertex):图中的数据元素。线性表中我们把数据元素叫元素,树原创 2020-06-02 18:30:28 · 2878 阅读 · 0 评论 -
哈夫曼树和哈夫曼编码
文章目录哈夫曼树的定义哈夫曼树的构造哈夫曼编码(哈夫曼的重要应用)哈夫曼树的定义在实际应用中,树中结点常常被赋予一个表示某种意义的数值,称为该结点的权。从树根结点到任意结点的路径长度(经过的边数)与该结点上权值的乘积,称为该结点的带权路径长度。树中所有叶结点的带权路径长度之和称为该树的带权路径长度,记为式中,是第i个叶结点所带的权值,是该叶结点到根结点的路径长度。在含有n个带权叶子结点的二叉树中,其中带权路径长度(WPL)最小的二叉树称为哈夫曼树,也称为最优二叉树。哈夫曼树一定是一颗二叉树。原创 2020-06-01 22:00:42 · 1803 阅读 · 2 评论 -
平衡二叉树
平衡二叉树背景:平衡二叉树首先是二叉排序树。基于二叉排序树,发现树越矮查找效率越高,进而发明了二叉平衡树因为基于查找的效率,所以提出了平衡二叉树,为了使高度降低。平衡二叉树的定义平衡因子(BF Balance factor):BF(T)=hL-hR,其中hL和hR分别为T的左、右子树的高度。平衡二叉树(Balanced Binary Tree)(AVL树):空树或者任一结点左、右子树高度差的绝对值不超过1,即|BF(T)<=1|。平衡二叉树的调整调整之后保证仍然是搜索树从离插入结点最原创 2020-06-01 21:08:22 · 244 阅读 · 0 评论 -
二叉排序树
二叉排序树是为了实现数据的有序排列,并可方便的对树中的数据进行插入和删除操作,提高查找效率。BST这里删除和添加都需要设计到查找的操作,所以要使其效率高的话,就要提升查找操作的效率。AVL:平衡二叉树性质:若它的左子树不为空,则左子树上的所有值均小于根结点的值若它的右子树不为空,则右子树上的所有值均大于根结点的值它的左右子树也分别为二叉排序树左小于中小于右操作:查找二叉排序树是一个有序的二叉树,其左子树永远比根节点的值小,右子树用于比根节点的值大。因此我们可以使用递归技术,如果keyda原创 2020-06-01 17:12:17 · 425 阅读 · 0 评论 -
树与二叉树
树的基本概念节点:节点包括一个数据元素及若干指向其他子树的分支。节点的度:节点所拥有子树的个数称为节点的度。叶节点:度为0的节点成为叶结点,叶结点也称为终端节点。分支节点:度不为0的节点称为分支节点,分支节点又称非终端节点。一棵树中排除叶结点外的所有节点都是分支节点。祖先节点:从根节点到该节点所经分支上的所有节点。子孙节点:以某节点为根节点的子树中所有节点双亲节点:树中某节点有孩子节点,则这个节点称为它孩子节点的双亲节点,双亲节点也成为前驱节点。孩子节点:树中一个节点的子树的根节点称为该节点原创 2020-05-31 22:37:14 · 230 阅读 · 0 评论 -
树的分类
二叉树:二叉查找树,笛卡尔树,MVP树,Top tree,T树平衡二叉树:AA树原创 2020-05-29 22:31:13 · 407 阅读 · 0 评论 -
广义表
广义表的定义广义表简称表,它是线性表的推广。一个广义表是n(n≥0)个元素的一个序列,若n=0时则称为空表。设ai为广义表的第i个元素,则广义表GL的一般表示与线性表相同:GL=(a1,a2,…,ai,…,an)其中n表示广义表的长度,即广义表中所含元素的个数,n≥0。如果ai是单个数据元素,则ai是广义表GL的原子;如果ai是一个广义表,则ai是广义表GL的子表。广义表具有如下重要的特性:(1)广义表中的数据元素有相对次序;(2)广义表的长度定义为最外层包含元素个数;(3)广义表的深度定义原创 2020-05-28 16:49:37 · 3344 阅读 · 0 评论 -
字符串匹配_kmp算法
许多算法可以完成这个任务,Knuth-Morris-Pratt算法(简称KMP)是最常用的之一。它以三个发明者命名,起头的那个K就是著名科学家Donald Knuth。首先,字符串"BBC ABCDAB ABCDABCDABDE"的第一个字符与搜索词"ABCDABD"的第一个字符,进行比较。因为B与A不匹配,所以搜索词后移一位。因为B与A不匹配,搜索词再往后移。就这样,直到字符串有一个字符,与搜索词的第一个字符相同为止。接着比较字符串和搜索词的下一个字符,还是相同。原创 2020-05-27 22:42:41 · 215 阅读 · 0 评论 -
字符串匹配_暴力匹配算法
假设现在我们面临这样一个问题:有一个文本串S,和一个模式串P,现在要查找P在S中的位置,怎么查找呢?首先,先理清楚了暴力匹配算法的流程及内在的逻辑:如果用暴力匹配的思路,并假设现在文本串S匹配到 i 位置,模式串P匹配到 j 位置,则有:如果当前字符匹配成功(即S[i] == P[j]),则i++,j++,继续匹配下一个字符;如果失配(即S[i]! = P[j]),令i = i - (j - 1),j = 0。相当于每次匹配失败时,i 回溯,j 被置为0。举个例子,如果给定文本串S:“BBC AB原创 2020-05-27 22:05:05 · 872 阅读 · 0 评论 -
栈的应用
栈有一个很重要的应用:在程序设计语言中讲了递归。那么什么是递归呢?当你往镜子前面一站,镜子里面就有一个你的像。但你试过两面镜子一起照吗?如果A、B两面镜子互相面对面放着,你往中间一站,嘿,两面镜子都有你的千百个“化身”,为什么会有这么奇妙的现象呢?原来,A镜子里有B镜子的像,B镜子里也有A镜子的像,这样反反复复,就会产生一连串的“像中像”。这是一种递归现象。我们先来看一个经典的递归例子:斐波那契数列(Fibonacci)。为了说明这个数列,这位斐老还举了一个很形象的例子。栈的代码很容易看懂,但是栈的效率低原创 2020-05-26 15:15:34 · 2184 阅读 · 0 评论 -
出栈次序及Catalan函数
近日在复习数据结构,看到栈的时候,发现1个元素进栈,有1种出栈顺序;2个元素进栈,有2种出栈顺序;3个元素进栈,有5种出栈顺序,那么一个很自然地问题就是n个元素进栈,共有多少种出栈顺序?于是上网搜索一下,原来真的有这么一个公式:C(2n,n)/(n+1) (C(2n,n)表示2n里取n),并且有个名字叫Catalan函数。比如如果有3个不同元素依次进栈,可以得到多少种不同的出栈序列呢答案是5种,用上面的Catalan函数计算即可:6x5x4/(4x3x2)=5...原创 2020-05-24 16:13:32 · 1632 阅读 · 0 评论 -
数组与单链表与双链表
数组与链表数组静态分配内存,链表动态分配内存;数组在内存中连续,链表不连续;数组利用下标定位,时间复杂度为O(1),链表定位元素时间复杂度O(n);数组插入或删除元素的时间复杂度O(n),链表的时间复杂度O(1)。数组的优点随机访问性强(通过下标进行快速定位)查找速度快数组的缺点插入和删除效率低(插入和删除需要移动数据)可能浪费内存(因为是连续的,所以每次申请数组之前必须规定数组的大小,如果大小不合理,则可能会浪费内存)内存空间要求高,必须有足够的连续内存空间。数组大小固定,不能动态拓展原创 2020-05-23 12:30:09 · 297 阅读 · 0 评论 -
顺序表的基本操作
顺序表的基本操作定义最大值#define MaxSize 100typedef struct{ ElemType data[MaxSize]; int length;}SqList;初始化操作#define InitList 100typedef struct{ ElemType *data; int MaxSize,length;}SqList;动态分配内存操作C:L.data=(ElemType*)malloc(sizeof(ElemType)*InitSize);C原创 2020-05-22 14:03:01 · 189 阅读 · 0 评论 -
线性表-定义
线性表分类线性表分为两种1.顺序存储-顺序表2.链式存储单链表双链表循环链表静态链表其中单链表,双链表,循环链表都是由指针实现,而静态链表由数组实现线性表的基本概念线性表的特点线性表中元素个数是有限的表中具有逻辑上的顺序性,表中元素有其先后次序表中元素都是数据元素,每个元素都是单个元素表中的元素的数据类型都是相同的,这以为着每个元素占有相同大小的存储空间表中元素有抽象性,即仅讨论元素的逻辑关系,不考虑元素究竟代表什么内容数据元素之间具有一种线性的或“一对一”的逻辑关系。第一原创 2020-05-22 13:09:54 · 1911 阅读 · 0 评论 -
数据结构_C++
数据结构文章目录数据结构1.数据结构基本概念2.数据结构关系2.1逻辑结构2.2 物理结构2.3 数据的运算3.算法3.1算法概念3.2算法和数据结构的区别3.3算法的特性3.4算法的效率3.4.1时间复杂度3.4.2空间复杂度3.4.3时间与空间1.数据结构基本概念1.数据2.数据对象3.数据元素4.数据项数据结构为研究数据元素之间的关系。即结点与结点之间的关系数据结构具体表现为...原创 2020-03-14 16:49:06 · 294 阅读 · 0 评论