Java数据结构与算法
jrrhjww
这个作者很懒,什么都没留下…
展开
-
30_哈夫曼树
30_哈夫曼树一、算法概念介绍1.1 基本概念 1)路径和路径长度:在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。通路中分支的数目称为路径长度。若规定根结点的层数为1,则从根结点到第L层结点的路径长度为L-1; 2)结点的权及带权路径长度:若将树中结点赋给一个有着某种含义的数值,则这个数值称为该结点的权。结点的带权路径长度为:从根结点到该结点之间的路径长度与该结点的权的乘积; 3)树的带权路径长度:树的带权路径长度规定为所有叶子结点的带权路径长度之和,记为WP原创 2021-04-21 10:48:02 · 651 阅读 · 0 评论 -
29_堆排序(附完整java代码)
29_堆排序一、算法概念介绍堆是具有以下性质的完全二叉树: 每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆;注意 : 没有要求结点的左孩子的值和右孩子的值的大小关系。下图展示了堆的结点按层进行编号后映射到数组的样例:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DbpFpsd8-1618903470882)(C:\Users\Administrator\AppData\Roaming\Typora\原创 2021-04-20 15:24:51 · 175 阅读 · 0 评论 -
28_线索二叉树
28_线索二叉树三、代码实现3.1 前期准备public class ThreadedBinaryTreeDemo { public static void main(String[] args) { //测试中序线索二叉树 HeroNode root = new HeroNode(1, "tom"); HeroNode node2 = new HeroNode(3, "jack"); HeroNode node3 = new H原创 2021-04-19 15:22:21 · 73 阅读 · 0 评论 -
27_数组顺序存储二叉树
27_数组顺序存储二叉树一、基本概念从数据存储来看,数组存储方式和树的存储方式可以相互转换,即数组可以转换成树,树也可以转换成数组。顺序存储二叉树的特点:1)顺序二叉树通常只考虑完全二叉树;2)第n个元素的左子节点为 2 * n + 1;3)第n个元素的右子节点为 2 * n + 2;4)第n个元素的父节点为 (n-1) / 2;5)n : 表示二叉树中的第几个元素(按0开始编号如上图所示)。二、顺序存储二叉树遍历2.1 前期工作public class ArrBinar原创 2021-04-13 11:08:42 · 186 阅读 · 0 评论 -
26_树和二叉树
26_树和二叉树一、树[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cLZsfHsx-1618216965017)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210407095506705.png)]树的常用术语(结合示意图理解): 1)节点 2)根节点 3)父节点 4)子节点 5)叶子节点 (没有子节点的节点) 6)节点的权(节点值) 7)路径(从ro原创 2021-04-12 16:42:50 · 128 阅读 · 0 评论 -
25_数组、链表、树存储方式的分析
25_数组、链表、树存储方式的分析一、数组存储方式的分析优点:通过下标方式访问元素,速度快。对于有序数组,还可使用二分查找提高检索速度。缺点:如果要检索具体某个值,或者插入值(按一定顺序)会整体移动,效率较低二、链表存储方式的分析优点:在一定程度上对数组存储方式有优化(比如:插入一个数值节点,只需要将插入节点,链接到链表中即可, 删除效率也很好)。缺点:在进行检索时,效率仍然较低,比如(检索某个值,需要从头节点开始遍历)三、树存储方式的分析能提高数据存储,读取的效率, 比如利用二叉排序树原创 2021-04-02 10:51:42 · 67 阅读 · 0 评论 -
24_哈希表(附完整java代码)
24_哈希表一、问题引入有一个公司,当有新的员工来报道时,要求将该员工的信息加入(ID,性别,年龄,住址…),当输入该员工的id时,要求查找到该员工的所有信息。要求:不使用数据库,尽量节省内存,速度越快越好=>哈希表(散列)二、概念介绍散列表(Hash table,也叫哈希表),是根据键值对(Key value)而直接进行访问的数据结构。也就是说,它通过把键值对映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。三、问题实现有一个公司,当原创 2021-03-29 09:17:31 · 237 阅读 · 0 评论 -
23_斐波那契(黄金分割法)查找(附完整java代码)
23_斐波那契查找一、算法原理1.1斐波那契查找基本介绍黄金分割点是指把一条线段分割为两部分,使其中一部分与全长之比等于另一部分与这部分之比。取其前三位数字的近似值是0.618。由于按此比例设计的造型十分美丽,因此称为黄金分割,也称为中外比,这是一个神奇的数字。斐波那契数列 {1, 1, 2, 3, 5, 8, 13, 21, 34, 55 } ,可以发现斐波那契数列的两个相邻数的比例,无限接近黄金分割值0.618。1.2斐波那契查找算法原理斐波那契查找原理与前两种相似,仅仅改变了中间结点(原创 2021-03-24 16:20:03 · 568 阅读 · 0 评论 -
22_插值查找算法(附完整java代码)
22_插值查找一、原理介绍插值查找算法类似于二分查找,不同的是插值查找每次从自适应mid处开始查找将折半查找中的求mid索引的公式 ,low表示左边索引left,high表示右边索引right,key表示之前提到的 findValint mid = low + (high - low) * (key - arr[low]) / (arr[high] - arr[low]);/*插值索引*/ 对应前面的代码公式: int mid = left + (right – left)原创 2021-03-24 10:29:04 · 147 阅读 · 0 评论 -
21_二分查找(附完整java代码)
21_二分查找一、背景引入请对一个有序数组进行二分查找 {1,8, 10, 89, 1000, 1234} ,输入一个数看看该数组是否存在此数,并且求出下标,如果没有就提示"没有这个数。二、思路分析三、代码实现说明:增加了找到所有满足条件的元素下标的功能:课后思考题:{1, 8, 10, 89, 1000, 1000, 1234}当一个有序数组中,有多个相同的数值时,如何将所有的数值都查找到,比如这里的1000import java.util.ArrayList;public cla原创 2021-03-19 15:34:59 · 316 阅读 · 0 评论 -
20_排序算法总结
20_排序算法总结一、常用排序算法对比相关术语解释:1)稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面;2)不稳定:如果a原本在b的前面,而a=b,排序之后a可能会出现在b的后面;3)内排序:所有排序操作都在内存中完成;4)外排序:由于数据太大,因此把数据放在磁盘中,而排序通过磁盘和内存的数据传输才能进行;5)时间复杂度:一个算法执行所耗费的时间。6)空间复杂度:运行完一个程序所需内存的大小;7)n:数据规模8)k:“桶”的个数9)In-place:不占原创 2021-03-18 10:33:19 · 72 阅读 · 0 评论 -
19_基数排序算法(附完整java代码)
19_基数排序算法一、基本介绍1.1 基数排序(桶排序)算法介绍1)基数排序(radix sort)属于“分配式排序”(distibution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,它是通过键值的各个位的值,将要排序的元素分配至某些“桶”中,达到排序的作用;2)基数排序法是属于稳定性的排序,基数排序法的是效率高的稳定性排序法;3)基数排序(Radix Sort)是桶排序的扩展;4)基数排序是1887年赫尔曼·何乐礼发明的。它是这样实现的:将整数按位数切原创 2021-03-18 10:26:39 · 172 阅读 · 0 评论 -
18_归并排序算法(附完整java代码)
18_归并排序算法一、归并排序介绍归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略。分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之。二、归并排序思想2.1 基本思想示意图2.2 合并相邻有序子序列示意图三、归并排序代码实现import java.util.Arrays;public class MergeSort原创 2021-01-18 16:04:53 · 433 阅读 · 0 评论 -
17_快速排序算法(附完整java代码)
17_快速排序一、算法介绍1.1 快速排序法介绍快速排序(Quicksort)是对冒泡排序的一种改进。基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。1.2 快速排序法示意图二、快速排序代码实现public class QuickSort { public static void main(String[] args) {原创 2021-01-18 10:43:22 · 270 阅读 · 0 评论 -
16_希尔排序算法(附完整java代码)
16_希尔排序算法一、问题导入简单插入排序存在的问题 我们看简单的插入排序可能存在的问题. 数组 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} 结论:当需要插入的数是较小的数时,后移的次数明显增多,对效率有影响。二、希尔排序介绍2.1 希尔排序基本介绍 希尔排序是原创 2020-12-23 10:38:15 · 187 阅读 · 0 评论 -
15_插入排序算法(附java代码)
15_插入排序算法一、基本介绍 插入式排序属于内部排序法,是对于欲排序的元素以插入的方式找寻该元素的适当位置,以达到排序的目的。二、插入排序算法2.1 算法思想 插入排序(Insertion Sorting)的基本思想是:把n个待排序的元素看成为一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,把它的排序码依次与有序表元素的排序码进行比较,将它插入到有序表中的适当位置,使之成为新的有序表。下图为插入排序示意图:三、代码原创 2020-12-18 16:05:08 · 133 阅读 · 1 评论 -
14_选择排序算法(附完整java代码)
14_选择排序算法一、基本介绍 选择式排序也属于内部排序法,是从欲排序的数据中,按指定的规则选出某一元素,再依规定交换位置后达到排序的目的。二、选择排序2.1 选择排序思想选择排序(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]~原创 2020-12-16 11:24:48 · 343 阅读 · 0 评论 -
13_冒泡算法(附完整java代码)
13_冒泡算法一、基本介绍 冒泡排序(Bubble Sorting)的基本思想是:通过对待排序序列从前向后(从下标较小的元素开始),依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就象水底下的气泡一样逐渐向上冒。 因为排序的过程中,各元素不断接近自己的位置,如果一趟比较下来没有进行过交换,就说明序列有序,因此要在排序过程中设置一个标志flag判断元素是否进行过交换。从而减少不必要的比较。(这里说的优化,可以在冒泡排序写好后,在进行)二、图示冒泡排序原创 2020-12-11 15:59:17 · 790 阅读 · 1 评论 -
12_初识排序算法
12_初识排序算法一、排序算法的介绍 排序也称排序算法 (Sort Algorithm),排序是将一组数据,依指定的顺序进行排列的过程。1.1 排序的分类 1) 内部排序: 指将需要处理的所有数据都加载到内部存储器中进行排序; 2) 外部排序法: 数据量过大,无法全部加载到内存中,需要借助**外部存储(文件等)**进行排序。 3)常见的排序算法分类二、算法的时间复杂度2.1 度量一个程序(算法)执行时间的两种方法2.1.1 事后统计法这种方法可行, 但是有两个问题:原创 2020-12-02 17:36:59 · 159 阅读 · 0 评论 -
11_递归应用场景及调用机制
11_递归应用场景及调用机制1.递归的概念 递归就是方法自己调用自己,每次调用时传入不同的变量。递归有助于编程者解决复杂的问题,同时可以让代码变得简洁。2.递归调用机制 这里回顾一下递归调用机制: 1)打印问题;public class RecursionTest { public static void main(String[] args) { //通过打印问题回顾递归调用机制 test(4); } //打印问题 pu原创 2020-11-17 11:12:12 · 151 阅读 · 0 评论 -
10_中缀转后缀计算器(附完整java代码)
10_中缀转后缀计算器(附完整java代码)一、逆波兰计算器1.1 案例引入 输入一个逆波兰表达式(后缀表达式),使用栈(Stack),计算其结果。(只支持对整数的计算即可)后缀表达式的计算机求值: 从左至右扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(次顶元素 和 栈顶元素),并将结果入栈;重复上述过程直到表达式最右端,最后运算得出的值即为表达式的结果。1.2 思路分析例如:( 3 + 4 )× 5 - 6 对应的后缀表达式就是 3原创 2020-11-11 16:19:35 · 254 阅读 · 0 评论 -
09_栈实现综合计算器(附java代码实现)
09_栈实现综合计算器(中缀表达式)一、问题导入使用栈实现综合计算器二、思路分析三、代码实现public class Calculator { public static void main(String[] args) { String expression = "70*2-80+1"; //创建两个栈,数栈与符号栈 ArrayStack2 numStack = new ArrayStack2(10); ArraySt原创 2020-10-16 11:22:16 · 108 阅读 · 0 评论 -
08_栈(附数组及单链表的java代码实现)
08_栈一、问题引入请输入一个表达式计算式:[7x2x2-5+1-5+3-3],点击计算(如图所示)请问:计算机底层是如何运算得到结果的?注意不是简单的把算式列出运算,因为我们看这个算式7x2x2-5+1-5+3-3,但是计算机怎么理解这个算式的(对计算机而言,它接收到的就是一个字符串),我们讨论的就是这个问题 --> 栈二、栈的介绍 1)栈的英文为(stack); 2)栈是一个先入后出(FILO-First In Last Out)的有序列表; 3)栈(stack)是限制线原创 2020-10-08 17:45:10 · 132 阅读 · 0 评论 -
07_单向循环链表与约瑟夫环问题(附java代码)
07_单向循环链表与约瑟夫环问题一、单向环形链表介绍 如果把单链表的最后一个节点的指针指向链表头部,而不是指向NULL,那么就构成了一个单向循环链表,通俗讲就是把尾节点的下一跳指向头结点。其逻辑结构如图所示:二、单向循环链表构建2.1 思路分析2.1.1 构建一个单向的环形链表思路先创建第一个节点,让first指向该节点,并形成环形;后面当我们每创建一个新的节点,就把该节点,加入到已有的环形链表中即可。2.1.2 遍历环形链表先让一个铺助指针(变量)curBoy,指向firs原创 2020-09-09 17:32:43 · 229 阅读 · 0 评论 -
06_双向链表简介及其java代码实现
06_双向链表一、单向链表的缺点分析单向链表,查找的方向只能是一个方向,而双向链表可以向前或者向后查找。单向链表不能自我删除,需要靠辅助节点,在单链表删除节点时,总是找到待删除节点的前一个节点来进行删除;而双向链表可以进行自我删除。二、双向链表介绍双向链表也叫双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。其结构如下图所示:三、代码实现前期工作1.创建链表的原创 2020-09-07 18:10:36 · 106 阅读 · 0 评论 -
05_单链表简介及其java代码实现
05_单链表1.逻辑结构 单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。 单链表(带头结点) 逻辑结构示意图如下:2.单链表的创建与遍历2.1 思路分析2.2 代码实现 首先定义一个节点类//定义一个HeroNode类,每个HeroNode对象就是单链表中的一个节点class He原创 2020-09-02 17:08:19 · 261 阅读 · 0 评论 -
04_链表简介
04_链表一、链表介绍链表是有序的链表,但它在内存中存储方式如下图所示:小结:链表是以节点方式,链式存储的;每个节点包含data域(保存数据)、next域(保存指向下一个节点的信息);如上图,我们发现链表中的各个节点并不一定是连续存储的;链表分为带头节点的链表和没有头节点的链表,根据实际需求来确定。...原创 2020-08-28 16:05:41 · 100 阅读 · 0 评论 -
03_队列介绍、数组模拟队列及改进成环形队列(附java代码)
队列一、队列概念介绍队列是一个有序列表,可以用数组或者链表实现;遵循先入先出的原则,即:先存入队列的数据先取出,后存入的后取出。二、数组模拟队列1.数组模拟队列思路 队列本身是有序列表,若使用数组的结构来存储队列的数据,则队列数组的声明如下图,其中maxSize是该队列的最大容量。 因为队列的输出、输入时分别从前后端来处理,因此需要两个变量front和rear分别记录队列前后端的下标,front会随着数据输出而改变,而rear则是随着数据输入而改变,如图所示: 我们将原创 2020-08-28 15:46:23 · 265 阅读 · 0 评论 -
02_稀疏数组(附java代码)
稀疏数组场景引入编写五子棋程序时,可以使用二维数组记录棋盘对局。问题分析: 因为该二维数组的很多值默认是0,这些数据没有意义,即可使用稀疏数组进行存储。基本介绍当一个数组中大部分元素为0,或者为同一个值的数组中,可以使用稀疏数组来保存该数组。稀疏数组的处理方法是: (1)记录数组一共有几行几列,有几个不同的值; (2)把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小数据规模。如图所示即为一个稀疏数组,若使用原始存储方法,共需存储6 x 7 = 42个数据。如原创 2020-08-21 17:48:17 · 139 阅读 · 0 评论 -
01_线性结构与非线性结构
线性结构与非线性结构数据结构包括:线性结构与非线性结构。线性结构 1)线性结构作为最常用的数据结构,其特点是数据元素之间存在一对一的关系; 2)线性结构有两种不同的存储结构,即顺序存储结构和链式存储结构。顺序存储的线性表称为顺序表,顺序表中的存储元素是连续的; 3)链式存储的线性表称为链表,链表中的存储元素不一定是连续的,元素节点中存放数据元素以及相邻元素的地址信息; 4)线性结构常见的有:数组、队列、链表和栈。非线性结构非线性结构包括:二维数组、多维数组、广义表、树结构、图结构原创 2020-08-18 17:33:45 · 196 阅读 · 0 评论