数据结构与算法
文章平均质量分 92
数据结构java版全解
Modify_QmQ
保持热爱,奔赴山海
展开
-
马踏棋盘算法(Java代码实现)
马踏棋盘算法介绍和游戏演示马踏棋盘算法也被称为骑士周游问题将马随机放在国际象棋的 8X8 棋盘Board[0~7] [0~7]的某个方格中,马按走棋规则(马走日字)进行移动。要求每个方格只进入一次,走遍棋盘上全部64个方格...原创 2020-06-01 22:37:32 · 1967 阅读 · 0 评论 -
算法——弗洛伊德算法(求最短路径 Java代码实现)
弗洛伊德(Floyd)算法介绍和迪杰斯特拉算法一 样, 弗洛伊德(Floyd)算法也是一种用于寻找给定的加权图中顶点间最短路径的算法。弗洛伊德算法(Floyd)计算图中各个顶点之间的最短路径迪杰斯特拉算法用于计算图中某-一个顶点到其他项点的最短路径。弗洛伊德算法VS迪杰斯特拉算法:迪杰斯特拉算法通过选定的被访问顶点,求出从出发访问顶点到其他项点的最短路径:弗洛伊德算法中每-个顶点都是出发访问点,所以需要将每-一个顶点看做被访问顶点,求出从每一个顶点到其他顶点的最短路径。弗洛伊德(Floyd)算原创 2020-06-01 18:26:36 · 1053 阅读 · 1 评论 -
算法——迪杰斯特拉算法(求最短路径 Java代码实现)
求最短路径问题:有7个村庄(A,B,C,D,E,F,G),现在有六个邮差,从G点出发,需要分别把邮件分别送到A,B,C,D,E,F六个村庄各个村庄的距离用边线表示(权),比如A-B距离5公里问:如何计算出G村庄到其它各个村庄的最短距离?如果从其它点出发到各个点的最短距离又是多少?迪杰斯特拉(Dijkstra)算法介绍迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径。它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止。.原创 2020-06-01 16:10:06 · 1038 阅读 · 0 评论 -
算法——克鲁斯卡尔算法(Java代码实现)
算法——普利姆算法(Java代码实现)原创 2020-05-31 15:51:19 · 499 阅读 · 0 评论 -
算法——普利姆算法(Java代码实现)
面对的问题:有7个村庄(A,B,C,D,E,EG),现在需要修路把7个村庄连通各个村庄的距离用边线表示(权),比如A-B距离5公里问:如何修路保证各个村庄都能连通,并且总的修建公路总里程最短?思路:将10条边,连接即可,但是总的里程数不是最小.正确的思路,就是尽可能的选择少的路线,并且每条路线最小,保证总里程数最少最小生成树:修路问题本质就是就是最小生成树问题,先介绍一 下最 小生成树(Minimum Cost Spanning Tree,简称MST.给定一个带权的无向连通图,如何选原创 2020-05-30 17:33:42 · 544 阅读 · 0 评论 -
算法——贪心算法(集合覆盖 -- Java代码实现)
贪心算法介绍贪婪算法(贪心算法)是指在对问题进行求解时,在每一步选择中都采取最好或者最优(即最有利)的选择,从而希望能够导致结果是最好或者最优的算法。贪婪算法所得到的结果不一定是最优的结果(有时候会是最优解),但是都是相对近似(接近)最优解的结果。...原创 2020-05-30 16:16:53 · 979 阅读 · 0 评论 -
KMP算法详解(解决字符串匹配问题)Java代码
在对于字符串匹配的过程中,通常使用的是暴力匹配,也就说把字符串一一比较,直到匹配成功就进行返回输出。代码实现如下所示:package StrMatching;public class violencematching { public static int match(String str1, String str2) { char[] s1 = str1.toCharArray(); char[] s2 = str2.toCharArray(); int s1len = s1.len原创 2020-05-28 21:31:29 · 678 阅读 · 0 评论 -
算法——动态规划算法(Java代码实现)
动态规划(Dynamic Programming)算法的核心思想是:将大问题划分为小问题进行解决,从而一步步获取最优解的处理算法动态规划算法与分治算法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。动态规划与分治法不同的是:适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的。(即下一个子阶段的求解是建立在上一个子阶段的解的基础上,进行进一步的求解)动态规划可以通过填表的方式来逐步推进,得到最优解.背包问题有一个背包,背包总承重原创 2020-05-28 10:47:01 · 991 阅读 · 0 评论 -
算法——分治算法(汉诺塔的实现 Java代码)
分治法是一种很重要的算法。字面上的解释是“分面治之”.就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题,直到最后子问题可以简单的直按求解,原问题的解即子问题的解的合井。这个技巧是很多高效算法的基础,如排序算法(快速排序,归并撞序),傅立叶变换(快速傅立叶变换)。使用分治算法可以解决排序当中的归并排序:归并排序 单击前往!➢汉诺塔游戏的演示和思路分析: .如果是有一个盘,A->C如果我们有n>=2情况,我们总是可以看做是两个盘1.最下边的盘2.上面的盘原创 2020-05-27 17:53:22 · 274 阅读 · 0 评论 -
数据结构——图的遍历方法(Java代码实现)
所谓图的遍历,即是对结点的访问。-一个图有那么多个结点,如何遍历这些结点,需要特定策略,一般有两种访问策略: (1)深度优先遍历 (2)广度优先遍历图的深度优先遍历介绍 深度优先遍历基本思想:图的深度优先搜素(Depth FirstSearch):DFS深度优先遍历,从初始访问结点出发,初始访问结点可能有多个邻接结点,深度优先遍历的策略就是首先访问第一个邻接结点。 然后再以这个被访问的邻接结点作为初始结点,访问它的第一个邻接结点,可以这样理解: 每次都在访问完当前结点后首先访问当前结点的第一个邻接结原创 2020-05-26 20:40:12 · 3415 阅读 · 1 评论 -
数据结构——图简介(java代码实现邻接矩阵)
图:图是一种数据结构,其中节点可以具有一个或者多个相邻元素,俩个节点的连接称为边,节点也称为顶点。图的表示方式邻接矩阵邻接矩阵是表示图形中顶点之间相邻关系的矩阵,对于n个顶点的图而言,矩阵是的row和col表示的是1…n个点。邻接表邻接矩阵需要为每个顶点都分配n个边的空间,其实有很多边都是不存在,会造成空间的一定损失.邻接表的实现只关心存在的边,不关心不存在的边。因此没有空间浪费,邻接表由数组+链表组成图的邻接矩阵代码实现:import java.util.ArrayList;im原创 2020-05-26 15:10:58 · 1338 阅读 · 1 评论 -
数据结构——多叉树、B树
二叉树存在的问题:二叉树需要加载到内存的,当如果二叉树的节点很多的时候,就存在如下问题问题1:在构建叉树时,需要多次进行 I/O 操作海量数据存在数据库或文件中),节点海量,构建二叉树时,速度有影响问题2:节点海量,也会造成二叉树的高度很大,会降低操作速度解决这个问题就需要使用到多叉树:在二叉树中,每个节点有数据项,最多有两个子节点。如果允许每个节点可以更多的数据项和更多的子节点,就是多叉树(multiwaytree)多叉树通过重新组织节点,减少树的高度,能对二叉树进行优化。2-3树的原创 2020-05-26 11:51:01 · 681 阅读 · 0 评论 -
数据结构——平衡二叉树(Java代码实现)
当对一个数组[1,2,3,4,5,6,]创建排序二叉树的时候看起来更像是一个链表,这个时候就需要使用到平衡二叉树。基本介绍平衡二叉树也叫平衡二叉搜索树(Self-balancing binarysearchtree)又被称为AVL树,可以保证查询效率较高。具有以下特点:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。 平衡二叉树的常用实现方法有红黑树、AVL、替罪羊树、Treap、 伸展树等。二叉排序树和平衡二叉树的转化进行左旋转.创建一个新的节原创 2020-05-25 20:10:23 · 912 阅读 · 0 评论 -
数据结构——二叉排序树(Java代码实现)
二叉排序树: BST: (Binary Sort(Search) Tree),对于二叉排序树的任何一个非叶子节点,要求左子节点的值比当前节点的值小,右子节点的值比当前节点的值大。特别说明:如果有相同的值,可以将该节点放在左子节点或右子节点...原创 2020-05-24 18:42:52 · 637 阅读 · 1 评论 -
赫夫曼编码(压缩与解压 Java代码实现)
简单编码有一个字符串:"hello world " 是先把字符串转换为ASCLL码,再把10进制的ASCLL码转换成2进制的数进行编码。赫夫曼编码有一个字符串:“hello world” 统计每一个字母出现的次数h : 1 e : 1 l : 3 o : 2 w : 1r : 1d : 1 :1根据次数构建出一棵赫夫曼树:根据赫夫曼树,给各个字符,规定编码,向左的路径为0向右的路径为1,编码如上图:使用得到的编码把字符串进行编码:得到 11110111110010111011原创 2020-05-22 22:04:46 · 330 阅读 · 0 评论 -
数据结构——赫夫曼树(Java代码实现)
➢ 基本介绍给定n个权值作为n个叶子结点,构造一棵二叉树,若该树的带权路径长度(WPL)达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树。赫夫曼树是带权路径长度最短的树,权值较大的结点离根较近。➢ 概念说明路径和路径长度:在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。通路中分支的数目称为路径长度。若规定根结点的层数为1,则从根结点到第L层结点的路径长度为L-1。结点的权及带权路径长度:若将树中结点赋给一个有着某种含 义的数值,则这个数值称为该结点的权。结点的带权原创 2020-05-21 17:48:58 · 485 阅读 · 0 评论 -
数据结构之排序算法——堆排序(Java实现)
➢ 基本介绍堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为0(n log n),它也是不稳定排序。堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆,注意:没有要求结点的左孩子的值和右孩子的值的大小关系。每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆大顶堆举例说明大顶堆特点: arr[i]>=arr[2*i+1] && arr[i] >=arr[2*i+2] //i原创 2020-05-21 16:42:41 · 246 阅读 · 0 评论 -
二叉树的顺序存储(Java代码实现)
➢基本说明从数据存储来看,数组存储方式和树的存储方式可以相互转换,即数组可以转换成树,树也可以转换成数组,用数组存放树,但是需要保留左右指针。➢ 顺序存储二叉树的特点:顺序二叉树通常只考虑完全二叉树第n个元素的左子节点为 2*n+1第n个元素的右子节点为 2*n+2第n个元素的父节点为 (n-1)/2n:表示二叉树中的第几个元素(按0开始编号)示例:一个1234567的二叉树 使用顺序存储代码实现:定义一个ArrBinarytree类,定义一个arr数组,并且添加构造方法,初始化原创 2020-05-16 21:26:49 · 779 阅读 · 2 评论 -
二叉树的前序中序后序遍历、查找的实现(Java代码实现)
在前一篇文章对二叉树进行的部分介绍:数据结构—— 树(二叉树)详解 在后面当中简介了一下遍历方法,随后对遍历方法实现:对一棵二叉树的代码实现,首先对每一个节点定义一个节点类,节点类定义no和name,用于标识节点,以及一个左指针和右指针。这里使用私有变量private,所以需要对这些变了进行getter/setter封装。代码省略。定义构造方法,进行初始化。往下,重写toString方法,用于输出节点信息。最后就是对前序中序后序的方法实现。class Node { private int no; p原创 2020-05-14 20:19:34 · 2828 阅读 · 1 评论 -
数据结构—— 树(二叉树)详解
结构示意图:树的常用术语(结合示意图理解):节点 :ABCD这些都是节点根节点:没有父节点,A就是根节点父节点:相对而言,A是B和C的父节点子节点:反之,B和C就是A的子节点叶子节点(没有子节点的节点) :EFGH就是叶子结点节点的风(节点值)路径(从root节点找到该节点的路线) A到H的路径就是 ABDH层:一共有4层子树:DH是A或者B的子树树的高度(最大层数)二叉树的概念及知识点二叉树: 每个节点最多只能有两个子节点的一种形式称为二叉树。如果该二叉树的所有叶子节点都原创 2020-05-14 17:52:57 · 2639 阅读 · 0 评论 -
哈希表(对员工信息进行操作)Java代码实现
➢ 基本介绍散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。➢ 实现问题把员工的信息进行插入,不使用数据库,根据id进行查找员工的时候越快越好➢ 思路分析图解代码实现首先需要定义一个员工类,包含了id和姓名以及指向下一个节点的next指针:class Emp { public int id; public原创 2020-05-14 15:11:01 · 485 阅读 · 0 评论 -
查找算法——斐波那契(黄金分割法) Java实现
黄金分割点:取前三位 0.618菲波那契数列 {1,1,2,3,5,8,13},我们会发现俩个相邻数的比值无限接近于0.618斐波那契查找原理与前两种(二分、插值)相似,仅改变了中间结点(mid) 的位置,mid不再是中间或插值得到,而是位于黄金分割点附近,即middle = left + F(k-1)-1 (F代表斐波那契数列)。由斐波那契数列 F (k) =F(x-1) + F(k-2) 的性质, 可以得到(F(k)-1) = ( F (k-1)-1) + (F(k-2) -1) +1。该式说明原创 2020-05-13 21:32:26 · 519 阅读 · 0 评论 -
查找算法——插值查找(Java实现)
当我们的数组是一个从1到100的有序数组的时候,况且这个时候需要查找的是1,使用二分查找的话,很显然是比较麻烦的。这个时候就要使用到插值查找。插值查找算法类似于二分查找,不同的是插值查找每次从自适应middle处开始查找。自适应的middle的计算如下:int middle= left + (right - left) * (value- arr [ left ] ) / ( arr [ right ] - arr [ left ] )➢ 代码实现 public static int insert原创 2020-05-13 20:31:34 · 448 阅读 · 0 评论 -
查找算法——二分查找(递归与非递归 Java代码实现)
➢ 二分查找思路分析:首先确定该数组的中间的下标 mid= (left +right) / 2然后让需要查找的数 findVal 和 arr[mid] 比较2.1 findVal> arr[mid] ,说明你要查找的数在mid的右边,因此需要递归的向右查找2.2 findalar[mid],说明你要查找的数在mid的左边,因此需要递归的向左查找2.3 findVal== ar[mid]说明找到,就返回二分查找的前提是数组时有序的。➢ 代码实现:使用递归思维:查找其中的一个元素,返回原创 2020-05-12 21:24:46 · 306 阅读 · 0 评论 -
查找算法——线性查找(Java代码实现)
线性查找简言之就是简单的对数组进行遍历,返回结果:定义一个方法:传递进来一个数组以及一个需要查找的值,对数组进行遍历。找到直接返回。在这路只能找到第一个满足条件的值。 public static int linear(int[] arr, int value) { for (int i = 0; i < arr.length; i++) { if (arr[i] == value) { // 找到一个满足条件就返回 return i; } } return原创 2020-05-12 20:31:26 · 361 阅读 · 0 评论 -
数据结构之排序算法——基数排序(Java实现)
➢ 基本介绍基数排序(桶排序)介绍:基数排序(radixsort)属于“分配式排序”( distributionsort),又称“桶子法”( bucket sort)或binsort, 顾名思义,它是通过键值的各个位的值,将要排序的元素分配至某些“桶”中,达到排序的作用基数排序法是属于稳定性的排序,基数排序法的是效率高的稳定性排序法基数排序(Radix Sort)是桶排序的扩展基数排序是1887年赫尔曼何乐礼发明的。它是这样实现的:将整数按位数切割成不同的数字,然后按每个位数分别比较。➢ 基原创 2020-05-12 18:13:13 · 667 阅读 · 0 评论 -
数据结构之排序算法——归并排序(Java实现)
➢ 基本介绍归并排序 (MERGE-SORT) 是利用归并的思想实现的排序方法,该算法采用经典的分治 ( divide-and-conquer) 策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案修补在一起,即分而治之)。...原创 2020-05-12 15:09:35 · 448 阅读 · 0 评论 -
线性表的实现
1.定义一个接口public interface ILinarList <E>{ boolean add(E item); boolean add(int i, E item); E remove (int i); int indexOf(E item); E get(int i); int size(); void clear(); boolean isEmpty(...原创 2019-09-18 16:53:53 · 227 阅读 · 0 评论 -
数据结构之排序算法——快速排序(Java实现)
➢ 基本介绍快速排序(Quicksort) 是对冒泡排序的一种改进。基本思想是:通过一趟排序,将要排序 的数据分割成独立的两部分,其中一部分的所有 数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。...原创 2020-05-12 10:52:23 · 279 阅读 · 0 评论 -
数据结构之排序算法——希尔排序(Java实现)
➢ 基本介绍希尔排序是希尔(DonaldShell) 于1959年提出的一种排序算法。希尔排序也是一种插入排序,它是简单插入排序经过改进之后的-一个更高效的版本,也称为缩小增量排序。➢ 希尔排序基本思想希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序; 随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止...原创 2020-05-11 20:52:59 · 328 阅读 · 0 评论 -
数据结构之排序算法——插入排序(Java实现)
➢ 基本介绍插入式排序属于内部排序法,是对于欲排序的元素以插入的方式找寻该元素的适当位置,以达到排序的目的。➢ 插入排序思想:插入排序(Insertion Sorting)的基本思想是:把 n 个待排序的元素看成为一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中包含有 n-1 个元素,排序过程中每次从无序表中取出第一个元素,把它的排序码依次与有序表元素的排序码进行比较,将它插入...原创 2020-05-03 21:58:05 · 707 阅读 · 0 评论 -
数据结构之排序算法——选择排序(Java实现)
➢ 基本介绍选择式排序也属于内部排序法,是从欲排序的数据中,按指定的规则选出某一元素,再依规定交换位置后达到排序的目的。➢ 选择排序思想:选择排序(select sorting) 也是一种简单的排序方法。它的基本思想是:第一次从 arr[0] 到 arr[n-1] 中选取最小值,与 arr[0] 交换, 第二次从arr[1] 到 arr[n-1]中选取最小值, 与arr[1]交换,第三次从a...原创 2020-05-03 14:43:17 · 353 阅读 · 0 评论 -
数据结构之排序算法——冒泡排序(Java实现)
➢基本介绍冒泡排序(Bubble Sorting)的基本思想是:通过对待排序序列从前向后(从下标较小的元素开始) , 依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就象水底下的气泡一样逐渐向上冒。因为排序的过程中,各元素不断接近自己的位置,如果- -趟比较下来没有进行过交换,就说明序列有序,因此要在排序过程中设置一个标志flag判断元素是否进行过交换。从而减少不必要的...原创 2020-05-02 20:51:37 · 402 阅读 · 0 评论 -
算法的时间复杂度与空间复杂度详解 (Java)
时间复杂度➢ 时间复杂度概述一般情况下,算法中的基本操作语句的重复执行次数是问题规模n的某个函数,用T(n)表示, 若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n) /f(n)的极限值为不等于零的常数,则称f(n)是 T(n)的同数量级函数。记作T(n)=O(f(n)),称0(f(n))为算法的渐进时间复杂度,简称时间复杂度。T(n)不同, 但时间复杂度可能相同。如: T(n)=...原创 2020-05-02 16:29:50 · 385 阅读 · 0 评论 -
数据结构——使用递归回溯实现八皇后问题(Java代码实现)
1.问题描述八皇后问题,一个古老而著名的问题,是回溯算法的典型案例。该问题由国际西洋棋棋手马克斯·贝瑟尔于 1848 年提出:在 8×8 格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。高斯认为有 76 种方案。1854 年在柏林的象棋杂志上不同的作者发表了 40 种不同的解,后来有人用图论的方法解出 92 种结果。计算机发明后,...原创 2020-04-30 14:38:01 · 386 阅读 · 0 评论 -
数据结构——使用递归回溯实现迷宫问题(Java代码实现)
小球得到的路径,和程字员设置的找路策略有关即:找路的上下左右的顺序相关再得到小球路径时,可以先使用(下右上左),再改成(上右下左),看看路径是不是有变化测试回溯现象1.绘制地图如下图所示:1表示墙,不能走。 0表示可以走的点。使用一个二维数组进行构建地图。// 先创建一个二维数组模拟迷宫int[][] map = new int[8][7];// 使用 1 表示墙// 上下...原创 2020-04-30 12:11:11 · 428 阅读 · 0 评论 -
数据结构Java版之递归
递归的概念简单的说:递归就是方法自己调用自己,每次调用时传入不同的变量.递归有助于编程者解决复杂的问题,同时可以让代码变得简洁。递归的调用机制求阶乘的递归代码public static int Factorial(int n) { if (n == 1) { return 1; } else { return Factorial(n - 1) * n; }}打印问题的...原创 2020-04-29 16:38:09 · 177 阅读 · 0 评论 -
使用栈实现表达式的计算前缀、中缀、后缀表达式(逆波兰表达式)
前缀表达式的计算机求值从右至左扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(栈项元素和次顶元素),并将结果入栈;重复上述过程直到表达式最左端,最后运算得出的值即为表达式的结果。例如: (3+4)X5-6 对应的前缀表达式就是 - X + 3 4 5 6 ,针对前缀表达式求值步骤如下:原创 2020-04-28 22:07:41 · 2257 阅读 · 0 评论 -
栈 (使用数组实现Java代码和使用栈实现综合计算器)
栈的简介栈是一个先入后出的有序列表。栈(stack)是限制线性表中元素的插入和删除只能在线性表的同一端进行的一种特殊线性表。允许插大和删除的一端,为变化的一端,称为栈项(Top),另一端为固定的一 端, 称为栈底(Bottom)。根据栈的定义可知,最先放入栈中元素在栈底,最后放入的元素在栈顶,而删除元素刚好相反,最后放入的元素最先删除,最先放入的元素最后删除 使用数组实现栈栈的应用场景...原创 2020-04-23 20:31:08 · 265 阅读 · 0 评论 -
链表 LinkedList 单向环形链表(约瑟夫环问题,使用java代码实现)
约瑟夫问题为:设编号为1, 2, . n的n个人围坐一圈,约定编号为k (1<=k<=n)的人从1开始报数,数到m的那个人出列,它的下一位又从1开始报数,数到m的那个人又出列,依次类推,直到所有人出列为止,由此产生-个出队编号的序列。n=5,即有5个人 k=1,从第一个人开始报数 m=2,数2下如上图所示:出队列的顺序为 2 4 1 5 3创建单链表,实现添加节点功能...原创 2020-04-23 15:26:06 · 856 阅读 · 0 评论