![](https://img-blog.csdnimg.cn/20210720063800371.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
数据结构与算法
文章平均质量分 73
链表、队列、栈、树、图、常见算法
农村小白i
奋斗的农村小白
展开
-
最短路径(加权有向图)
最短路径1. 最短路径定义以及性质定义:在一副加权有向图中,从顶点s到顶点t的最短路径是所有从顶点s到顶点t的路径中总权重最小的那条路径。性质:路径具有方向性。权重不一定等于距离。权重可以是距离、时间、花费等内容,权重最小指的是成本最低。只考虑连通图。一副图中并不是所有的顶点都是可达的,如果s和t不可达,那么它们之间也就不存在最短路径,所以只考虑连通图。最短路径不一定是唯一的。从一个顶点到达另外一个顶点的权重最小的路径可能会有很多条,所以只需要找出一条即可。最短路径树:给定一副加权原创 2021-08-28 17:00:29 · 4600 阅读 · 0 评论 -
加权有向图
加权有向图加权无向图中,边是没有方向的,并且同一条边会同时出现在该边的两个顶点的邻接表中,为了能够处理含有方向性的图的问题,我们需要实现以下加权有向图。1. 加权有向图边的表示API设计:类名DirectedEdge构造方法DirectedEdge(int v,int w,double weight):通过顶点v和w,以及权重weight值构造一个边对象成员方法1.public double weight():获取边的权重值2.public int from():获取有原创 2021-08-28 10:30:46 · 749 阅读 · 0 评论 -
Prim算法实现、最小生成树(加权无向图)
最小生成树加权图,我们发现它的边关联了一个权重,那么我们就可以根据这个权重解决最小成本问题,但如何才能找到最小成本对应的顶点和边呢?最小生成树相关算法可以解决。1. 最小生成树定义以及相关约定定义:图的生成树是它的一棵含有其所有顶点的无环连通子图,一副加权无向图的最小生成树它的一棵权值(树中所有边的权重之和)最小的生成树约定:只考虑连通图。最小生成树的定义说明它只能存在于连通图中,如果图不是连通的,那么分别计算每个连通图子图的最小生成树,合并到一起称为最小生成森林。所有边的权重都各不相同。原创 2021-08-27 23:24:14 · 2460 阅读 · 0 评论 -
加权无向图
加权无向图加权无向图是一种为每条边关联一个权重值或是成本的图模型。这种图能够自然地表示许多应用。在一副航空图中,边表示航线,权值则可以表示距离或是费用。在一副电路图中,边表示导线,权值则可能表示导线的长度即成本,或是信号通过这条先所需的时间。此时我们很容易就能想到,最小成本的问题,例如,从西安飞纽约,怎样飞才能使时间成本最低或者是金钱成本最低?在下图中,从顶点0到顶点4有三条路径,分别为0-2-3-4,0-2-4,0-5-3-4,那我们如果要通过那条路径到达4顶点最好呢?此时就要考虑,那条路径的成本最低原创 2021-08-27 23:19:44 · 2654 阅读 · 1 评论 -
有向图、及其反向图
二、有向图2.1 有向图的定义及相关术语定义:有向图是一副具有方向性的图,是由一组顶点和一组有方向的边组成的,每条方向的边都连着一对有序的顶点。出度:由某个顶点指出的边的个数称为该顶点的出度。入度:指向某个顶点的边的个数称为该顶点的入度。有向路径:由一系列顶点组成,对于其中的每个顶点都存在一条有向边,从它指向序列中的下一个顶点。有向环:一条至少含有一条边,且起点和终点相同的有向路径。一副有向图中两个顶点v和w可能存在一下四种关系:没有边相连。存在从v->w的边。存在从原创 2021-08-24 00:18:24 · 3147 阅读 · 0 评论 -
无向图、深度优先搜索(无向图)、广度优先搜索(无向图)、无向图路径查找(基于深度优先搜索)
一、无向图1.1 图的相关术语相邻顶点:当两个顶点通过一条边相连时,我们称这两个顶点是相邻的,并且称这条边依附于这两个顶点。度:某个顶点的度就是依附于该顶点的边的个数。子图:是一幅图的所有边的子集(包含这些边依附的顶点)组成的图。路径:是由边顺序连接的一系列的顶点组成。环:是一条至少含有一条边且终点和起点相同的路径。连通图:如果图中任意一个顶点都存在一条路径到达另外一个顶点,那么这幅图就称之为连通图。连通子图:一个非连通图由若干连通的部分组成,每一个连通的部分都可以称为该图的连原创 2021-08-24 00:15:21 · 3039 阅读 · 0 评论 -
B树(B-、B+)
B树(B-、B+)一、B-树B树是一种树状数据结构,它能够存储数据、对其进行排序并允许以O(logn)的时间复杂度进行查找、顺序读取、插入和删除等操作。B树,这种数据结构中,一个结点允许多于两个key的存在。1.1 B树的特征B树中允许一个结点中包含多个key,可以是3个、4个、5个甚至更多,并不确定,需要看具体的实现。现在我们选择一个参数M,来构造一个B树,我们可以把它称作是M阶的B树,那么该树会具有如下特点:每个结点最多有M-1个key,并且以升序排列;每个结点最多能有M个子结点;根结原创 2021-08-16 17:44:47 · 852 阅读 · 1 评论 -
平衡树(查找树、红黑树)
15-平衡树(查找树、红黑树)一、2-3查找树为了保证查找树的平衡性,我们需要一些灵活性,因此在这里我们允许树中的一个结点保存多个键。确切的说,我们将一棵标准的二叉查找树中的结点称为2-结点(含有一个键和两条链),而现在我们引入3-结点,它含有两个键和三条链。2-结点和3-结点中的每条链都对应着其中保存的键所分割产生的一个区间。1.1 2-3查找树的定义一棵2-3查找树要么为空,要么满足满足下面两个要求:2-结点:含有一个键(及其对应的值)和两条链,左链指向的2-3树中的键,都小于该结点的键原创 2021-08-16 16:26:16 · 242 阅读 · 0 评论 -
优先队列--最大、最小优先队列(基于堆思想)
优先队列–最大优先队列(基于堆思想)最大优先队列:可以获取并删除队列中最大的值最大优先队列API设计类名MaxPriorityQueue构造方法MaxPriorityQueue(int capacity):创建容量为capacity的MaxPriorityQueue对象成员方法1.private boolean less(int i,int j):判断堆中索引i处的元素是否小于索引j处的元素2.private void exch(int i,int j):交换堆中i索引和原创 2021-08-10 23:05:25 · 359 阅读 · 0 评论 -
堆--完全二叉树的数组实现
堆–完全二叉树的数组实现堆的定义堆是计算机科学中一类特殊的数据结构的统称,堆通常可以看作是一棵完全二叉树的数组对象。堆的特性1.它是完全二叉树,除了树的最后一层结点不需要是满的,其它的每一层从左到右都是满的,如果最后一层结点不是满的,那么要求左满右不满。2.它通常用数组来实现。 具体方法就是将二叉树的结点按照层级顺序放入数组中,根结点在位置1,它的子结点在位置2和3,而子结点的子结点则分别在位置4,5,6和7,以此类推。A,E,G,H,I,N,O,P,R,S,T 如果一个结点的原创 2021-08-02 23:04:18 · 493 阅读 · 0 评论 -
二叉树(链表实现)--应用案例(最大深度、折纸问题)
二叉树–最大深度、折纸问题二叉树的最大深度问题需求: 给定一棵树,请计算树的最大深度(树的根节点到最远叶子结点的最长路径上的结点数); 上面这棵树的最大深度为4。实现:public int maxDepth():计算整个树的最大深度private int maxDepth(Node x):计算指定树x的最大深度实现步骤:1.如果根结点为空,则最大深度为0;2.计算左子树的最大深度;3.计算右子树的最大深度;4.当前树的最大深度=左子树的最大深度和右子树的最大深度中的较大者+原创 2021-07-26 00:02:07 · 391 阅读 · 0 评论 -
二叉树(链表实现)--前序、中序、后序、层序遍历
二叉树(链表实现)–前序、中序、后序、层序遍历 我们把树简单的画作上图中的样子,由一个根节点、一个左子树、一个右子树组成,那么按照根节点什么时候被访问,我们可以把二叉树的遍历分为以下三种方式:1.前序遍历; 先访问根结点,然后再访问左子树,最后访问右子树2.中序遍历; 先访问左子树,中间访问根节点,最后访问右子树3.后序遍历; 先访问左子树,再访问右子树,最后访问根节点如果我们分别对下面的树使用三种遍历方式进行遍历,得到的结果如下:前序遍历public Queu原创 2021-07-25 22:48:01 · 3928 阅读 · 0 评论 -
二叉树(链表实现)--增、删、改、查
二叉树(链表实现)1.1 树的基本定义 树是我们计算机中非常重要的一种数据结构,同时使用树这种数据结构,可以描述现实生活中的很多事物,例如家谱、单位的组织架构、等等。 树是由n(n>=1)个有限结点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。树具有以下特点:每个结点有零个或多个子结点;没有父结点的结点为根结点;每一个非根结点只有一个父结点;每个结点及其后代结点整体上可以看做是一棵树,称为当前结点的父结点的一个子树;原创 2021-07-25 07:03:01 · 684 阅读 · 1 评论 -
符号表(以及有序符号表)
符号表 符号表最主要的目的就是将一个键和一个值联系起来,符号表能够将存储的数据元素是一个键和一个值共同组成的键值对数据,我们可以根据键来查找对应的值。 符号表是利用单链表实现的,原先的链表的结点只有item和next数据,而实现符号表的链表的结点为key、value、next数据 符号表中,键具有唯一性。 符号表在实际生活中的使用场景是非常广泛的,见下表:应用查找目的键值字典找出单词的释义单词释义图书索引找出某个术语相关的页码术语一串页码原创 2021-07-22 17:12:56 · 975 阅读 · 0 评论 -
队列
队列 队列是一种基于先进先出(FIFO)的数据结构,是一种只能在一端进行插入,在另一端进行删除操作的特殊线性表,它按照先进先出的原则存储数据,先进入的数据,在读取数据时先读被读出来。队列的API设计方法名方法功能public boolean isEmpty()判断队列是否为空,是返回true,否返回falsepublic int size()获取队列中元素的个数public T dequeue()从队列中拿出一个元素public void enqueu原创 2021-07-22 15:28:44 · 65 阅读 · 0 评论 -
栈
栈 栈是一种基于先进后出(FILO)的数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。我们称数据进入到栈的动作为压栈,数据从栈中出去的动作为弹栈。/** * 栈--单链表实现(头结点位置是栈顶) */public class Stack<T> implements Iterable<T> { // 记录首结点原创 2021-07-22 15:26:24 · 57 阅读 · 0 评论 -
栈--逆波兰表达式求值
栈–逆波兰表达式求值中缀表达式: 中缀表达式就是我们平常生活中使用的表达式,例如:1+3*2,2-(1+3)等等,中缀表达式的特点是:二元运算符总是置于两个操作数中间。 中缀表达式是人们最喜欢的表达式方式,因为简单,易懂。但是对于计算机来说就不是这样了,因为中缀表达式的运算顺序不具有规律性。不同的运算符具有不同的优先级,如果计算机执行中缀表达式,需要解析表达式语义,做大量的优先级相关操作逆波兰表达式(后缀表达式) 逆波兰表达式是波兰逻辑学家J・卢卡西维兹(J・ Lukasewicz)于原创 2021-07-22 10:55:07 · 250 阅读 · 0 评论 -
循环链表–约瑟夫问题
循环链表–约瑟夫问题问题描述: 传说有这样一个故事,在罗马人占领乔塔帕特后,39 个犹太人与约瑟夫及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,第一个人从1开始报数,依次往后,如果有人报数到3,那么这个人就必须自杀,然后再由他的下一个人重新从1开始报数,直到所有人都自杀身亡为止。然而约瑟夫和他的朋友并不想遵从。于是,约瑟夫要他的朋友先假装遵从,他将朋友与自己安排在第16个与第31个位置,从而逃过了这场死亡游戏 。问题转换:41个人坐原创 2021-07-20 23:48:23 · 59 阅读 · 0 评论 -
单链表–快慢指针(中间值,是否有环,环的入口)
单链表–快慢指针(中间值,是否有环,环的入口) 快慢指针指的是定义两个指针,这两个指针的移动速度一块一慢,以此来制造出自己想要的差值,这个差值可以然我们找到链表上相应的结点。一般情况下,快指针的移动步长为慢指针的两倍中间值问题(代码见最后) 利用快慢指针,我们把一个链表看成一个跑道,假设a的速度是b的两倍,那么当a跑完全程后,b刚好跑一半,以此来达到找到中间节点的目的。 如下图,最开始,slow与fast指针都指向链表第一个节点,然后slow每次移动一个指针,fast每次移动两个指针。原创 2021-07-20 23:26:16 · 247 阅读 · 1 评论 -
双向链表
双向链表 双向链表也叫双向表,是链表的一种,它由多个结点组成,每个结点都由一个数据域和两个指针域组成,数据域用来存储数据,其中一个指针域用来指向其后继结点,另一个指针域用来指向前驱结点。链表的头结点的数据域不存储数据,指向前驱结点的指针域值为null,指向后继结点的指针域指向第一个真正存储数据的结点。双向链表API设计方法名方法功能public void clear()空置线性表publicboolean isEmpty()判断线性表是否为空,是返回true,否返回原创 2021-07-20 20:57:13 · 199 阅读 · 0 评论 -
单向链表+反转链表
单向链表+反转链表 单向链表是链表的一种,它由多个结点组成,每个结点都由一个数据域和一个指针域组成,数据域用来存储数据,指针域用来指向其后继结点。链表的头结点的数据域不存储数据,指针域指向第一个真正存储数据的结点。单向链表API设计:方法名方法作用public void clear()空置线性表publicboolean isEmpty()判断线性表是否为空,是返回true,否返回falsepublic int length()获取线性表中元素的个数p原创 2021-07-20 20:25:51 · 214 阅读 · 0 评论 -
数据结构--线性表--顺序表
顺序表 顺序表是在计算机内存中以数组的形式保存的线性表,线性表的顺序存储是指用一组地址连续的存储单元,依次存储线性表中的各个元素、使得线性表中在逻辑结构上相邻的数据元素存储在相邻的物理存储单元中,即通过数据元素物理存储的相邻关系来反映数据元素之间逻辑上的相邻关系。顺序表的实现顺序表的API方法名方法功能public void clear()空置线性表public boolean isEmpty()判断线性表是否为空,是返回true,否返回falsepubli原创 2021-07-20 07:26:03 · 97 阅读 · 0 评论