
Java数据结构
一只不吃老鼠的猫
我们一路奋战,不是为了改变世界,而是为了不让世界改变我们!
展开
-
字符串的模式匹配(BF算法,KMP算法)
模式匹配含义:给定两个字符串,在主串s中查找子串T的过程就称为字符串的模式匹配。BF算法:基本思想就是暴力匹配,将子串的第一个字符与主串的第一个字符进行比较,若相等,则比较第二个字符。若不相等,则与主串的第二个字符进行比较,以此类推,直到匹配到为止。代码如下: //返回模式串t在主串中从start开始的第一次匹配位数 public int indexOf(SeqString t,int start){ if (this!=null && t!=null &am原创 2020-10-19 19:39:34 · 1881 阅读 · 0 评论 -
图——最短路径,Dijstra算法
前几天讲了加权无向图的最小生成树,而今天讲的最短路径就是加权有向图的最小生成树。定义:在一幅加权有向图中,从顶点s到顶点v的最短路径就是顶点s到顶点v所有路径中权重最小的那条路径。如图所示:性质:①路径具有方向性②权重不一定等价于距离,权重最小指的是成本最低③只考虑连通图④最短路径不一定是唯一的,只需要找出一条即可。成员变量private DirectedEdge[] edgeTo :索引代表顶点,值表示从顶点s到当前顶点的最短路径上的最后一条边private double[] dis原创 2020-07-29 15:54:20 · 535 阅读 · 0 评论 -
图——加权有向图
1.1 加权有向图边的表示完整代码//加权有向图的边public class DirectedEdge { private final int v;//起点 private final int w;//终点 private final double weight;//当前权重 // 通过顶点v和w,以及权重weight值构造一个边对象 public DirectedEdge(int v,int w,double weight){ this.v=原创 2020-07-28 12:59:20 · 854 阅读 · 0 评论 -
图——最小生成树,贪心算法,Prim算法,Kruskal算法
之前我们讲解了加权无向图,但是我们怎样才能找到路径最短的边呢?这就需要最小生成树的知识了。1.1.1 定义:图的生成树是它的一个含有其所有顶点的无环连通子图,一个加权无向图的最小生成树是它的权值(树中所有边的权值之和)最小的生成树·1.1.2 树的性质:1.用一条边连接任意两个顶点都会产生一个环2.删除树中任意一条边,会得到两棵独立的树。1.1.3 切分定理①切分:将图中的所有顶点划分为两个非空且没有交集的集合。②横切边:连接属于不同集合的顶点的边叫做横切边。③切分定理:在一幅加权图中,原创 2020-07-28 12:46:53 · 838 阅读 · 0 评论 -
图——加权无向图
所谓加权无向图,就是给连接两个顶点的边赋一个值。这在日常生活中有非常广泛的应用,例如:查找两地间用时最短的火车票,或者金钱成本最低的飞机票。1.1 加强无向图边构造方法 private int v; private int w; private double weight; //获取边上的权重值 public double getWeight(){ return weight; } //获取边上一个点 public int ei原创 2020-07-27 17:39:28 · 1206 阅读 · 0 评论 -
图——有向图,拓扑排序
1.1 有向图定义:边不仅仅连接两个顶点,并且具有方向。有向图除了边具有方向以外,并无多大不同,因此代码的实现也相差无几。仅仅多了一个反向图,用以得到指向v的其他顶点,并用队列存储。反向图public Queue<Integer> adj(int v){ return adj[v]; } //该图的反向图 public Digraph reverse(){ //创建有向图对象 Digraph r = new Di原创 2020-07-26 21:19:39 · 1189 阅读 · 0 评论 -
图——无向图,深度优先搜索,广度优先搜索,路径查找
**定义:**图是由一组顶点和能够将两个顶点连接起来的边构成的。**无向图:**边只连接两个顶点,没有其他含义。**有向图:**边不仅仅连接两个顶点,并且具有方向。图的存储结构①邻接矩阵5很明显,邻接矩阵的空间复杂度是平方级别的,当处理问题规模较大的时候,内存可能不够用。②邻接表邻接表的空间复杂度比邻接矩阵小得多,因此以后就用邻接表的存储形式来存储图。接下来用代码来实现图构造方法 //顶点数目 private final int V; //边的数目 privat原创 2020-07-25 18:01:34 · 1943 阅读 · 0 评论 -
并查集,并查集的优化,路径压缩
结构并查集是一种树形的数据结构。它有以下几个特点:1.每个元素都唯一的对应一个结点;2.每一组数据中的多个元素都在同一颗树中;3.一个组中的数据对应的树和另外一个组中的数据对应的树之间没有任何联系;4.元素在树中并没有子父级关系的硬性要求;作用1.查询元素p和q是否在同一组中2.合并元素p和q所在的组构造方法1.初始情况下,每个元素都在一个独立的分组中,所以,初始情况下,并查集中的数据默认分为N个组;2.初始化数组eleAndGroup;3.把eleAndGroup数组的索引看做是每原创 2020-07-24 13:08:45 · 359 阅读 · 0 评论 -
B-树,B+树
1.1 B-树特性:B树中允许一个结点存储多个键值对,数量不确定,需看具体情况而定。选一个参数M,来创建一个B树,它具右以下几个特点。①每个结点最多含有M-1个key,并以升序排列②每个结点最多含有M个子结点③跟结点至少含有两个子结点应用:从磁盘中读取到主存的文件就保存在B树中的结点中。1.2 B+树B+树是B树的一种变形树,它与B树的区别为:①非叶子结点仅具有索引作用,即非叶子结点只存储key,不存储value。②树的所有叶子结点构成一个有序链表,可以按照key排序遍历所有数据。原创 2020-07-23 12:40:06 · 229 阅读 · 0 评论 -
平衡树,2-3查找树,红黑树
前言之前学习的二叉查找树,它的查询效率比链表和数组高很多。但在某些情况下,它的性能还是很糟糕。如下图:效率低的原因在于这个树并不平衡,因此需要平衡树来提高查询效率。1.1 2—3查找树一个2-3查找树含有三个内容。①空链接②2-结点:含有一个键和两条链,左链指向的键小于该键,右链指向的键大于该键。③3-结点:含有两个键和三条链,左链接指向的2-3树中的键都小于该结点,中链接指向的2-3树中的键都位于该结点的键之间,右链接指向的2-3树中的键都大于该结点。性质任意空链接到根结点的路径长原创 2020-07-22 15:02:38 · 285 阅读 · 0 评论 -
最大优先队列,最小优先队列,索引优先队列
优先队列普通队列是一种先进先出的数据结构,元素在队尾追加,在队列头删除。然而在某些情况下,我们需要找到最大值,最小值,或某些特定元素进行删除,这个时候我们就可以用优先队列来实现这种需求。1.1 最大优先队列可以获取并删除队中最大的值。实现方式和上篇讲的堆大同小异,因此不再细讲。public class MaxPriorityQueue<T extends Comparable<T>> { private T[] items; private int N;原创 2020-07-21 20:38:30 · 427 阅读 · 0 评论 -
堆,堆排序
1.1 堆定义:可以看做是完全二叉树的数组对象特性:①它是完全二叉树②用数组来实现(0索引处不存储元素)③如果一个结点的位置为k,则它的父结点的位置是k/2,它的左子结点和右子结点的位置分别是2k,2k+1.④每个结点都大于它的两个子结点,但左子结点不一定小于右子结点。(与二叉树所不同的地方)构造方法 private T[] items; private int N; public Heap(int capacity){ this.items=(T [])new Comp原创 2020-07-20 19:07:55 · 217 阅读 · 0 评论 -
二叉树,二叉树的基础遍历,层序遍历,最大深度问题
1.1 树定义:树是由n(n>=1)个有限结点组成一个具有层次关系的集合。如图所示:特点:1.每个结点具有一个或多个结点2.没有父结点的称为根结点,如图中的A3.每个非根结点只有一个父结点4.每个结点及其下面的结点可以看做一个树,称为当前结点父结点的一个子树1.2 二叉树定义:二叉树是度不超过2的树,即每个结点最多有两个子结点。满二叉树:每个结点都有两个子结点。如图所示完全二叉树:叶结点(即没有子结点的结点)只能出现在最下层和次下层,并且最下层的结点都集中在最左边若干位置的二叉树原创 2020-07-19 16:49:33 · 499 阅读 · 0 评论 -
线性表——符号表
符号表符号表最主要的目的是将一个键和一个值联系起来。如下图所示:下边我们用链表的形式来创建符号表类。插入方法public void put(key key,value value){ //符号表中已经存在键为key的键值对,找到并替换值为value即可 Node n=head; while (n.next!=null){ n=n.next; //判断n结点的键是否为key,如果是,则替换n结点的值原创 2020-07-16 12:54:21 · 470 阅读 · 0 评论 -
线性表——链表,反转链表(面试高频题目),双向链表,中间值问题
链表含义:链表是一种物理存储单元上非连续的存储结构,数据元素的逻辑顺序是通过链表中的指针指向来表示的。相关功能代码:结点类每个结点都由一个数据域和一个指针域组成,数据域用来存储数据,指针域用来指向其后续结点。头结点不存储数据,指针域指向第一个真正存储数据的结点。 private class Node { T item; Node next; public Node(T item, Node next) { this.item原创 2020-07-14 14:49:04 · 298 阅读 · 0 评论 -
线性表——顺序表
一,线性表线性表是最基本,最简单,也是最常用的数据结构。一个线性表是n个具有相同特性的数据元素的数列。它包含了顺序表,链表,栈,队列,接下来将会一一介绍。1.1顺序表顺序表是在计算机内存中以数组形式保存的线性表,通俗点说,即通过数据元素物理上的相邻关系来表示逻辑上的相邻关系。相关功能的代码如下:添加元素//向线性表中添加元素 public void insert(T t){ if (N==list.length){ resize(2*list.l原创 2020-07-14 13:09:16 · 269 阅读 · 0 评论 -
数据结构——简单排序,高级排序,快速排序
一,简单排序1.冒泡排序原理:比较相邻元素的大小,如果前一个元素比后一个大,则交换元素的位置。代码实现:以下两个方法将多次用到,之后不再一一重复。交换两个元素的位置public static void ech(Comparable[] a,int i,int j) { Comparable temp; temp=a[i]; a[i]=a[j]; a[j]=temp; //交换两个元素的位置 }比较两个元素的大小public static boolean原创 2020-07-10 18:50:49 · 628 阅读 · 0 评论 -
数据结构基本知识点
1.1 数据结构:把数据元素按照一定关系组织起来的集合,用来组织和存储数据。分类:可以分为逻辑结构和物理结构两大类。逻辑结构分类:a.集合结构:集合中的数据元素除了属于一个集合外,没有任何联系。b.线性结构:存在一一对应关系。c.树形结构:存在一对多的关系。d.图形结构:存在多对多的关系。物理结构分类(也叫做存储结构):a.顺序存储结构:将数据元素放在连续的存储单元里边,例如数组。弊端:插入或添加元素时,整个结构都处在变化中。b.链式存储结构: 将数据元素放在任意的存储单元里边。通过指针原创 2020-07-06 14:38:49 · 566 阅读 · 0 评论 -
约瑟夫问题,循环链表
问题描述传说有这样一个故事,在罗马人占领乔塔帕特后,39个犹太人与约瑟夫及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,第一个人从1开始报数,依次往后,如果有人报数到3,那么这个人就必须自杀,然后再由他的下一个人重新从1开始报数,直到所有人都自杀身亡为止。然而约瑟夫和他的朋友并不想遵从。于是,约瑟夫要他的朋友先假装遵从,他将朋友与自己安排在第16个与第31个位置,从而逃过了这场死亡游戏。要解决这个问题,我们先来了解一下循环链表。循环链表所原创 2020-07-15 13:22:07 · 610 阅读 · 0 评论 -
线性表——栈,队列
1.3 栈栈是一种先进后出的数据结构。只能在一端进行插入和删除操作的特殊线性表。将数据进入栈称为压栈,数据出去称为弹栈。在这里我们用链表的形式表示栈,感兴趣的同学也可以用顺序表的形式来表示。压栈public void push(T t){ //找到首结点指向的第一个结点 Node oldfirst = head.next; //创建新结点 Node newNode = new Node(t,null); //让首结点指向原创 2020-07-15 13:53:17 · 379 阅读 · 0 评论