算法与数据结构
文章平均质量分 92
孙靖俊
这个作者很懒,什么都没留下…
展开
-
并查集讲解
什么是并查集并查集是一种数据结构,用来快速查询集合元素之间是否有关系,是否有关系判断标准是是否有相同的根节点举一个恰当的例子,要判断图谱中的两个元素是否有关系,如果使用常规的查询方法,时间复杂度比较大,使用并查集就是用来优化这种情况,使得判断两个元素是否有关联可以达到O(1)普通查询思路按照上图,要判断11和4是否有关系,我们可以一直向上追溯父亲节点,11的上层是9,9的上层节点是0,那么11的祖父节点就是0。同理,追溯4的祖父节点是0,那么这两个节点的祖父节点都是0,则两个节点有关系知道了思原创 2020-11-01 14:54:12 · 339 阅读 · 1 评论 -
图的概述——存储及遍历
文章目录存储结构邻接矩阵邻接表十字链表存储结构遍历问题深度优先遍历广度优先遍历最短路径图是最容易理解的数据结构,和生活息息相关,比如地铁站之间的换乘,地图等等都是图的表现。在计算机中有几种常用的图的存储方式,一起来看一下存储结构邻接矩阵邻接矩阵是一个n*n的矩阵,n代表图中节点的个数,矩阵中的每个点的横坐标和纵坐标则代表了一条边,比如(1,2)则代表顶点1到顶点2的边。对于不带权有向图,矩阵中的值有两类,0和1,1代表两个顶点之间是可达的,0则代表两个顶点之间不可达,如下图如果是带权有向图,则1原创 2020-09-09 15:53:17 · 522 阅读 · 0 评论 -
go语言实现迷宫的广度优先遍历
迷宫的求解是非常常见的问题了,今天这里记录使用go语言来完成广度优先遍历 要求时从文件中读出一个数字矩阵,0表示可以通行,1表示不可以。要求给出一条路径从左上角到右下角,使得路径的长度最短,可以使用6来标识路径,比如: 这里需要说明的是,既然是找到最短路径,必须使用广度优先搜索来进行实现,广度优先搜索或许没有深度优先搜索快,但是找到的路径肯定是最短的,在上面的例子中其实已经展示的比...原创 2020-04-28 00:44:19 · 583 阅读 · 0 评论 -
红黑树讲解及实现(Java)
红黑树作为二叉树的难点,一直是面试中的加分项,今天一起来看一下认识红黑树 首先来解释一下红黑树是什么,有什么作用,为小白科普一下该数据结构的定位,说到红黑树,就不得不提BST树,BST树是搜索二叉树,比该节点小的元素都在该节点的左侧,比该节点大的元素都在该节点的右侧,一张图来了解一下: 如果数据结构是这样的,我要找40,首先和50进行比较,比50小,就去50的左边找,然后和30比较...原创 2019-11-04 14:54:12 · 326 阅读 · 0 评论 -
BST树 面试题(Java)
文章目录求BST树的镜像反转把bst树中满足[begin,end]区间的所有元素打印出来求BST树的镜像反转镜像的意思很明显,就是左右交换,举个例子:镜像后:检验代码编写是否正确可以通过树的中序遍历,搜索二叉树的中序遍历是一个严格的升序,镜像后是一个严格的逆序。思路:通过递归遍历的过程,不断的交换左右子树,直到叶子节点。这样遍历完成后,所有的左右子树都被交换了一遍,就实现了镜像。实...原创 2019-07-30 13:45:35 · 683 阅读 · 0 评论 -
链表 面试题(Java)
链表的逆置给定一个单链表,实现链表的逆置功能思路:在前面的单链表练习中,讲到了头插,头插的链表和正常的序列是刚好相反的,利用这点来进行链表的逆置代码讲解:使用cur指针指向第一个数据域,把head单独拿出来,重新对head头插一次,在头插中,cur的next域要先把head的next域接过来,然后把head的next置为cur,这样做的话会丢失cur后面的所有未插入节点,就要使用一个指针ne...原创 2019-09-25 08:22:56 · 804 阅读 · 0 评论 -
Java实现BST:搜索二叉树
、原创 2019-07-10 09:30:43 · 1189 阅读 · 2 评论 -
Java实现AVL:平衡搜索二叉树
首先来介绍一下什么是AVL(平衡搜索二叉树),我们都知道BST(搜素二叉树)在查询某个值的时候时间复杂度可以达到O(logn),但这个时间复杂度是最好的,如果按照BST树的插入,我要按顺序插入1,2,3,4,5这几个数字,那么最终的BST树是这样的这棵树的所有节点的左孩子都为空,这样不就成了一个链表了,如果要搜索一个数字,那么时间复杂度就为O(n),AVL就是使这棵BST树平衡的一种策略,所以...原创 2019-08-06 22:09:06 · 445 阅读 · 0 评论 -
Java实现整数划分
整数的划分问题:将正整数n表示成一系列正整数之和,n=n1+n2+…+nk,其中n1>=n2>=…>=nk>=1,k>=1。举个简单的例子6的划分:6;5+1;4+2,4+1+1;3+3,3+2+1,3+1+1;2+2+2,2+2+1+1,2+1+1+1+1;1+1+1+1+1+1;通过写这个例子不难发现其中的递推关系每个分号为一组,该组最大的加数...原创 2019-06-18 14:18:58 · 3387 阅读 · 2 评论 -
Java实现全排列
全排列是什么问题?直接举例说明1,2,3的全排列有1,2,31,3,22,1,32,3,13,1,23,2,1共6种,这是一个简单的排列组合问题,算法思路:dfs+回溯这样的问题很容易想到递归,定义perm(R)是集合R的全排列,ri是R集合中第i个元素,Ri是R集合中去除ri剩下的元素,即R-ri。要求perm(R),即r1,perm(R1) … … ri,perm(...原创 2019-06-05 13:26:58 · 34617 阅读 · 0 评论 -
排序算法-归并排序(Java实现)
我们先来了解归并的大致过程是什么我们举一组例子:我们设两组指针,start1和start2,end1和end2,start2=end+1我们首先让每组元素的个数为1,那么也就是说start1=end1,start2=end2.我们另外开启一个数组来合并这两组数,定义一个临时数组tmpArr,第一组数已经走完了,这下我们就可以直接把第二组数拉过来,放入tmpArr现在e1和e2都没...原创 2019-03-14 20:54:34 · 1357 阅读 · 1 评论 -
排序算法-堆排序(Java实现)
堆排序的算法思想是利用大根堆最大的数在最顶层,然后把得出的最大的数从这个序列 删除,剩下的数继续构造出大根堆,得到最大的数,这样以此类推得出最后一个数 举一组数把这些数字以堆的形式展现我们以最后一棵小子树开构建大根堆,也就是下面红框选中的部分把31拿出来和子树比较,因为该树只有左子树,所以只需要和左子树进行比较,发现1比31小,所以无需交换,然后换至下一棵树。因为是倒叙构建才能不断...原创 2019-03-12 22:49:05 · 504 阅读 · 0 评论 -
排序算法-冒泡排序(Java实现)
冒泡排序是排序算法的入门算法,算法思想是每次把最小的数字往上浮,完成一趟排序后就可以发现最大的数字被沉底了,然后第二趟第二大的数字也沉底了,就这样依次类推完成排序。我们来看一组数字我们把这组数字竖起来更符合冒泡的想法先比较11和3,3比11小,所以3往上浮,完成交换继续与下一个比较然后比较11和5,完成交换,继续比较继续比较,交换… …当比较到最后的时候到这里11这...原创 2019-03-12 17:20:28 · 206 阅读 · 1 评论 -
排序算法-直接选择(Java实现)
直接选择是简单排序,算法思想是从第一个数字开始,与后面的每个数字进行比较,如果该数字小了,那么就把两数进行交换,这样一轮下来第一个数字肯定是最小的数字,然后第二个数字开始与后面的数字进行比较,思想是一样的,这样的话,第二小的数字就到了第二个位置,这样依次类推,排序就完成了。来举一组例子:这样一组数字进行选择排序先拿到第一个数字5,然后与4进...原创 2019-03-12 17:12:53 · 444 阅读 · 0 评论 -
排序算法-希尔Shell排序(Java实现)
    希尔排序是插入排序的进化版,因为插入排序的特点是越有序,越快,所以我们就想办法利用这个特点,让待排序列有间隔的进行插入排序,经过几轮序列就会大致有序,这样再普通插入排序就完成了排序。我们来举一组例子我们先来定义一组间隔,我们将间隔定位5,2,1先根据间隔5,进行插入排序先画出第一组间隔为5的数字在这三个数字开始插入排序然后找出后面的几...原创 2019-03-12 17:02:31 · 413 阅读 · 0 评论 -
排序算法-插入排序(Java实现)
直接插入排序是指从第二个数字开始从后往前插入,将当前数字依次与前面的数字进行比较,到最后一个数字完成了依次比较整个排序也就完成了。这个过程可以理解为在玩打牌游戏的时候,插牌的过程。 我们知道这个排序需要两个循环,外层循环就是从第二个数字开始向后遍历,而内层循环就是把外层循环的当前数字与前面的数字依次比较...原创 2019-03-12 16:34:36 · 218 阅读 · 0 评论 -
排序算法-快速排序(Java实现)
快排是我们经常用到的经典排序算法之一,今天就来彻底的学习一下快排吧文章目录算法思想代码实现-固定基准法代码实现-随机选取基准法代码实现-三分取中法快排优化-小序列优化快排优化-相同元素优化非递归实现快排最坏时间复杂度达到O(n log n)算法思想 快速排序是指在待排序列中选取一个基准,然后把不比该基准大的放在基准的前面,...原创 2019-09-16 11:55:07 · 6693 阅读 · 1 评论 -
BF算法(Java实现)
作为字符串的入门算法,一起来认识一下BF算法 BF算法,即暴风(Brute Force)算法,是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串T的第一个字符进行匹配,若相等,则继续比较S的第二个字符和 T的第二个字符;若不相等,则比较S的第二个字符和T的第一个字符,依次比较下去,直到得出最后的匹配结果。B...原创 2019-09-16 21:01:15 · 1744 阅读 · 2 评论 -
KMP算法(Java实现)
KMP算法同BF算法一样,也是字符串匹配算法,BF算法是主串指针与子串指针一一进行比较,如果失配,那么主串和子串的指针都需要进行回退,而KMP的算法思想是主串指针不回退,子串的指针只需要回退到一定的位置也可以完成字符串的匹配,学习一下吧KMP算法的原理这里我只是为了解析KMP的代码,原理问题就不花时间分析了直接来看大话数...原创 2019-09-19 15:01:18 · 869 阅读 · 1 评论 -
细说Java中的数据结构-栈
说到栈,或许不会陌生,先进后出,后进先出等等的特点,但是Java中如何去使用栈,很多人都会谈到Java中实现的Stack类原创 2019-09-26 10:30:16 · 592 阅读 · 0 评论 -
Java实现双向链表
双向链表就是有两个指针域,一个指向前一项,一个指向后一项,单向链表只可以正向遍历,而双向链表不但可以正向遍历,而且可以反向遍历。数据结构节点类 class Entry { private int data; private Entry pre; private Entry next; public Entry() { ...原创 2019-09-23 12:09:07 · 324 阅读 · 0 评论 -
约瑟夫环问题
约瑟夫环问题是单向循环单链表的应用,通过该问题一起来巩固一下单向循环链表。 约瑟夫问题:已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围,从编号为k的人开始报数,数到m的那个人出列,他的下一个人又从1开始报数,数到m的那个人又出列,依次规律重复...原创 2019-09-20 23:23:08 · 378 阅读 · 0 评论 -
Java实现单向链表和单向循环链表
首先来构造数据结构,这里单链表的节点类是以内部类的形式出现数据结构节点类:节点类中应该有数据域和指针域 /** * 节点类 */ class Entry { //数据域 private int data; //指针域 private Entry next; //无参构造函数 ...原创 2019-09-20 13:26:38 · 651 阅读 · 0 评论 -
二分搜索(Java实现)
说到查找数组的中的某个元素,首先需要再次声明的是,数组访问的时间复杂度是O(1),而查找元素的时间复杂度是O(n) 二分搜索是数组查找元素中的一个小的考点,一起来看一下吧 二分搜索的原...原创 2019-09-20 11:26:58 · 417 阅读 · 0 评论 -
二分图匹配算法(KM算法和暴力搜索)
什么是二分图的匹配问题? 二分即将图中的顶点分为两类,一类顶点中可以匹配另一类顶点,组成一组带权的关系,求如何匹配总权值最大。通过一个例题来看一下:运动员最佳配问题。羽毛球队有男女运动员各n人。给定两个nXn矩阵P和Q。P[i][i]是男运动员i和女运动员j配对组成混合双打的竞赛优势;Q[i][j]是女运动员i和男运动员...原创 2019-09-16 21:33:02 · 1084 阅读 · 0 评论 -
细说Java中的数据结构-队列
队列的特点:先进先出,Java中实现队列可以分为数组队列和链式队列,如果使用数组队列会存在队列空间越用越小的问题,所以数组队列可以优化成循环队列。 在Java中如果要使用队列,可以使用类LinkedList,该类对于队列提供了一些方法:offer:入队...原创 2019-09-26 13:47:16 · 329 阅读 · 0 评论 -
栈和队列:面试题(Java)
两个队列实现一个栈使用两个队列完成栈的功能,思路:如上图,入队顺序为:1 2 3 4 5,如果要模拟栈的功能,那么就要上5先弹出来,因为是队列,所以只能从1开始出,把1 2 3 4存到另外一个队列中,这样就可以把5弹出来了:这样就完成了一次出栈,这下上面的队列为空,所有的数据存储在下面这个队列中:如果要继续出栈,那么就把1 2 3 挪到空的队列中,弹出4,到这里已经明白了如何模拟出...原创 2019-09-27 15:16:44 · 7853 阅读 · 3 评论