java数据结构与算法
文章平均质量分 55
以实战为线索,渐渐探索数据结构与算法的逻辑思维
跑马去追XX
这个作者很懒,什么都没留下…
展开
-
程序员常用的10种算法-贪心算法
贪心算法原创 2022-06-12 16:06:50 · 324 阅读 · 3 评论 -
程序员常用10种算法-KMP 算法
如果用暴力匹配的思路,并假设现在 str1 匹配到 i 位置,子串 str2 匹配到 j 位置,则有:KMP 算法介绍KMP 是一个解决模式串在文本串是否出现过,如果出现过,最早出现的位置的经典算法Knuth-Morris-Pratt 字符串查找算法,简称为 “KMP 算法”,常用于在一个文本串 S 内查找一个模式串 P 的 出现位置,这个算法由Donald Knuth、Vaughan Pratt、James H. Morris 三人于 1977 年联合发表,故取这 3 人的 姓氏命名此算法.KM原创 2022-06-11 16:22:37 · 218 阅读 · 0 评论 -
程序员常用10种算法-动态规划算法
思路分析和图解原创 2022-06-10 10:35:29 · 1585 阅读 · 0 评论 -
程序员常用 10 种算法-分治算法
分治法在每一层递归上都有三个步骤:汉诺塔的传说汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着 64 片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小 顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。假如每秒钟一次,共需多长时间呢?移完这些金片需要 5845.54 亿年以上,太阳系的预期寿命据说也就是数百亿年。真的过了 5845.54 亿年,地球上的一切生命,原创 2022-06-09 00:00:00 · 181 阅读 · 0 评论 -
程序员常用 10 种算法-二分查找算法(非递归)
数组 {1,3, 8, 10, 11, 67, 100}, 编程实现二分查找, 要求使用非递归的方式完成.原创 2022-06-08 00:00:00 · 207 阅读 · 0 评论 -
图及图的遍历
图是一种数据结构,其中结点可以具有零个或多个相邻元素。两个结点之间的连接称为边。 结点也可以称为顶点。如图:图的表示方式有两种:二维数组表示(邻接矩阵);链表表示(邻接表)。邻接矩阵是表示图形中顶点之间相邻关系的矩阵,对于 n 个顶点的图而言,矩阵是的 row和 col 表示的是 1…n个点。图的深度优先遍历介绍图遍历介绍所谓图的遍历,即是对结点的访问。一个图有那么多个结点,如何遍历这些结点,需要特定策略,一般有两种访问策略: (1)深度优先遍历 (2)广度优先遍历图的深度优先搜索(Depth原创 2022-06-07 00:00:00 · 142 阅读 · 0 评论 -
多路查找树
B树通过重新组织节点,降低树的高度,并且减少 i/o 读写次数来提升效率。将数列{16, 24, 12, 32, 14, 26, 34, 10, 8, 28, 38, 20} 构建成 2-3 树,并保证数据插入的大小顺序。(演示一下构建 2-3 树的过程.)插入规则:除了 23 树,还有 234 树等,概念和 23 树类似,也是一种 B树。 如图:B-tree 树即 B 树,B 即 Balanced,平衡的意思。有人把 B-tree 翻译成 B-树,容易让人产生误解。会以为 B-树是一种树,而 B树转载 2022-06-06 00:00:00 · 98 阅读 · 0 评论 -
平衡二叉树(AVL 树)
应用案例-单旋转(右旋转)要求: 给你一个数列,创建出对应的平衡二叉树.数列 {10,12, 8, 9, 7, 6}思路分析(示意图)代码实现应用案例-双旋转前面的两个数列,进行单旋转(即一次旋转)就可以将非平衡二叉树转成平衡二叉树,但是在某些情况下,单旋转 不能完成平衡二叉树的转换。比如数列 int[] arr = { 10, 11, 7, 6, 8, 9 }; 运行原来的代码可以看到,并没有转成 AVL树.int[] arr = {2,1,6,5,7,3}; // 运行原来的代码可原创 2022-06-05 00:00:00 · 129 阅读 · 0 评论 -
二叉排序树
二叉排序树的相关操作,内含全部代码原创 2022-06-04 11:45:01 · 139 阅读 · 0 评论 -
压缩文件(哈夫曼编码)
package com.iflytek.huffmancode;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.InputStream;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.io.OutputStream;import java.util.Map;public原创 2022-04-05 10:56:53 · 959 阅读 · 1 评论 -
数据压缩解压(哈夫曼编码)
数据压缩解压(哈夫曼编码)基本介绍赫夫曼编码也翻译为 哈夫曼编码(Huffman Coding),又称霍夫曼编码,是一种编码方式, 属于一种程序算法赫夫曼编码是赫哈夫曼树在电讯通信中的经典的应用之一。赫夫曼编码广泛地用于数据文件压缩。其压缩率通常在 20%~90%之间赫夫曼码是可变字长编码(VLC)的一种。Huffman 于 1952 年提出一种编码方法,称之为最佳编码原理剖析通信领域中信息的处理方式 1-定长编码通信领域中信息的处理方式 2-变长编码通信领域中信息的处理方式原创 2022-04-03 20:58:44 · 3457 阅读 · 1 评论 -
赫夫曼树的介绍和构造
package com.iflytek.huffmantree;import java.util.ArrayList;import java.util.Collections;import java.util.List;public class HuffmanTree { public static void main(String[] args) { int[] arr = {13, 7, 8, 3, 29, 6, 1}; Node root = cr.原创 2022-03-28 00:00:00 · 303 阅读 · 0 评论 -
树结构实际应用-大根堆小根堆之堆排序
树结构实际应用-大根堆小根堆之堆排序堆排序基本介绍堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复 杂度均为O(nlogn),它也是不稳定排序。堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆, 注意 : 没有 要求结点的左孩子的值和右孩子的值的大小关系。每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆大顶堆举例说明一般升序采用大顶堆,降序采用小顶堆堆排序堆排序基本思想堆排序的基本思想是原创 2022-03-21 10:54:29 · 587 阅读 · 13 评论 -
前序后续中序线索化二叉树的遍历-完整版-内含全部代码实现
前序后续中序线索化二叉树的遍历完整版-内含全部代码实现package com.iflytek.tree;public class ThreadBinaryTreeDemo { public static void main(String[] args) { HeroNode2 root = new HeroNode2(1, "tom"); HeroNode2 node2 = new HeroNode2(3, "jack"); HeroNode2原创 2022-03-19 02:45:00 · 653 阅读 · 21 评论 -
中序遍历线索化二叉树-内含全部代码实现
中序遍历线索化二叉树说明:对前面的中序线索化的二叉树, 进行遍历分析:因为线索化后,各个结点指向有变化,因此原来的遍历方式不能使用,这时需要使用新的方式遍历线索化二叉树,各个节点可以通过线型方式遍历,因此无需使用递归方式,这样也提高了遍历的效率。 遍历的次序应当和中序遍历保持一致。代码实现package com.iflytek.tree;public class ThreadBinaryTreeDemo { public static void main(String[] ar原创 2022-03-18 12:29:57 · 1735 阅读 · 8 评论 -
线索化二叉树-內含全部代码实现
线索化二叉树先看一个问题将数列 {1, 3, 6, 8, 10, 14 } 构建成一颗二叉树. n+1=7(7个空余节点)问题分析:当我们对上面的二叉树进行中序遍历时,数列为 {8, 3, 10, 1, 6, 14 }但是 6, 8, 10, 14 这几个节点的 左右指针,并没有完全的利用上.如果我们希望充分的利用 各个节点的左右指针, 让各个节点可以指向自己的前后节点,怎么办?解决方案-线索二叉树线索二叉树基本介绍n 个结点的二叉链表中含有 n+1 【公式 2n-(n-1)原创 2022-03-11 12:19:06 · 453 阅读 · 24 评论 -
顺序存储二叉树
顺序存储二叉树基本说明 从数据存储来看,数组存储方式和树的存储方式可以相互转换,即数组可以转换成树,树也可以转换成数组,看右面的示意图。要求:右图的二叉树的结点,要求以数组的方式来存放 arr : [1, 2, 3, 4, 5, 6, 6] 2) 要求在遍历数组 arr 时,仍然可以以前序遍历,中序遍历和后序遍历的方式完成结点的遍历顺序存储二叉树的特点:顺序二叉树通常只考虑完全二叉树第 n 个元素的左子节点为 2 * n + 1第 n 个元素的右子节点为 2 * n + 2第原创 2022-03-10 01:15:00 · 208 阅读 · 5 评论 -
二叉树的删除-内含全部代码
二叉树的删除package com.iflytek.tree;//先创建HeroNode 结点class HeroNode { private int no; private String name; private HeroNode left;//默认 null private HeroNode right;//默认 null public HeroNode(int no, String name) { this.no = no;原创 2022-03-09 10:27:55 · 524 阅读 · 2 评论 -
前序-中序-后续遍历查找
前序-中序-后续遍历查找package com.iflytek.tree;//先创建HeroNode 结点class HeroNode { private int no; private String name; private HeroNode left;//默认 null private HeroNode right;//默认 null public HeroNode(int no, String name) { this.no = n原创 2022-03-08 11:23:31 · 145 阅读 · 3 评论 -
二叉树的遍历-内含全部代码实现
二叉树的概念树有很多种,每个节点最多只能有两个子节点的一种形式称为二叉树。二叉树的子节点分为左节点和右节点示意图如果该二叉树的所有叶子节点都在最后一层,并且结点总数= 2^n -1 , n 为层数,则我们称为满二叉树。如果该二叉树的所有叶子节点都在最后一层或者倒数第二层,而且最后一层的叶子节点在左边续,倒数第二 层的叶子节点在右边连续,我们称为完全二叉树二叉树遍历的说明使用前序,中序和后序对下面的二叉树进行遍历.前序遍历: 先输出父节点,再遍历左子树和右子树中序遍历: 先原创 2022-03-07 00:00:00 · 446 阅读 · 5 评论 -
树结构的基础部分
树结构的基础部分为什么需要树这种数据结构数组存储方式的分析优点:通过下标方式访问元素,速度快。对于有序数组,还可使用二分查找提高检索速度。缺点:如果要检索具体某个值,或者插入值(按一定顺序)会整体移动,效率较低 [示意图] 画出操作示意图:链式存储方式的分析优点:在一定程度上对数组存储方式有优化(比如:插入一个数值节点,只需要将插入节点,链接到链表中即可,删除效率也很好)。缺点:在进行检索时,效率仍然较低,比如(检索某个值,需要从头节点开始遍历) 【示意图】 操作示意图:树存原创 2022-03-06 09:49:30 · 85 阅读 · 5 评论 -
哈希表-內含全部代码实现
哈希表哈希表的基本介绍散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组 叫做散列表。一个简单的面试题*有一个公司,当有新的员工来报道时,要求将该员工的信息加入(id,性别,年龄,住址…),当输入该员工的id时,要求查 找到该员工的所有信息.要求:不使用数据库,速度越快越好=>哈希表(散列)添加时,保证按照 id原创 2022-03-05 09:12:22 · 187 阅读 · 2 评论 -
斐波那契(黄金分割法)查找算法
斐波那契(黄金分割法)查找算法斐波那契(黄金分割法)查找基本介绍:黄金分割点是指把一条线段分割为两部分,使其中一部分与全长之比等于另一部分与这部分之比。取其前三位 数字的近似值是 0.618。由于按此比例设计的造型十分美丽,因此称为黄金分割,也称为中外比。这是一个神 奇的数字,会带来意向不大的效果。斐波那契数列 {1, 1, 2, 3, 5, 8, 13, 21, 34, 55 } 发现斐波那契数列的两个相邻数 的比例,无限接近 黄金分割值 0.618斐波那契(黄金分割法)原理:斐波那契原创 2022-03-04 09:26:42 · 325 阅读 · 5 评论 -
插值查找算法
插值查找算法插值查找原理介绍: 插值查找算法类似于二分查找,不同的是插值查找每次从自适应mid 处开始查找。将折半查找中的求mid 索引的公式 , low 表示左边索引 left, high 表示右边索引 right. key 就是前面我们讲的 findValint mid = low + (high - low) * (key - arr[low]) / (arr[high] - arr[low]) ;/插值索引/ 对应前面的代码公式: int mid = left + (right – le原创 2022-03-03 09:54:40 · 206 阅读 · 0 评论 -
查找算法—二分查找
二分查找算法二分查找:请对一个有序数组进行二分查找 {1,8, 10, 89, 1000, 1234} ,输入一个数看看该数组是否存在此数,并且求出下标,如果没有就提示"没有这个数"。二分查找算法的思路二分查找的代码说明:增加了找到所有的满足条件的元素下标: 课后思考题: {1,8, 10, 89, 1000, 1000,1234} 当一个有序数组中,有多个相同的数值时,如何将所有的数值都查找到,比如这里的 1000.package com.iflytek.search;impor原创 2022-03-02 08:55:46 · 112 阅读 · 4 评论 -
查找算法—顺序查找
查找算法查找算法介绍在 java 中,我们常用的查找有四种:顺序(线性)查找二分查找/折半查找插值查找斐波那契查找线性查找算法有一个数列: {1,8, 10, 89, 1000, 1234} ,判断数列中是否包含此名称【顺序查找】 要求: 如果找到了,就提示找到,并给出下标值。代码实现package com.iflytek.search;public class SeqSearch { public static void main(String[] args) {原创 2022-03-02 08:37:53 · 378 阅读 · 0 评论 -
常用排序算法总结和对比
常用排序算法总结和对比一张排序算法的比较图相关术语解释:稳定:如果 a 原本在 b 前面,而 a=b,排序之后 a 仍然在 b 的前面;不稳定:如果 a 原本在 b 的前面,而 a=b,排序之后 a 可能会出现在 b 的后面;内排序:所有排序操作都在内存中完成;外排序:由于数据太大,因此把数据放在磁盘中,而排序通过磁盘和内存的数据传输才能进行;时间复杂度:一个算法执行所耗费的时间。空间复杂度:运行完一个程序所需内存的大小。n: 数据规模 8) k: “桶”的个数In-place原创 2022-03-01 07:00:00 · 109 阅读 · 0 评论 -
基数排序—RadixSort
基数排序基数排序(桶排序)介绍:基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或 bin sort,顾名思义,它是通过键值的各个位的值,将要排序的元素分配至某些“桶”中,达到排序的作用基数排序法是属于稳定性的排序,基数排序法的是效率高的稳定性排序法基数排序(Radix Sort)是桶排序的扩展基数排序是 1887 年赫尔曼·何乐礼发明的。它是这样实现的:将整数按位数切割成不同的数字,然后按每个位数分别比较。转载 2022-02-28 07:00:00 · 201 阅读 · 0 评论 -
归并排序—MergeSort
归并排序归并排序介绍归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修 补"在一起,即分而治之)。归并排序思想示意图 1-基本思想:归并排序思想示意图 2-合并相邻有序子序列:再来看看治阶段,我们需要将两个已经有序的子序列合并成一个有序序列,比如上图中的最后一次合并,要将 [4,5,7,8]和[1,原创 2022-02-27 11:48:54 · 105 阅读 · 0 评论 -
快速排序—QuickSort
快速排序QuickSort快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要 Ο(nlogn) 次比较。在最坏状况下则需要 Ο(n2) 次比较,但这种状况并不常见。事实上,快速排序通常明显比其他 Ο(nlogn) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来。快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists)。快速排序又是一种分而治之思想在排序算法上的典型应原创 2022-02-26 12:11:12 · 126 阅读 · 0 评论 -
希尔排序—ShellSort
希尔排序简单插入排序存在的问题我们看简单的插入排序可能存在的问题. 数组 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}结论: 当需要插入的数是较小的数时,后移的次数明显增多,对效率有影响.希尔排序法介绍希尔排序是希尔(Donald Shell)于 1959 年提出的一种排序算法。希尔排原创 2022-02-25 10:45:01 · 101 阅读 · 0 评论 -
简单插入排序
插入排序插入排序法介绍:插入式排序属于内部排序法,是对于欲排序的元素以插入的方式找寻该元素的适当位置,以达到排序的目的。和打扑克牌原理类似。插入排序法思想插入排序(Insertion Sorting)的基本思想是:把 n 个待排序的元素看成为一个有序表和一个无表,开始时有序表中只包含一个元素,无序表中包含有 n-1 个元素,排序过程中每次从无序表中取出第一个元素,把它的排序码依次与有序表元素的排序码进行比较,将它插入到有序表中的适当位置,使之成为新的有序表。插入排序的代码实现虽然没有冒泡原创 2022-02-24 11:23:43 · 198 阅读 · 0 评论 -
简单选择排序
选择排序选择排序(select sorting)也是一种简单的排序方法。它的基本思想是:第一次从 arr[1]~arr[n-1]中选取最小值,与 arr[0]交换,第二次从 arr[2]~arr[n-1]中选取最小值,与 arr[1]交换,第三次从 arr[3]~arr[n-1]中选取最小值,与 arr[2] 交换,…,第 i 次从 arr[i]~arr[n-1]中选取最小值,与 arr[i-1]交换,…, 第 n-1 次从 arr[n-1]中选取最小值, 与 arr[n-2]交换,总共通过 n-1原创 2022-02-23 11:03:33 · 215 阅读 · 0 评论 -
递归-迷宫问题
递归-迷宫问题迷宫问题说明:1 小球得到的路径,和程序员设置的找路策略有关即:找路的上下左右的顺序相关2 再得到小球路径时,可以先使用(下右上左),再改成(上右下左),看看路径是不是有变化测试回溯现象思考: 如何求出最短路径?...原创 2022-02-21 12:09:11 · 91 阅读 · 0 评论 -
递归的简单介绍
递归递归应用场景看个实际应用场景,迷宫问题(回溯), 递归(Recursion)递归的概念简单的说: 递归就是方法自己调用自己,每次调用时传入不同的变量.递归有助于编程者解决复杂的问题,同时可以让代码变得简洁。递归调用机制我列举两个小案例,来帮助大家理解递归,部分学员已经学习过递归了,这里在给大家回顾一下递归调用机制打印问题阶乘问题使用图解方式说明了递归的调用机制代码演示package com.iflytek.recursion;import java.util原创 2022-02-20 10:32:15 · 287 阅读 · 0 评论 -
排序算法简介
排序算法简介排序算法的介绍排序也称排序算法(Sort Algorithm),排序是将一组数据,依指定的顺序进行排列的过程排序的分类:内部排序: 指将需要处理的所有数据都加载到内部存储器(内存)中进行排序。外部排序法: 数据量过大,无法全部加载到内存中,需要借助外部存储(文件等)进行排序。常见的排序算法分类(见右图):算法的时间复杂度度量一个程序(算法)执行时间的两种方法事后统计的方法这种方法可行, 但是有两个问题:一是要想对设计的算法的运行性能进行评测,需要实际运行该程原创 2022-02-19 10:39:52 · 225 阅读 · 0 评论 -
逆波兰计算器完整版
逆波兰计算器完整版详情介绍完整版的逆波兰计算器,功能包括支持 + - * / ( )多位数,支持小数,兼容处理, 过滤任何空白字符,包括空格、制表符、换页符说明:逆波兰计算器完整版考虑的因素较多,下面给出完整版代码供同学们学习,其基本思路和前面一样,也是使用到:中缀表达式转后缀表达式。代码实现package com.iflytek.stack;import java.util.ArrayList;import java.util.Collections;import ja原创 2022-02-18 11:38:47 · 345 阅读 · 0 评论 -
中缀表达式转化为后缀表达式
中缀表达式转化为后缀表达式package com.iflytek.stack;import java.util.ArrayList;import java.util.List;import java.util.Stack;class Operation { private static int ADD_SUB = 1; private static int MUL_DIV = 2; //写一个方法,返回对应的优先级数字 public static int ge原创 2022-02-17 10:38:54 · 1222 阅读 · 0 评论 -
逆波兰计算器
逆波兰计算器问题我们完成一个逆波兰计算器,要求完成如下任务:输入一个逆波兰表达式(后缀表达式),使用栈(Stack), 计算其结果支持小括号和多位数整数,因为这里我们主要讲的是数据结构,因此计算器进行简化,只支持对整数的计算。思路分析例如: (3+4)×5-6 对应的后缀表达式就是 3 4 + 5 × 6 - , 针对后缀表达式求值步骤如下:从左至右扫描,将 3 和 4 压入堆栈;遇到+运算符,因此弹出 4 和 3(4 为栈顶元素,3 为次顶元素),计算出 3+4 的值,得 7,原创 2022-02-16 16:35:53 · 156 阅读 · 0 评论 -
中缀表达式的应用(计算器)
中缀表达式的应用(计算器)问题 使用栈来实现综合计算器思路分析(图解)代码实现 —[1. 先实现一位数的运算, 2. 扩展到多位数的运算]package com.iflytek.stack;/** * 中缀计算里的逻辑要自己好好想想 *///先创建一个栈,直接使用前面创建好// 定义一个 ArrayStack2 表示栈, 需要扩展功能class ArrayStack2 { private int maxSize;// 栈的大小 private int[] stack原创 2022-02-15 10:17:53 · 131 阅读 · 1 评论