
Java数据结构与算法
学习java基础的数结构与算法
为月提笔_
这个作者很懒,什么都没留下…
展开
-
Java——数据结构与算法(哈夫曼编码)(基础学习)
哈夫曼编码基本介绍:广泛应用于数据文件压缩,压缩率在20%~90%之间。是可变字长编码(VLC)的一种,也成为最佳编码。原理剖析步骤:I like like like java do you like a javad:1 y:1 u:1 j:2 v:2 o:2 l:4 k:4 e:4 i:5 a:5 :9按照上面的字符出现的次数构建一颗哈夫曼树,次数作为权值。构建过程步骤看上篇根据哈夫曼树给各个字符固定编码(前缀编码),左0又1。例如:o:1000原创 2020-09-10 20:44:40 · 233 阅读 · 0 评论 -
Java——数据结构与算法(哈夫曼树)(介绍,代码,学习)
哈夫曼树介绍:1) 一颗二叉树,给定n个权值作为n个叶子结点,若该树带权路径长度(WPL)达到最小,就称为最优二叉树,也称哈夫曼树。2)哈夫曼树WPL最小,权值较大的结点离根较近。构建哈夫曼树的步骤:1)从小到大排序,每次取出根节点权值最小和次小的两颗二叉树。2)将两颗二叉树构成新的二叉树,新二叉树根节点权值是前面两权值的和。3)数列中去除最小和次小的数据,添加新的二叉树的权值数据,重新排序。4)重复1-2-3的步骤。5)图解代码实现:package tree;impo原创 2020-09-07 21:17:23 · 192 阅读 · 0 评论 -
Java——数据结构与算法(堆排序)思路解析 基础学习
堆排序堆排序的基本介绍:堆排序利用堆这种数据结构而设计的一种排序算法,时间复杂度都为O(nlogn),也是不稳定排序。大顶堆:每个结点的值都不小于孩子结点的值(无左右孩子结点的关系)。小顶堆:每个结点的值都不大于孩子结点的值升序排序用大顶堆,降序排序用小顶堆。基本思想:将待排序序列构造成一个大顶堆此时,整个序列的最大值就是堆顶的根节点。将其与末尾元素进行交换,此时末尾就为最大值。然后将剩余n-1个元素重新构造成一个堆,这样会得到n个元素的次小值。如此反复执行,便能得到一个有序序列原创 2020-09-05 16:46:10 · 133 阅读 · 0 评论 -
Java——数据结构与算法(哈希表)思路图解分析 代码实现
哈希表散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。有一个公司,当有新的员工来报道时,要求将该员工的信息加入(id,性别,年龄,名字,住址.),当输入该员工的id时,要求查找到该员工的所有信息要求:1)不使用数据库…速度越快越好=>哈希表(散列)2)添加时,保证按照id 从低到高插入[课后思考: 如果i原创 2020-07-22 10:30:59 · 304 阅读 · 0 评论 -
Java——数据结构与算法(斐波那契查找)
斐波那契查找package search;import java.util.Arrays;public class FibonacciSearch { public static int maxSize = 20; public static void main(String[] args) { int[] arr = {1,8,10,89,1000,1234,1234,1234,1234,1234,1234,1234,1234,1234}; Sy原创 2020-07-21 17:03:29 · 258 阅读 · 2 评论 -
Java——数据结构与算法 (插值查找)
插值查找插值查找算法的举例说明 数组arr=[1, 2, 3, …100]假如我们需要查找的值1使用二分查找的话,我们需要多次递归,才能找到1使用插值查找算法int mid= left+ (right- left) * (findVyal-arr[left]) / (arr[right] -arr[left])int mid=0+(99-0)* (1- 1)/(100-1)=0+990/99=0比如我们查找的值100int mid=0 +(99-0) (100-1)/(100-1)=原创 2020-07-20 16:21:06 · 1076 阅读 · 0 评论 -
Java——数据结构与算法 (二分查找)
二分查找二分查找的思路分析1.首先确定该数组的中间的下标mid= (left +right)/ 22.然后让需要查找的数findVal和ar[mid]比较2.1 findVal> rr[mid], 说明你要查找的数在mid的右边,因此需要递归的向右查找2.2 findVal< rr[mid], 说明你要查找的数在mid的左边,因此需要递归的向左查找2.3 findVal == rr[mid] 说明找到,就返回(结束递归条件)1)找到就结束递归2)递归完整个数组,原创 2020-07-20 10:57:48 · 164 阅读 · 0 评论 -
Java数据结构与算法——基数排序(图解 代码实现)
基数排序介绍:基数排序(radixsort) 属于“分配式排序,又称“桶子法” (bucketsort)。 顾名思义,它是通过键值的各个位的值,将要排序的元素分配至某些“桶”中,达到排序的作用2)基数排序法是属于稳定性的排序,基数排字法的是效率高的稳定性排序法3)基数排序(Radix Sort)是桶排序的扩展...原创 2020-07-17 08:28:58 · 232 阅读 · 0 评论 -
Java数据结构与算法——归并排序(图解)(算法效率测试)
归并排序说明:归并排序是利用归并的思想实现的排序方法,该算法采用经典的分治策略,分治法将问题分成一些小的问题然后递归求解,而治的阶段则将分的阶段得到的各答案"修补”在一起,即分而治之。下面展示图解过程:归并排序思想示意图2—合并相邻有序子序列再来看看治阶段,我们需要将两个已经有序的子序列合并成- -个有序序列, 比如上图中的最后一次合并,要将[4,5,7,8]和[1,2,3,6]两个已经有序的子序列,合并为最终序列[1,2,3,4,5,6,7,8],来看下实现步骤代码:package sort原创 2020-06-02 16:50:34 · 280 阅读 · 0 评论 -
Java数据结构与算法——快速排序(思路图解代码实现)(效率测试)
快速排序快速排序法介绍:快速排序是对冒泡排序的一种改进。 基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有 数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。快排示意图解:代码实现及详细步骤说明:package sort;import java.text.SimpleDateFormat;import java.util.Arrays;import java.util.Dat原创 2020-05-30 17:34:50 · 383 阅读 · 0 评论 -
Java数据结构与算法——希尔排序(插入算法优化)(算法效率测验)
希尔排序我们看简单的插入排序可能存在的问题.数组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-05-28 13:38:34 · 231 阅读 · 0 评论 -
Java数据结构与算法——插入排序(思路)(代码实现)(时间测验)
插入排序插入排序法介绍**:**插入式排序属于内部排序法,是对于欲排字的元素以插入的方式找寻该元素的适当位置,以达到排序的目的。插入排序法思想**:**把n个待排序的元素看成为一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素, 把它的排序码依次与有序表元素的排序码进行比较,将它插入到有序表中的适当位置,使之成为新的有序表。下面先思路代码实现:package sort;import java.text.SimpleDate原创 2020-05-27 18:42:09 · 371 阅读 · 0 评论 -
Java数据结构与算法——选择排序(代码实现)(数据测试 验证代码时间)
选择排序基本介绍选择式排序也属于内部排序法,是从欲排序的数据中,按指定的规则选出某一元素,再依规定交换位置后达到排序的目的。选择排序思想**????*选择排序(select sorting) 也是一种简单的排序方法。它的基本思想是:第一次从arr[0] ~arr[n-1]中选取最小值,与arr[0]交换, 第二次从arr[1]*arr [n-1]中选取最小值, 与arr[1]交换, 第三次从arr[2] arr[n-1]中选取最小值,与arr[2]交换,第i次从arr[i-1]^ arr[n-1]原创 2020-05-17 21:36:54 · 324 阅读 · 0 评论 -
Java数据结构与算法——冒泡排序 (数据测试 验证算法时间)
冒泡排序基本介绍:冒泡排序(Bubble Sorting) 的基本思想是:通过对待排序序列从前向后(从下标较小的元素开始) ,依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就象水底下的气泡一样逐渐向上冒。因为排序的过程中,各元素不断接近自己的位置,如果一趟比较下来没有进行过交换,就说明序列有序,因此要在排序过程中设置个标志flag判断元素是否进行过交换。从而减少不必要的比较。原始数组: 3,9,-1, 10, 20.第一趟排序(1) 3, 9,-1, 10, 20 //原创 2020-05-14 22:21:03 · 423 阅读 · 0 评论 -
Java数据结构与算法——时间复杂度 空间复杂度
时间频度基本介绍时间频度: 一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多,一个算法中的语句执行次数称为语句频度或时间频度,记为T(n)。忽略常数项结论: .2n+20和2n随着n变大,执行曲线无限接近,20可以忽略3n+10和3n随着n变大,执行曲线无限接近,10可以忽略忽略低次项结论:2n^2+3n+10和 2n^2随着n变大,执行曲线无限接近,可以忽略3n+10n^2+5n+20和 n^2随着n变大,执行曲线无限接近,可以忽略5n+20原创 2020-05-12 21:56:25 · 375 阅读 · 0 评论 -
Java数据结构与算法——递归(八皇后问题)
递归-八皇后问题(回溯算法)1)第一个皇后先放第一行第一列2)第二个皇后放在第二行第一列、然后判断是否OK,如果不OK,继续放在第二列、第三列、依次把所有列都放完,找到一个合适3)继续第三个皇后,还是第- -列、第二列…直到第8个皇后也能放在一个不冲突的位置,算是找到了一个正确解4)当得到一个正确解时,在栈回退到上一个栈时,就会开始回溯,即将第一个皇后, 放到第一列的所有 正确解,全部得到.5)然后回头继续第一个 皇后放第二列,后面继续循环执行1,2,3,4的步骤如下代码详情实现:pack原创 2020-05-10 22:02:51 · 270 阅读 · 0 评论 -
Java数据结构与算法——递归 (迷宫回溯问题)
递归简单的说:递归就是方法自己调用自己,每次调用时传入不同的变量.递归有助于编程者解决复杂的问题,同时可以让代码变得简洁。递归调用规则:1.当程序执行到一个方法时,就会开辟一-个独立的空间(栈)2. 每个空间的数据(局部变量),是独立的.递归需要遵守的重要规则执行一个方法时,就创建一个新的受保护的独立空间(栈空间)方法的局部变量是独立的,坏会相互影响,比如n变量如果方法中使...原创 2020-05-04 21:31:00 · 253 阅读 · 0 评论 -
Java数据结构与算法——计算器实现4(栈)(中缀转后缀)
中缀转后缀(不喜欢看文字描述的,可以直接看代码,代码每一步都有相应的注解,建议代码结合思路分析一块看,可以快速了解转换的整个过程)中缀表达式转后缀表达式的思路步骤分析:**初始化两个栈:运算符栈s1和储存中间结果的栈s2;从左至右扫描中缀表达式;遇到操作数时,将其压s2;遇到运算符时,比较其与s1栈顶运算符的优先级:(1)如果s1为空,或栈顶运算符为左括号“(”,则直接将此运算...原创 2020-05-01 17:37:53 · 229 阅读 · 0 评论 -
Java数据结构与算法——计算器实现3(栈)(后缀)(逆波兰)
后缀表达式后缀表达式又称逆波兰表达式,与前缀表达式相似,只是运算符位于操作数之后中举例说明: (3+4)X5-6对应的后缀表达式就是 3 4 + 5 X 6 -3)再比如: a +( b - c ) × d => a b c - d × +我们完成一个逆波兰计算器,要求完成如下任务:输入一个逆波兰表达式,使用栈(Stack), 计算其结果支持小括号和多位数整数,因为这里...原创 2020-05-01 13:03:38 · 232 阅读 · 0 评论 -
Java数据结构与算法——计算器代码实现2(栈)(中缀)(多位数)
计算器代码实现2承接上一篇实现多位数计算器的思路1.如果出现多位数,不能就一个数直接入栈。2.需要定义一个变量字符串keepNum,用于拼接,来保存多位数。3.在处理多位数时,需要expression的表达式的index位再后再看一位,如果是数就再进行循环扫描,如果是符号,数keepNum(这里的keepNum是字符型的,需转换成数字)才入栈。关键代码如下: //处理多位数 ...原创 2020-05-01 11:01:36 · 369 阅读 · 0 评论 -
Java数据结构与算法——计算器简单实现(栈)
使用栈完成表达式的计算思路(这里我们拿7+2*6-4为例子进行计算,这里代码70+2*6-4的两位数计算不可以,留到下一篇)1.通过一个index值(索引),来遍历我们的表达式2.如果我们发现是一个数字, 就直接入数栈3.如果发现扫描到是一个符号,就分如下情况3.1如果发现当前的符号栈为空,就直接入栈3.2如果符号栈有操作符,就进行比较,如果当前的操作符的优先级小于或者等于栈中的操作符...原创 2020-05-01 10:09:54 · 678 阅读 · 1 评论 -
Java数据结构与算法——栈 数组模拟 思路分析
栈栈的介绍栈的英文为(stack)栈是一个先入后出(FILO-First InLast Out)的有序列表。栈(stack)是 限制线性表中元素的插入和删除只能在线性表的同一端进 行的一种特殊线性表。允许插入和删除的一端,为变化的一端, 称为栈顶(Top), 另一端为固定的一 端,称为栈底(Bottom)。根据栈的定义可知,最先放入栈中元素在栈底,最后放入的元素在栈项,而删除元素刚好相...原创 2020-04-30 16:22:49 · 171 阅读 · 0 评论 -
Java数据结构与算法——环形单向链表(约瑟夫问题)2
约瑟夫问题思路(小孩出圈)1.需要创建一个辅助指针(变量) helper,事先应该指向环形链表的最后这个节点. .补充:小孩报数前,先让first和helper移动countNum-1次,这样可以让first指向开始的节点,helper指向最后一个节点。2.当小孩报数时,让first 和helper指针同时的移动Nums -1次3.这时就可以将first指向的小孩节点出圈first= ...原创 2020-04-30 12:38:55 · 224 阅读 · 2 评论 -
Java数据结构与算法——环形单向链表(约瑟夫问题)
双向单链表构建一个单向的环形链表思路1.先创建第一个节点让first指向该节点,并形成环形2.后面当我们每创建一个新的节点, 就把该节点,加入到已有的环形链表中即可.遍历环形链表1.先让一个辅助指针(变量)curBoy,指向first节 点2.然后通过一个while循环遍历该环形链表即可curBoy.next == first结束public class Josephu { ...原创 2020-04-29 21:41:56 · 206 阅读 · 0 评论 -
Java数据结构与算法——双向链表 思路分析
这里写自定义目录标题双向链表双向链表这是一个java的双向链表的代码实现,这里简单实现了双向链表的节点创建(不同与单链表的时多了一个指向上一个节点的指针),双向链表的建立,节点的添加,链表的遍历,节点的修改,节点删除。public class DoubleLinkedListDemo { public static void main(String[] args) { ...原创 2020-04-29 20:11:10 · 186 阅读 · 0 评论