
《java数据结构与算法》系列
这是关于数据结构和算法的一个综合课程专栏。利用最常用的java语言讲述数据结构和算法的核心内容。深入浅出。
良缘白马
IT行业苟且偷生的了三年的程序猿.
展开
-
《java数据结构和算法》结束了!
前言2020.2.10-2020.4.20 历时七十多天,我终于学完了数据结构和算法,同时完成了这一博客栏目的编写。回过头看看,Eclipse中数个项目文件,十几个包,数十个class文件,还有CSDN中的60篇文章以及git的一次次的git push,可以说是是对这个学习历程的记录吧,很欣慰自己能坚持学完专栏的来源今天学完了这个栏目,我想告诉大家的是,其实这个专栏是我写的,但并不是...原创 2020-04-20 19:13:02 · 458 阅读 · 0 评论 -
算法与数据结构学习(59)-程序员常用10种算法(马踏棋盘算法)
马踏棋盘算法介绍马踏棋盘算法也被称为骑士周游问题将马随机放在国际象棋的8×8棋盘Board[0~7][0~7]的某个方格中,马按走棋规则(马走日字)进行移动。要求每个方格只进入一次,走遍棋盘上全部64个方格骑士周游(马踏棋盘)问题的解决步骤和思路创建棋盘 chessBoard , 是一个二维数组将当前位置设置为已经访问,然后根据当前位置,计算马儿还能走哪些位置,并放入到一个集合中(A...原创 2020-04-20 18:20:30 · 899 阅读 · 0 评论 -
算法与数据结构学习(58)-程序员常用10种算法(佛洛依德算法)
弗洛伊德(Floyd)算法介绍和Dijkstra算法一样,弗洛伊德(Floyd)算法也是一种用于寻找给定的加权图中顶点间最短路径的算法。该算法名称以创始人之一、1978年图灵奖获得者、斯坦福大学计算机科学系教授罗伯特·弗洛伊德命名弗洛伊德算法(Floyd)计算图中各个顶点之间的最短路径迪杰斯特拉算法用于计算图中某一个顶点到其他顶点的最短路径。弗洛伊德算法 VS 迪杰斯特拉算法:迪杰斯特拉...原创 2020-04-19 09:53:28 · 350 阅读 · 0 评论 -
算法与数据结构学习(57)-程序员常用10种算法(地杰斯特拉算法)
应用场景-最短路径问题实际应用场景战争时期,胜利乡有7个村庄(A, B, C, D, E, F, G) ,现在有六个邮差,从G点出发,需要分别把邮件分别送到 A, B, C , D, E, F 六个村庄各个村庄的距离用边线表示(权) ,比如 A – B 距离 5公里问:如何计算出G村庄到 其它各个村庄的最短距离?如果从其它点出发到各个点的最短距离又是多少?迪杰斯特拉(Dijkst...原创 2020-04-18 10:12:22 · 364 阅读 · 0 评论 -
算法与数据结构学习(56)-程序员常用10种算法(克鲁斯卡尔算法)
在学习算法之前我们必须要了解克鲁斯卡尔算法与prim算法一样,也是一种用于解决最小生成树问题的算法应用场景-公交站问题看一个应用场景和问题克鲁斯卡尔算法介绍克鲁斯卡尔(Kruskal)算法,是用来求加权连通图的最小生成树的算法。基本思想:按照权值从小到大的顺序选择n-1条边,并保证这n-1条边不构成回路具体做法:首先构造一个只含n个顶点的森林,然后依权值从小到大从连通网中选择边加入...原创 2020-04-15 11:27:57 · 281 阅读 · 0 评论 -
算法与数据结构学习(55)-程序员常用10种算法(普利姆算法)
普利姆算法应用场景问题转化最小生成树修路问题本质就是就是最小生成树问题, 先介绍一下最小生成树(Minimum Cost Spanning Tree),简称MST。给定一个带权的无向连通图,如何选取一棵生成树,使树上所有边上权的总和为最小,这叫最小生成树2.N个顶点,一定有N-1条边包含全部顶点N-1条边都在图中举例说明(如图:)求最小生成树的算法主要是普里姆算法和克鲁斯卡...原创 2020-04-14 17:44:58 · 257 阅读 · 0 评论 -
算法与数据结构学习(54)-程序员常用10种算法(贪心算法)
贪心算法介绍贪婪算法(贪心算法)是指在对问题进行求解时,在每一步选择中都采取最好或者最优(即最有利)的选择,从而希望能够导致结果是最好或者最优的算法贪婪算法所得到的结果不一定是最优的结果(有时候会是最优解) 但是都是相对近似(接近)最优解的结果贪心算法最佳应用-集合覆盖假设存在如下表的需要付费的广播台,以及广播台信号可以覆盖的地区。 如何选择最少的广播台,让所有的地区都可以接收...原创 2020-04-13 11:45:09 · 434 阅读 · 0 评论 -
算法与数据结构学习(53)-程序员常用10种算法(KMP算法)
应用场景-字符串匹配问题字符串匹配问题::有一个字符串 str1= ““硅硅谷 尚硅谷你尚硅 尚硅谷你尚硅谷你尚硅你好””,和一个子串 str2=“尚硅谷你尚硅你”现在要判断 str1 是否含有 str2, 如果存在,就返回第一次出现的位置, 如果没有,则返回-1暴力匹配算法如果用暴力匹配的思路,并假设现在str1匹配到 i 位置,子串str2匹配到 j 位置,则有:如果当前字符...原创 2020-04-10 15:19:59 · 237 阅读 · 0 评论 -
算法与数据结构学习(52)-程序员常用10种算法(动态规划算法)
动态规划算法介绍动态规划(Dynamic Programming)算法的核心思想是:将大问题划分为小问题进行解决,从而一步步获取最优解的处理算法动态规划算法与分治算法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的。 ( 即下一个子阶段的求解是建立...原创 2020-04-09 17:18:39 · 427 阅读 · 0 评论 -
算法与数据结构学习(51)-程序员常用10种算法(分治算法)
分治算法介绍分治法是一种很重要的算法。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)……分治算法可以求解的一些经典问题二分搜索大整数乘法棋盘覆盖合并排序快速...原创 2020-04-08 16:12:36 · 294 阅读 · 0 评论 -
算法与数据结构学习(50)-程序员常用10种算法(非递归的二分查找)
二分查找算法(非递归)介绍前面我们讲过了二分查找算法,是使用递归的方式,下面我们讲解二分查找算法的非递归方式二分查找法只适用于从有序的数列中进行查找(比如数字和字母等),将数列排序后再进行查找二分查找法的运行时间为对数时间O(㏒₂n) ,即查找到需要的目标位置最多只需要㏒₂n步,假设从[0,99]的队列(100个数,即n=100)中寻到目标数30,则需要查找步数为㏒₂100 , 即最多需要...原创 2020-04-08 14:38:19 · 229 阅读 · 0 评论 -
算法与数据结构学习(49)-图的广度优先(BFS)
广度遍历基本思想图的广度优先搜索(Broad First Search) 。类似于一个分层搜索的过程,广度优先遍历需要使用一个队列以保持访问过的结点的顺序,以便按这个顺序来访问这些结点的邻接结点广度优先遍历算法步骤访问初始结点v并标记结点v为已访问。结点v入队列当队列非空时,继续执行,否则算法结束。出队列,取得队头结点u。查找结点u的第一个邻接结点w。若结点u的邻接结点w不存在,...原创 2020-04-01 21:22:50 · 353 阅读 · 0 评论 -
算法与数据结构学习(48)-图的深度优先(DFS)
图遍历介绍所谓图的遍历,即是对结点的访问。一个图有那么多个结点,如何遍历这些结点,需要特定策略,一般有两种访问策略:(1)深度优先遍历 (2)广度优先遍历图的深度优先搜索(Depth First Search)深度优先遍历,从初始访问结点出发,初始访问结点可能有多个邻接结点,深度优先遍历的策略就是首先访问第一个邻接结点,然后再以这个被访问的邻接结点作为初始结点,访问它的第一个邻接结点, ...原创 2020-03-28 11:23:01 · 240 阅读 · 0 评论 -
算法与数据结构学习(47)-图的基本介绍
为什么要有图?前面我们学了线性表和树线性表局限于一个直接前驱和一个直接后继的关系树也只能有一个直接前驱也就是父节点当我们需要表示多对多的关系时, 这里我们就用到了图基本介绍图的举例说明图是一种数据结构,其中结点可以具有零个或多个相邻元素。两个结点之间的连接称为边。 结点也可以称为顶点。如图:图的常用概念顶点(vertex)边(edge)路径无向图有向图带权图...原创 2020-03-28 10:57:58 · 195 阅读 · 0 评论 -
算法与数据结构学习(46)-B树、B+树和B*树
B树的介绍B-tree树即B树,B即Balanced,平衡的意思。有人把B-tree翻译成B-树,容易让人产生误解。会以为B-树是一种树,而B树又是另一种树。实际上,B-tree就是指的B树。前面已经介绍了2-3树和2-3-4树,他们就是B树(英语:B-tree 也写成B-树),这里我们再做一个说明,我们在学习Mysql时,经常听到说某种类型的索引是基于B树或者B+树的,如图:B树的说明:...原创 2020-03-27 11:25:32 · 2373 阅读 · 0 评论 -
算法与数据结构学习(45)-二叉树和B树
二叉树的问题分析二叉树需要加载到内存的,如果二叉树的节点少,没有什么问题,但是如果二叉树的节点很多(比如1亿), 就存在如下问题:问题1:在构建二叉树时,需要多次进行i/o操作(海量数据存在数据库或文件中),节点海量,构建二叉树时,速度有影响问题2:节点海量,也会造成二叉树的高度很大,会降低操作速度.多叉树在二叉树中,每个节点有数据项,最多有两个子节点。如果允许每个节点可以有更多...原创 2020-03-27 11:08:48 · 149 阅读 · 0 评论 -
算法与数据结构学习(44)-平衡二叉树(AVL树)
看一个案例(说明二叉排序树可能的问题)给你一个数列{1,2,3,4,5,6},要求创建一颗二叉排序树(BST), 并分析问题所在创建二叉排序树结果如下:由于二叉排序树的概念的限制,递增的数据在构建二叉排序树的是偶就会形成如上的形式,其结构很类似于链表的结构。对于这个二叉排序树,他的插入删除还是很快的,但是他的查询速度就很慢,因为每次都要判断是左还是右子树。上图中BST 存在的问题分析:...原创 2020-03-23 12:00:00 · 457 阅读 · 0 评论 -
算法与数据结构学习(43)-二叉排序树
先看一个需求给你一个数列 (7, 3, 10, 12, 5, 1, 9),要求能够高效的完成对数据的查询和添加。解决方案分析1.使用数组数组未排序, 优点:直接在数组尾添加,速度快。 缺点:查找速度慢. [示意图]数组排序,优点:可以使用二分查找,查找速度快,缺点:为了保证数组有序,在添加新数据时,找到插入位置后,后面的数据需整体移动,速度慢。[示意图]2.使用链式存储-链表不管链表...原创 2020-03-21 20:47:57 · 217 阅读 · 0 评论 -
算法与数据结构学习(42)-赫夫曼编码
赫夫曼编码基本介绍1.赫夫曼编码也翻译为 哈夫曼编码(Huffman Coding),又称霍夫曼编码,是一种编码方式, 属于一种程序算法2.赫夫曼编码是赫哈夫曼树在电讯通信中的经典的应用之一。3.赫夫曼编码广泛地用于数据文件压缩。其压缩率通常在20%~90%之间4.赫夫曼码是可变字长编码(VLC)的一种。Huffman于1952年提出一种编码方法,称之为最佳编码原理剖析通信领域...原创 2020-03-14 11:29:48 · 799 阅读 · 0 评论 -
算法与数据结构学习(41)-赫夫曼树
赫夫曼树基本介绍给定n个权值作为n个叶子结点,构造一棵二叉树,若该树的带权路径长度(wpl)达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree), 还有的书翻译为霍夫曼树。赫夫曼树是带权路径长度最短的树,权值较大的结点离根较近。赫夫曼树几个重要概念和举例说明1.路径和路径长度:在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。通...原创 2020-03-13 16:36:41 · 1032 阅读 · 0 评论 -
算法与数据结构学习(40)-堆排序的实现
堆排序的基本思想堆排序的基本思想是:1.将待排序序列构造成一个大顶堆2.此时,整个序列的最大值就是堆顶的根节点。3.将其与末尾元素进行交换,此时末尾就为最大值。4.然后将剩余n-1个元素重新构造成一个堆,这样会得到n个元素的次小值。如此反复执行,便能得到一个有序序列了。实际应用理解要求:给你一个数组 {4,6,8,5,9} , 要求使用堆排序法,将数组升序排序。初始结构如下:代...原创 2020-03-12 21:56:51 · 178 阅读 · 0 评论 -
算法与数据结构学习(39)-树结构的实际应用
堆排序1.堆排序基本介绍1.堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序。2.堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆, 注意 : 没有要求结点的左孩子的值和右孩子的值的大小关系。3.每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆4.大顶堆举例...原创 2020-03-11 20:26:03 · 224 阅读 · 0 评论 -
算法与数据结构学习(38)-树结构(遍历线索化二叉树)
说明:对上一节的中序线索化的二叉树, 进行遍历分析:因为线索化后,各个结点指向有变化,因此原来的遍历方式不能使用,这时需要使用新的方式遍历线索化二叉树,各个节点可以通过线型方式遍历,因此无需使用递归方式,这样也提高了遍历的效率。 遍历的次序应当和中序遍历保持一致。代码实现遍历线索化二叉树的方法:threadeList()public void threadeList() { //定义一...原创 2020-03-11 20:15:45 · 126 阅读 · 0 评论 -
算法与数据结构学习(37)-树结构(线索化二叉树)
先看一个问题将数列 {1, 3, 6, 8, 10, 14 } 构建成一颗二叉树. n+1=7问题分析:当我们对上面的二叉树进行中序遍历时,数列为 {8, 3, 10, 1, 14,6 }但是 6, 8, 10, 14 这几个节点的 左右指针,并没有完全的利用上.如果我们希望充分的利用 各个节点的左右指针, 让各个节点可以指向自己的前后节点,怎么办?解决方案-线索二叉树线索二叉...原创 2020-03-11 18:32:34 · 138 阅读 · 0 评论 -
算法与数据结构学习(36)-树结构(顺序存储二叉树)
顺序存储二叉树的概念基本说明从数据存储来看,数组存储方式和树的存储方式可以相互转换,即数组可以转换成树,树也可以转换成数组,看下面的示意图。要求:1.上图的二叉树的结点,要求以数组的方式来存放 arr : [1, 2, 3, 4, 5, 6, 7]2.要求在遍历数组 arr时,仍然可以以前序遍历,中序遍历和后序遍历的方式完成结点的遍历顺序存储二叉树的特点:1.顺序二叉树通常只考...原创 2020-03-10 11:54:35 · 230 阅读 · 0 评论 -
算法与数据结构学习(35)-树结构(二叉树结点的删除)
二叉树-删除节点要求1.如果删除的节点是叶子节点,则删除该节点2.如果删除的节点是非叶子节点,则删除该子树.3.测试,删除掉 5号叶子节点 和 3号子树.完成二叉树删除结点的操作:规定:1.如果删除的节点是叶子节点,则删除该节点2.如果删除的节点是非叶子节点,则删除该子树.思路:首先先处理:考虑如果树是空树root,如果就只有一个root结点,则将二叉树置空//然后进行下面...原创 2020-03-09 13:01:15 · 520 阅读 · 0 评论 -
算法与数据结构学习(34)-树结构(二叉树的前中后序查找)
二叉树-查找指定节点要求1.请编写前序查找,中序查找和后序查找的方法。2.并分别使用三种查找方式,查找 heroNO = 5 的节点3.并分析各种查找方式,分别比较了多少次使用前序、中序、后序方式来查询指定的结点前序查找思路:1.先判断当前结点的no是否等于要查找的2.如果是相等,就直接返回当前结点3.如果不相等,则判断当前结点的左节点是否为空,如果不为空,则递归前序查找4.如...原创 2020-03-08 11:10:34 · 187 阅读 · 0 评论 -
算法与数据结构学习(33)-树结构(基础)
为什么使用树结构1.数组存储方式的分析优点:通过下标方式访问元素,速度快。对于有序数组,还可使用二分查找提高检索速度。缺点:如果要检索具体某个值,或者插入值(按一定顺序)会整体移动,效率较低 [示意图]2.链式存储方式的分析优点:在一定程度上对数组存储方式有优化(比如:插入一个数值节点,只需要将插入节点,链接到链表中即可, 删除效率也很好)。缺点:在进行检索时,效率仍然较低,比如(检索...原创 2020-03-07 18:27:26 · 273 阅读 · 0 评论 -
算法与数据结构学习(32)-哈希表
首先,先向大家说明哈希表是一种数据结构,不是数组哈希表(散列)-Google上机题有一个公司,当有新的员工来报道时,要求将该员工的信息加入(id,性别,年龄,住址…),当输入该员工的id时,要求查找到该员工的 所有信息.要求: 不使用数据库,尽量节省内存,速度越快越好=>哈希表(散列)哈希表基本介绍散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而...原创 2020-03-06 12:10:17 · 207 阅读 · 0 评论 -
算法与数据结构学习(31)-斐波那契(黄金分割法)查找算法
斐波那契(黄金分割法)查找1.黄金分割点是指把一条线段分割为两部分,使其中一部分与全长之比等于另一部分与这部分之比。取其前三位数字的近似值是0.618。由于按此比例设计的造型十分美丽,因此称为黄金分割,也称为中外比。这是一个神奇的数字,会带来意向不大的效果。2.斐波那契数列 {1, 1, 2, 3, 5, 8, 13, 21, 34, 55 } 发现斐波那契数列的两个相邻数 的比例,无限接近 ...原创 2020-03-06 10:26:43 · 611 阅读 · 0 评论 -
算法与数据结构学习(30)-插值查找
插值查找原理介绍1.插值查找算法类似于二分查找,不同的是插值查找每次从自适应mid处开始查找。2.将折半查找中的求mid 索引的公式 , low 表示左边索引left, high表示右边索引right.key 就是前面我们讲的 findVal3.int mid = low + (high - low) * (key - arr[low]) / (arr[high] - arr[low]...原创 2020-03-05 16:40:28 · 354 阅读 · 0 评论 -
算法与数据结构学习(29)-二分查找
思路分析首先确定该数组的中间的下标mid = (left + right) / 2然后让需要查找的数 findVal 和 arr[mid] 比较2.1 findVal > arr[mid] , 说明你要查找的数在mid 的右边, 因此需要递归的向右查找2.2 findVal < arr[mid], 说明你要查找的数在mid 的左边, 因此需要递归的向左查找2.3 fi...原创 2020-03-04 11:30:54 · 427 阅读 · 0 评论 -
算法与数据结构学习(28)-线性查找
查找算法介绍在java中我们常用的查找算法有四种:顺序(线性)查找二分查找/折半查找插值查找斐波那契查找线性查找算法思路:对于给定的数据,按顺序从前往后或者从后往前按序查到相应的值,如果找到,返回数据所对应的下标代码实现/** * title:顺序查找 * date :2020.3.4 */package search;public class SeqSear...原创 2020-03-04 11:04:37 · 227 阅读 · 0 评论 -
算法与数据结构学习(27)-排序算法时间复杂度比较
常用排序算法的总结和对比关于排序算法的各种介绍如图:相关术语解释:1.稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面;2.不稳定:如果a原本在b的前面,而a=b,排序之后a可能会出现在b的后面;3.内排序:所有排序操作都在内存中完成;4.外排序:由于数据太大,因此把数据放在磁盘中,而排序通过磁盘和内存的数据传输才能进行;5.时间复杂度: 一个算法执行所耗费的时间。6...原创 2020-03-04 10:41:07 · 407 阅读 · 0 评论 -
你的算法和数据结构过关了吗?看看这些你会不会(算法与数据结构java版目录)
前言对于从事IT行业的人员来说,数据结构和算法可以说是核心中的核心。本人在假期期间通过自己学习和记笔记的方式,总结了以下部分的java版本的数据结构和算法的有关知识和代码。希望对于学习java基础之后想要进阶的同学有所帮助。目录结构1. 数据结构和算法的介绍2. 稀疏数组3. 队列(1)4. 队列(2)5. 链表(1)6. 链表(2)7. 单链表面试题(新浪、腾讯、百度)8. ...原创 2020-03-03 13:29:28 · 336 阅读 · 0 评论 -
算法与数据结构学习(26)-基数排序(桶排序)
基数排序(桶排序)介绍1.基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,它是通过键值的各个位的值,将要排序的元素分配至某些“桶”中,达到排序的作用2.基数排序法是属于稳定性的排序,基数排序法的是效率高的稳定性排序法3.基数排序(Radix Sort)是桶排序的扩展4.基数排序是...原创 2020-03-03 11:17:20 · 358 阅读 · 0 评论 -
算法与数据结构学习(25)-归并排序
归并排序介绍归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。归并排序思想示意图-基本思想说明:可以看到这种结构很像一棵完全二叉树,本文的归并排序我们采用递归去实现(也可...原创 2020-03-02 11:52:44 · 202 阅读 · 0 评论 -
算法与数据结构学习(24)-快速排序
快速排序法介绍快速排序(Quicksort)是对冒泡排序的一种改进。基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列快速排序法示意图代码实现package sort;import java.text.SimpleDateF...原创 2020-03-02 10:53:25 · 384 阅读 · 0 评论 -
算法与数据结构学习(23)-希尔排序
插入排序可能存在为题我们看简单的插入排序可能存在的问题.数组 arr = {2,3,4,5,6,1} 这时需要插入的数 1(最小), 这样的过程是:{2,3,4,5,6,6}{2,3,4,5,5,6}{2,3,4,4,5,6}{2,3,3,4,5,6}{2,2,3,4,5,6}{1,2,3,4,5,6}结论: 当需要插入的数是较小的数时,后移的次数明显增多,对效率有影响.希尔排...原创 2020-03-01 20:28:53 · 266 阅读 · 0 评论 -
算法与数据结构学习(22)-插入排序
插入排序法介绍插入式排序属于内部排序法,是对于欲排序的元素以插入的方式找寻该元素的适当位置,以达到排序的目的。插入排序法思想插入排序(Insertion Sorting)的基本思想是:把n个待排序的元素看成为一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,把它的排序码依次与有序表元素的排序码进行比较,将它插入到有序表中...原创 2020-02-27 18:31:51 · 232 阅读 · 0 评论