![](https://img-blog.csdnimg.cn/20210114133121189.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
数据结构与算法
文章平均质量分 70
记录自己学习算法和数据结构时候的心得与体会
保温杯里泡代码
把握现在,未来可期
展开
-
稀疏数组(Java)
稀疏数组稀疏数组基本介绍代码实现结语稀疏数组基本介绍当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组记录数组一共有几行几列,有多少个不同的值把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模图解:代码实现package com.atschool.sparsearr;import java.io.*;/** * Description: * Author:江洋大盗 * Date:2020/11/28 22:01 */p原创 2021-01-23 16:50:40 · 45 阅读 · 0 评论 -
队列(Java)
队列的快速入门队列介绍数组模拟队列思路分析代码实现数组模拟环形队列代码实现结语队列介绍队列是一个有序列表,可以用数组或是链表来实现。遵循先入先出的原则。即:先存入队列的数据,要先取出;后存入的要后取出。使用数组模拟队列示意图:数组模拟队列思路分析队列本身是有序列表,若使用数组的结构来存储队列的数据,则队列数组的声明如下图,其中maxSize是该队列的最大容量。因为队列的输出、输入是分别从前后端来处理,因此需要两个变量front及rear分别记录队列前后端的下标,front会随原创 2021-01-23 16:39:09 · 71 阅读 · 0 评论 -
链表(Java)
链表介绍链表是有序链表,在内存中存储方式如下:链表是以节点的方式来存储,是链式存储每个节点包含data域,next域:指向下一个节点。如图发现链表的各个节点不一定是连续存储。链表分带头节点的链表和没有头节点的链表,根据实际的需求来确定。单链表(带头结点)逻辑结构示意图如下:单链表应用实例,使用单链表实现增删改查操作:首先创建一个节点类,(注:因为待会的双向链表使用的也是这个节点类,所以此类中写了两个指针,但是单向链表只需要使用一个即可)package com.athome.lin原创 2021-01-23 15:27:19 · 89 阅读 · 0 评论 -
栈(Java)
栈的总结栈的基本知识栈的介绍栈的应用场景栈的快速入门使用数组模拟栈使用链表模拟栈栈的实际应用前缀,中缀和后缀表达式的基本知识前缀表达式中缀表达式后缀表达式中缀表达式的计算逆波兰计算器的实现中缀转后缀的算法实现步骤结语栈的基本知识栈的介绍栈的英文为(stack)栈是一个先入后出(FILO-FirstInLastOut)的有序列表。栈(stack)是限制线性表中元素的插入和删除只能在线性表的同一端进行的一种特殊线性表。允许插入和删除的一端,为变化的一端,称为栈顶(Top),另一端为固定的一端,称为栈原创 2021-01-22 23:41:19 · 185 阅读 · 0 评论 -
递归解决迷宫问题和八皇后问题(Java)
递归递归的基本概念简单的说:递归就是方法自己调用自己,每次调用时传入不同的变量。递归有助于编程者解决复杂的问题,同时可以让代码变得简洁。递归调用机制图解递归需要遵守的重要原则执行一个方法时,就创建一个新的受保护的独立空间(栈空间)。方法的局部变量是独立的,不会相互影响,比如n变量。如果方法中使用的是引用类型变量(比如数组),就会共享该引用类型的数据。递归必须向退出递归的条件逼近,否则就是无限递归,出现(StackOverflowError,栈溢出错误)当一个方法执行完毕,或者遇到ret原创 2021-01-22 20:13:25 · 234 阅读 · 3 评论 -
常见排序算法的实现与总结(Java)
排序算法基本介绍排序算法(Sort Algorithm),是将一组数据,依指定的顺序进行排列的过程。排序算法的分类内部排序:指将需要处理的所有数据都加载到内部存储器(内存)中进行排序。外部排序:数据量过大,无法全部加载到内存中,需要借助外部存储(文件等)进行排序。图解:冒泡排序基本介绍:冒泡排序(BubbleSorting)的基本思想是通过对待排序序列从前向后(从下标较小的元素开始),依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就象水底下的气泡一样逐渐向上冒原创 2021-01-22 14:06:10 · 67 阅读 · 0 评论 -
斐波那契查找算法实现(Java)
斐波那契查找算法斐波那契查找算法思想介绍斐波那契搜索就是在二分查找的基础上根据斐波那契数列进行分割的。在斐波那契数列找一个等于略大于查找表中元素个数的数F[n],将原查找表扩展为长度为F[n](如果要补充元素,则补充重复最后一个元素,直到满足F[n]个元素),完成后进行斐波那契分割,即F[n]个元素分割为前半部分F[n-1]个元素,后半部分F[n-2]个元素,找出要查找的元素在那一部分并递归,直到找到。斐波那契查找算法原理分析斐波那契查找算法与二分法查找基本类似。不同的是二分法查找是折半查找,而原创 2021-01-21 21:35:58 · 164 阅读 · 0 评论 -
插值查找的实现与总结(Java)
插值查找算法插值查找原理介绍:插值查找算法类似于二分查找,不同的是插值查找每次从自适应mid处开始查找。公式推导:代码实现:package com.athome.search;/** * Description: * Author:江洋大盗 * Date:2021/1/21 18:48 */public class InsertValueSearch { public static void main(String[] args) { int[] arr原创 2021-01-21 19:45:07 · 90 阅读 · 0 评论 -
哈希表(Java)
哈希表基本介绍散列表(Hash table,也叫哈希表),是根据关键码值(Keyvalue)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。代码实现首先编写一个存放节点的类package com.athome.hashtab;/** * Description: * Author:江洋大盗 * Date:2021/1/21 16:12 */public class Hero {原创 2021-01-21 18:43:12 · 79 阅读 · 2 评论 -
使用动态规划解决01背包问题(Java)
动态规划的基本介绍在现实生活中,有一类活动的过程,由于它的特殊性,可将过程分成若干个互相联系的阶段,在它的每一阶段都需要作出决策,从而使整个过程达到最好的活动效果。因此各个阶段决策的选取不能任意确定,它依赖于当前面临的状态,又影响以后的发展。当各个阶段决策确定后,就组成一个决策序列,因而也就确定了整个过程的一条活动路线.这种把一个问题看作是一个前后关联具有链状结构的多阶段过程就称为多阶段决策过程,这种问题称为多阶段决策问题。在多阶段决策问题中,各个阶段采取的决策,一般来说是与时间有关的,决策依赖于当前状态原创 2021-01-17 18:25:09 · 625 阅读 · 0 评论 -
分治算法解决汉诺塔问题(Java)
分治算法思想介绍当我们求解某些问题时,由于这些问题要处理的数据相当多,或求解过程相当复杂,使得直接求解法在时间上相当长,或者根本无法直接求出。对于这类问题,我们往往先把它分解成几个子问题,找到求出这几个子问题的解法后,再找到合适的方法,把它们组合成求整个问题的解法。如果这些子问题还较大,难以解决,可以再把它们分成几个更小的子问题,以此类推,直至可以直接求出解为止。这就是分治策略的基本思想。解题步骤:分解,将要解决的问题划分成若干规模较小的同类问题;求解,当子问题划分得足够小时,用较简单的方法解决;原创 2021-01-17 15:31:19 · 125 阅读 · 0 评论 -
二分法查找的实现与总结(Java)
二分法查找基本介绍算法:二分法查找适用于数据量较大时,但是数据需要先排好顺序。主要思想是:(设查找的数组区间为array[low, high])确定该区间的中间位置K将查找的值T与array[k]比较。若相等,查找成功返回此位置;否则确定新的查找区域,继续二分查找。区域确定如下:a.array[k]>T 由数组的有序性可知array[k,k+1,……,high]>T;故新的区间为array[low,……,K-1]b.array[k]<T 类似上面查找区间为array[k+1,…原创 2021-01-17 10:56:05 · 157 阅读 · 0 评论 -
图(Java)
图的基本介绍图的引入线性表和树存在的不足:线性表局限于一个直接前驱和一个直接后继的关系。树也只能有一个直接前驱也就是父节点。这两种数据结构都无法表示多对多的关系,所以我们需要引入图的概念图的举例说明图是一种数据结构,其中结点可以具有零个或多个相邻元素。两个结点之间的连接称为边。结点也可以称为顶点。如图:图的常用概念顶点(vertex):即组成图的各个节点。边(edge):两个相关联的顶点的连线路径:从u到v的一条路径是指一个序列v0,e1,v1,e2,v2,…ek,vk,其中e原创 2021-01-16 22:09:28 · 301 阅读 · 0 评论 -
多路查找树
多路查找树二叉树的问题分析二叉树需要加载到内存的,如果二叉树的节点少,没有什么问题,但是如果二叉树的节点很多(比如1亿),就存在如下问题:在构建二叉树时,需要多次进行i/o操作(海量数据存在数据库或文件中),节点海量,构建二叉树时,速度有影响节点海量,也会造成二叉树的高度很大,会降低操作速度.多叉树2-3树2-3树是最简单的B树,具有如下特点:2-3树的所有叶子节点都在同一层(B树都满足这个特点)有两个子节点的节点叫做二节点,二节点要么没有子节点,要么有两个子节点。有三个子节点的节原创 2021-01-16 12:14:34 · 103 阅读 · 0 评论 -
平衡二叉树的实现与总结(Java)
平衡二叉树平衡二叉树的引入案例:给定数组{1,2,3,4,5,6},要求创建一棵二叉排序树(BST)。按照此数组创建的二叉排序树如图所示:分析上图BST树可发现如下问题所在:左子树全部为空,从形式上看,更像一个单链表查询速度明显降低,不能发挥BST的优势,因为每次还需要比较左子树,其查询速度比单链表还慢基于这些问题,我们的解决方案就是引入平衡二叉树平衡二叉树基本介绍平衡二叉树也叫平衡二叉搜索树(Self-balancing binary search tree)又被称为AVL树,可原创 2021-01-15 16:33:01 · 232 阅读 · 0 评论 -
二叉排序树的实现与总结(Java)
二叉排序树基本介绍二叉排序树:BST(BinarySort(Search)Tree),对于二叉排序树的任何一个非叶子节点,要求左子节点的值比当前节点的值小,右子节点的值比当前节点的值大。特别说明:如果有相同的值,可以将该节点放在左子节点或右子节点,尽量避免出现相同值给定数组{5,3,1,4,6,9},对应的二叉排序树如下所示:二叉排序树创建和遍历以及删除节点因为二叉树的创建与遍历比较简单,这里不做分析(注意,采用中序遍历二叉树结果才是按顺序输出)。着重分析二叉树的删除。二叉排序树删除节点的思原创 2021-01-14 22:18:07 · 180 阅读 · 0 评论 -
堆排序算法实现与总结(Java)
堆排序算法堆排序基本思想将待排序序列构造成一个大顶堆排序后,整个序列的最大值就是堆顶的根节点。将堆顶元素其与末尾元素进行交换,此时末尾元素就为最大值。然后将剩余 n - 1 个元素重新构造成一个大顶堆,这样会得到 n 个元素的次小值。如此反复执行,便能得到一个有序序列了堆排序步骤图解要求,给定数组{4,6,8,5,9},使用堆排序方法,升序排列步骤一:构造初始堆。将给定无序序列构造成一个大顶堆(一般升序采用大顶堆,降序采用小顶堆)。1.假设无序序列原始结构如下:2.此时我们从最后一原创 2021-01-14 13:24:06 · 128 阅读 · 0 评论 -
哈夫曼树实现与总结(Java)
哈夫曼树基本介绍1.给定n个权值作为n个叶子结点,构造一棵二叉树,若该树的带权路径长度(wpl)达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(HuffmanTree),还有的书翻译为霍夫曼树。2.赫夫曼树是带权路径长度最短的树,权值较大的结点离根较近相关概念1.路径和路径长度:在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。通路中分支的数目称为路径长度。若规定根结点的层数为1,则从根结点到第L层结点的路径长度为L-12.结点的权及带权路径长度:若将树中结点赋给一个原创 2021-01-14 11:25:28 · 376 阅读 · 0 评论