
Java数据结构与算法整理
Java数据结构与算法整理
alex-zhou96
男儿欲遂平生志,五经勤向窗前读。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Java数据与算法整理目录
在复习Java数据结构与算法的基础时,做了笔记,为了便于浏览,将相关的内容进行了整理,将相关章节连接放在表格中。 (2020/1/3)内容打开00时间复杂度算法复杂度01 稀疏数组与队列稀疏数组与队列02链表链表03栈栈、前中后缀表达书04递归递归...原创 2020-01-03 16:14:55 · 341 阅读 · 0 评论 -
克鲁斯卡尔算法基础
克鲁斯卡尔算法算法介绍克鲁斯卡尔算法:是用来求加权连通图的最小生成树的算法基本思想:按照权值从小到大的顺序选择n-1条边,并保证这n-1条边不构成回路具体做法: 首先构造一个只包含n个顶点的森林,然后依权值从小到大从连通网中选择边加入到森林,并使得森林中不产生回路,值只森林变成一颗树为止代码实现package L十大算法.Kruskal;import com.sun...原创 2020-01-15 18:47:12 · 560 阅读 · 0 评论 -
普利姆算法基础
普利姆算法应用场景–修路问题最小生成树修路问题的本质就是最小生成树问题,先介绍一下最小生成树(Minimum Cost Spanning Tree),简称MST给定一个带权的无相连通图,如何选择一颗生成树,使树上所有边上权的总和最小,这就叫最小生成树N个顶点,一定有N-1条边包含全部顶点N-1条边都在图中求最小生成树的算法主要是普利姆算法和克鲁斯卡尔算法算法介绍普利...原创 2020-01-15 18:45:35 · 861 阅读 · 1 评论 -
贪心算法基础
贪心算法基本介绍贪婪算法(贪心算法)是指对问题进行求解时,在每一步选择中都采取最好或者最优(即最有利)的选择,从而希望能够导致结果是最优或最好的算法贪婪算法所得到的结果不一定是最优的结果(有时候会是最优解),但是都是相对接近最优解的结果应用场景 —集合覆盖问题分析思路如何找出覆盖所有地区的广播台的集合呢,使用<穷举法>实现,列出每个可能的广播台的集合,这被称为幂...原创 2020-01-15 18:44:29 · 259 阅读 · 0 评论 -
KMP算法
KMP算法数据结构整理目录>>>暴力匹配算法思路代码 package L十大算法.StringMatch;/** * @Author Zhou jian * @Date 2020 ${month} 2020/1/14 0014 16:04 * 字符串暴力匹配算法 */public class BaoLiMatch { pub...原创 2020-01-14 19:11:49 · 143 阅读 · 0 评论 -
动态规划算法
动态规划算法数据结构整理目录>>>基本介绍基本步骤动态规划(Dynamic Programming)算法的核心思想是:将大问题划分为小问题进行解决,从而一步步取得最优解的处理算法动态规划算法与分治算法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解与分治法不同的是,适用于动态规划求解得到的问题,经分解得到的子问...原创 2020-01-14 19:10:13 · 183 阅读 · 0 评论 -
分治算法
分治算法数据结构整理目录>>>基本介绍分治法是一种很重要的算法,字面的解释是“分而治之,就是把一个复杂的问题分成两个或者更多的相同或相似的子问题,再把子问题分成更小的问题。。。。。。直到最后子问题可以简单的直接求解,原问题的解即子问题解的合并。这个技巧是狠多高效算法的基础,如排序算法(快速排序,归并排序),傅里叶变换(快速傅里叶变换…)分治算法可以求解一些经典问题:...原创 2020-01-14 19:08:27 · 243 阅读 · 0 评论 -
二分查找
二分查找数据结构整理目录>>>基本介绍(非递归)二分查找只适用于从有序的数列中进行查找(比如数字和字母等),将数列排序后再进行查找二分查找法只适用于从有序的数列中进行查找,(比如数字和字母等),将数列排序后再进行查找二分查找法的运行时间为对数O(lo2n),即查找到需要的目标位置最多只需要log2n步数,假设从[0,99]的队列(100个数,即n=100)中寻找到目标...原创 2020-01-14 19:07:12 · 877 阅读 · 0 评论 -
多路查找树
多路查找树提出背景二叉树的问提分析二叉树的操作效率较高,但也存在问题》二叉树需要加载到内存,如果二叉树的节点少,没有什么问题,但是如果二叉树的节点很多(比如1亿),就存在如下问题:问题1:在构建二叉树时,需要多次进行IO操作(海量数据存在数据库或文件中),节点海量,构建二叉树时,速度有影响问题2:节点海量,也会造成二叉树的高度很大,会降低操作速度’多叉树在二叉树中,每个节点...原创 2020-01-14 11:18:41 · 206 阅读 · 0 评论 -
平衡二叉树
平衡二叉树数据结构与算法章节目录>>提出背景给定一个数列[1,2,3,4,5,6],要求创建一颗二叉【排序树(BST)存在的问题:左子树全部为空,从形式上看,更像一个单链表插入速度没有影响查询的速度明显降低(因为需要依次比较),不能发挥BST的优势,因为每次还需要比较左子树,其查询速度比单链表还慢解决方案----平衡二叉树(AVL)基本介绍平衡二叉树也叫...原创 2020-01-13 14:27:33 · 240 阅读 · 0 评论 -
二叉排序树
二叉排序树数据结构预算法章节目录>>基本介绍二叉排序树:BST:(Binary Sort(Search) Tree),对于二叉排序树的任何一个非叶子节点,要求左子树的值比当前节点的值小,右子节点的值比当前节点的值大。特别说明:如果有相同的值,可以将该节点放在左子节点或右子节点。二叉排序树的创建和遍历代码//添加节点的方法 //递归的形式添加节点,注意需要满足...原创 2020-01-12 23:23:36 · 236 阅读 · 0 评论 -
赫夫曼树及其应用
赫夫曼树基本介绍给定n个权值作为n个叶子节点,构造一颗二叉树,若该数的带权路径长度达到最小,称这样的二叉树为最优二叉树,也叫哈夫曼树,还有的书翻译霍夫曼树。赫夫曼树是带权路径长度最短的树,权值较大的带你离根较近。重要概念路径和路径长度:在一颗树中,从一个节点往下可到达的孩子或孙子节点之间的通路,称为路径。通路中分支的树木称为==路径长度。==若规定根节点的层数为1,则从根节...原创 2020-01-10 10:26:16 · 956 阅读 · 2 评论 -
06排序之堆排序
堆排序参考基本介绍堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏 ,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序堆是具有以下性质的完全二叉树:每个节点的值都大于或等于其左右孩子节点的值,称为大顶堆,注意没有要求节点的左孩子的值和右孩子的值的大小相等每个节点的值都小于或等于其左右孩子节点的值,称为小顶堆4.一般升序采用大顶堆,降序采用...原创 2020-01-09 17:36:16 · 211 阅读 · 0 评论 -
08树的基础
文章目录树为什么需要树这种数据结构树的基础概念二叉树二叉树的概念二叉树的遍历前序遍历中序遍历后序遍历代码二叉树删除节点思路代码补充顺序存储二叉树(应用实例:堆排序)基本概念顺序存储二叉树的特点代码树为什么需要树这种数据结构数组存储方式的分析 优点:通过下标的方式访问元素,速度快。对于有序数组,还可以使用二分查找提高检索速度 缺点:如果检索某个具体的中,或插入某个值,会整体移...原创 2020-01-07 22:17:12 · 615 阅读 · 0 评论 -
07哈希表
哈希表基本介绍散列表(Hash table,也叫哈希表),是根据关键码值(Key Value)而直接进行访问的数据结构也就是说,它通过把关键码值映射到表中的一个位置来访问记录,以加快查找的速度。这个映射函数叫做三列函数,存放记录的数组叫做散列表。链表数组:数组+链表哈希表管理雇员系统要求有一个公司,当有新的员工来报道时,要求将该员工的信息加入(id,性别,年龄,名字,住...原创 2020-01-06 00:27:41 · 256 阅读 · 0 评论 -
06查找算法之菲波那切数列查找
斐波那契(黄金分割法)查找算法–基于有序数组思路斐波那契数列{1,1,2,3,5,8,13,21}发现斐波那契数列的两个相邻林的比例无限接近两个相邻数的比例,无限接近黄金分割值 0.618菲波那切(黄金分割)原理:斐波那契查找:借助菲薄纳妾数列找到分割点斐波那契查找原理与前两种相似,仅仅改变了中间节点(mid)的位置mid不再是中间或插值得到,而是位于黄金分割点附近即mid=lo...原创 2020-01-05 19:13:34 · 605 阅读 · 1 评论 -
06查找之插值查找
插值查找(自适应mid的二分查找)改进型的二分查找算法(更加适用于连续的数值)思路插值查找算法类似于二分查找,不同的是插值查找每次从自适应mid处开始查将折半查找中的mid索引公式,low改成左边索引left,high表示右边索引right; key就是要查找的值3、int midIndex = low +(high-low)*(key-arr[low])/(a...原创 2020-01-05 19:12:04 · 140 阅读 · 0 评论 -
06查找算法之二分查找
二分查找(基于有序数组)思路确定数组中间的下标 mid = (left+right)/2然后让需要查找的数 findVal和arr[mid]比较 2.1 如果findVal>arr[mid],说明要查找的数在mid的右边,因此需要递归的向右查找 2.2 如果findVal<arr[mid],说明要查找的数在mid的左边,因此需要递归的向左查找...原创 2020-01-05 19:10:54 · 138 阅读 · 0 评论 -
06查找算法之线性查找
线性查找章节目录思路线性查找是逐一比对,发现有相同的值,就返回下标代码package G查找;/** * @Author Zhou jian * @Date 2020 ${month} 2020/1/5 0005 15:32 */public class SequenceSearch { public static void main(String[] ...原创 2020-01-05 19:09:11 · 148 阅读 · 0 评论 -
06查找
文章目录查找算法线性查找思路代码二分查找(基于有序数组)思路代码扩展插值查找(自适应mid的二分查找)思路代码小结斐波那契(黄金分割法)查找算法--基于有序数组思路代码Java数据与算法整理目录查找算法在java中,我们常用的查找有4中顺序(线性)查找二分查找/折半查找插值查找斐波那契查找线性查找思路线性查找是逐一比对,发现有相同的值,就返回下标代码packa...原创 2020-01-05 19:06:31 · 464 阅读 · 0 评论 -
05排序算法
文章目录排序排序算法介绍排序的分类常见排序的分类冒泡排序算法基本介绍分析代码实现代码的改进性能的分析选择排序基本介绍分析代码实现性能分析插入排序基本介绍分析代码实现性能分析希尔排序(对选择排序的改进)基本介绍分析代码实现希尔排序交换式希尔排序位移式快速排序基本介绍分析代码实现性能分析归并排序基本介绍分析代码实现性能分析‘基数排序基本介绍分析代码性能分析常用排序算法总结和对比相关术语解释算法对比排...原创 2020-01-04 20:10:58 · 956 阅读 · 0 评论 -
05排序之基数排序
基数排序基本介绍1)基数排序属于 “分配式排序,又称桶子法,顾名思义,它是通过键值的各个位的值,将要排序的元素分配至某些”桶“中,达到排序的作用2)基数排序是属于稳定性的排序,基数排序法是效率高的稳定性排序法;基数排序是经典的空间换时间的方式,占用内存很大,当对海量数据排序时,容易造成OutOfMemoryError3)基数排序是桶排序的扩展4)基数排序是这样实现的:将整数按位数切割成...原创 2020-01-04 19:47:31 · 164 阅读 · 0 评论 -
05排序之归并排序
归并排序基本介绍归并排序是利用 归并的思想实现的排序方法该算法采用经典的分治策略(分治法将问题分成一些小的问题然后递归求解,而治的阶段则将分的阶段得到的个答案“修补”在一起,即分而治之)分析再来看看治阶段,我们需要将两个已经有序的子序列合并成一个有序序列,比如上图中的最后一次合并,要将[4,5,7,8]和[1,2,3,6]两个已经有序的子序列,合并为最终序列[1,2,3,4,5,6...原创 2020-01-04 18:09:38 · 199 阅读 · 0 评论 -
05排序之快速排序
快速排序基本介绍快速排序是对冒泡排序的一种改进,基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据比另外一部分的所有数据都要小;然后再按此方法对两部分数据分别进行快速排序’整个排序过程可以递归进行以此达到整个数据变成有序序列。分析代码实现package F排序;import java.util.Arrays;/** * @Author...原创 2020-01-04 16:35:24 · 135 阅读 · 0 评论 -
05排序之插入排序
插入排序基本介绍插入排序属于内部排序法,是对于欲排序的元素以插入的方式寻找该元素的适当位置,以达到排序的目的。思想把n个待排序的元素看成一个有序表和一个无序表开始时有序表只包含一个元素,无序表中包含有n-1个元素排序过程中每次从无序表中取出第一个元素把它的排序码依次与有序表元素的排序码进行比较,将它插入到有序表中的适当位置,使之成为新的有序表分析代码实现package ...原创 2020-01-03 23:43:02 · 148 阅读 · 0 评论 -
05排序之希尔排序
希尔排序(对选择排序的改进)我们看简单的插入排序可能存在的问题:/**数组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-01-03 23:41:20 · 163 阅读 · 0 评论 -
05排序之选择排序
选择排序基本介绍选择排序也是属于内部排序法,是从欲排序的数据中,按指定的规则选出某一元素,再依规定交换位置后达到排序的目的。 思想选择排序(select sorting)也是一种简单的排序方法,它的基本思想是:第一次从arr[0]~arr[n-1]中选取最小值,与arr[0]交换;第二次从arr[1]~arr[n-1]中选取最小值与arr[1]交换;第三次从arr[2]...原创 2020-01-03 20:33:27 · 137 阅读 · 0 评论 -
05排序之冒泡排序
冒泡排序算法基本介绍冒泡排序(Bubble Sorting)的基本思想是:通过对待排序序列从前向后(从下标小的元素开始),依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移至后部。就像水底下的气泡一样逐渐向上冒分析/** 对 3 9 -1 10 20 进行冒泡排序 **/冒泡排序规则小结:一共进行数组的大小-1次大的循环( size-1)每一趟排序的次...原创 2020-01-03 18:04:41 · 191 阅读 · 0 评论 -
00算法的时间复杂度
算法的时间复杂度时间频度时间频度:一个算法花费的时间与算法中语句的执行次数成正比例,那个算法中语句的执行次数多,它花费时间就多。一个算法中的语句执行次数称为语句频度或时间频度即为 T(n)时间复杂度1)一般情况下,算法中的基本操作语句的重复执行次数是问题规模n的某个函数,用T(n)表示,若某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f...原创 2020-01-03 16:05:57 · 342 阅读 · 0 评论 -
04递归
递归递归就是方法自己调用自己,每次调用时传入不同的变量,递归有助于编程解决复杂的问题,同时可以让代码变得简单递归调用机制例子1public static void main(String[] args) { test(4); } public static void test(int n){ if(n>2){ ...原创 2020-01-03 12:55:57 · 171 阅读 · 0 评论 -
03栈,中前后缀表达式
文章目录1、栈2、栈的实现2.1、数组实现栈2.2、链表实现栈3、表达式(栈实现计算功能应用)3.1、中缀表达式实现计算器代码实现(1、先实现一位数;2、扩展到多位数)3.2、前缀表达式(波兰表达式)3.3、中缀表达式3.4、后缀表达式(逆波兰表达式)逆波兰计算器代码实现3.5、中缀表达式转后缀表达式1、栈栈的英文名为stack栈是一个先入后出的有序列表栈(stack)是限制线性表中元素...原创 2019-12-31 12:45:15 · 627 阅读 · 0 评论 -
02链表
1、链表介绍链表是以节点的方式来存储的每个节点包含data域,next域:指向下一个节点链表的各个节点不一定是连续存放的链表分带头节点的链表和没有头结点的链表(根据实际需求确定.有头结点操作更简便)2、单链表添加节点到队列末尾先创建一个Head头节点,作用就是表示单链表的t后面我们每添加一个节点,就直接加入到链表的最后遍历通过一个辅助变量,帮助遍历整个链表...原创 2019-12-27 02:15:22 · 767 阅读 · 0 评论 -
01稀疏数组与队列
文章目录1、线性结构与非线性结构线性结构非线性结构2、稀疏数组基本介绍 ·应用实例代码实现3、队列基本介绍数组模拟简单队列数组模拟环形队列1、线性结构与非线性结构数据结构包括:线性结构与非线性结构线性结构线性结构作为最常用的数据结构,其特点是数据元素之间存在一对一的线性关系线性结构有两种不同的存储结构,即顺序存储结构(数组)和链式存储结构(链表)。顺序存储的线性表称为顺序表...原创 2019-12-25 16:21:27 · 536 阅读 · 0 评论