数据结构与算法
基于Java语言实现数据结构与算法
朱古力...
这个作者很懒,什么都没留下…
展开
-
28 图、图的存储、图的深度优先遍历和广度优先遍历
图文章目录图1. 图基本介绍1.1 为什么要有图1.2 图的举例说明1.3 图的常用概念2. 图的表示方式2.1 邻接矩阵2.2 邻接表3. 图的邻接矩阵存储方式的代码实现4. 图的深度优先遍历4.1 步骤4.2 代码实现5. 图的广度优先遍历5.1 步骤5.2 代码实现1. 图基本介绍1.1 为什么要有图线性表局限于一个直接前驱和一个直接后继的关系。树也只能有一个直接前驱也就是父节点。当我们需要表示多对多的关系时, 这里我们就用到了图。1.2 图的举例说明图是一种数据结构,其中结点原创 2020-07-08 10:24:16 · 375 阅读 · 0 评论 -
27 多路查找树
多路查找树文章目录多路查找树1. 二叉树与 B 树2. 多叉树3. B 树的基本介绍4. 2-3 树4.1 2-3 树是最简单的 B 树结构,特点如下4.2 2-3 树应用案例5. B 树、B+ 树和 B* 树5.1 B 树的介绍5.2 B+ 树的介绍5.3 B* 树的介绍1. 二叉树与 B 树二叉树需要加载到内存,如果二叉树的节点较少,没有什么问题,但是如果二叉树的节点很多就会出现如下问题:在构建二叉树时,需要多次进行 IO 操作(数据可能存储在数据库或文件中),所以对构建二叉树的速度会有影响原创 2020-07-08 10:18:59 · 820 阅读 · 0 评论 -
26 平衡二叉树(左旋、右旋、双旋)
平衡二叉树文章目录平衡二叉树1. 引入2. 基本介绍3. 左旋转4. 右旋转5. 双旋转6. 完整代码1. 引入给出一个数列 {1,2,3,4,5,6},创建一棵二叉排序树,并分析问题。问题一:左子树全部为空,从形式上看,更像是一个单链表。问题二:插入速度没有影响,但是查询速度明显降低,不能发挥 BST 的优势,因为每次还需要比较左子树,其查询速度比单链表还慢 。解决方案:平衡二叉树 AVL 。2. 基本介绍平衡二叉树也叫平衡二叉搜索树又被称为 AVL 树, 可以保证查询效率较高。它原创 2020-07-05 23:18:39 · 563 阅读 · 0 评论 -
25 二叉排序树的创建、遍历与节点的删除
二叉排序树文章目录二叉排序树1. 引入1.1 一个需求1.2 解决方案分析1.2.1 使用数组1.2.2 使用链式存储1.2.3 使用二叉排序树2. 二叉排序树介绍3. 二叉排序树的创建和遍历3.1 创建3.2 遍历4. 二叉排序树的删除4.1 删除叶子节点4.2 删除只有一棵子树的节点4.3 删除有两棵子树的节点4.4 代码实现1. 引入1.1 一个需求给定 1 个序列(7,3,10,12,5,1,9),要求能够高效的完成对数据的查询和添加。1.2 解决方案分析1.2.1 使用数组数组原创 2020-07-03 15:22:39 · 354 阅读 · 0 评论 -
24 哈夫曼编码实现字符串的压缩与解压
哈夫曼编码文章目录哈夫曼编码1. 步骤2. 数据压缩3. 数据解压1. 步骤传输的字符串:i like like like java do you like a java。计算各个字符对应的个数。按照字符出现的次数构建一颗赫夫曼树, 次数作为权值。根据赫夫曼树,给各个字符,规定编码 (前缀编码), 向左的路径为 0 向右的路径为 1。则有,o: 1000 u: 10010 d: 100110 y: 100111 i: 101 a : 110 k: 1110 e: 1111 j: 0000原创 2020-07-02 10:17:56 · 896 阅读 · 0 评论 -
23 哈夫曼树
哈夫曼树文章目录哈夫曼树1. 基本介绍2. 重要概念3. 构成哈夫曼树的步骤4. 代码实现1. 基本介绍给定 n 个权值作为 n 个叶子结点,构造一棵二叉树,若该树的带权路径长度 (wpl) 达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树 (Huffman Tree)。赫夫曼树是带权路径长度最短的树,权值较大的结点离根较近。2. 重要概念路径和路径长度: 在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。通路中分支的数目称为路径长度。若规定根结点的层数为 1,则原创 2020-06-22 09:37:59 · 255 阅读 · 0 评论 -
22 堆排序的思想与代码实现
堆排序1. 堆排序基本思想将待排序序列构造成一个大顶堆;此时,整个序列的最大值就是堆顶的根节点;将其与末尾元素进行交换,此时末尾就为最大值;然后将剩余 n-1 个元素重新构造成一个堆,这样会得到 n 个元素的次小值。如此反复执行,便能得到一个有序序列了。2. 堆排序代码实现import java.util.Arrays;public class HeapSort { public static void main(String[] args) { int[] a原创 2020-06-19 16:44:42 · 167 阅读 · 0 评论 -
21 线索二叉树 (前序、中序、后序线索化二叉树及遍历)
线索二叉树1. 基本介绍n 个结点的二叉链表中含有 n+1 【公式 2n-(n-1)=n+1】 个空指针域。利用二叉链表中的空指针域,存放指向该结点在某种遍历次序下的前驱和后继结点的指针(这种附加的指针称为"线索")。这种加上了线索的二叉链表称为线索链表,相应的二叉树称为线索二叉树( Threaded BinaryTree )。根据线索性质的不同,线索二叉树可分为前序线索二叉树、中序线索二叉树和后序线索二叉树三种。一个结点的前一个结点,称为前驱结点。一个结点的后一个结点,称为后继结点。2.原创 2020-06-19 15:07:35 · 879 阅读 · 0 评论 -
20 顺序存储二叉树
顺序存储二叉树文章目录顺序存储二叉树1. 概念2. 特点3. 遍历顺序存储二叉树1. 概念从数据存储来看,数组存储方式和树的存储方式可以相互转换,即数组可以转换成树,树也可以转换成数组。示意图2. 特点顺序二叉树通常只考虑完全二叉树。第 n 个元素的左子节点为 2 * n + 1 。第 n 个元素的右子节点为 2 * n + 2 。第 n 个元素的父节点为 (n-1) / 2 。n : 表示二叉树中的第几个元素(按 0 开始编号如图所示)。3. 遍历顺序存储二叉树p原创 2020-06-18 08:42:26 · 163 阅读 · 0 评论 -
19 二叉树删除指定节点
二叉树删除指定节点规定:1.1 如果删除的节点是叶子节点,则删除该节点。1.2 如果删除的节点是非叶子节点,则删除该子树。步骤:2.1 如果树是空树,无需操作直接返回。如果根节点是要删除的节点,则直接将二叉树置空。2.2 如果当前节点的左子节点不为空,并且左子节点就是要删除的节点,就将 this.left = null,并且直接返回。2.3 如果当前节点的右子节点不为空,并且左子节点就是要删除的节点,就将 this.right = null,并且直接返回。2.4 如果第2步和第3步没原创 2020-06-17 16:10:02 · 483 阅读 · 0 评论 -
18 二叉树查找指定节点
二叉树查找指定节点通过 前序遍历、中序遍历、后序遍历 在二叉树中查找符合条件的节点。代码实现public class BinaryTreeDemo { public static void main(String[] args) { // 手动构建二叉树 Node root = new Node(1); Node node2 = new Node(2); Node node3 = new Node(3);原创 2020-06-17 14:34:50 · 411 阅读 · 0 评论 -
17 二叉树的前序、中序、后序遍历
二叉树的前序、中序、后序遍历前序遍历: 先输出父节点,再遍历左子树和右子树。中序遍历: 先遍历左子树,再输出父节点,再遍历右子树。后序遍历; 先遍历左子树,再遍历右子树,最后输出父节点。代码实现://需求:遍历上图中的二叉树public class BinaryTreeDemo { public static void main(String[] args) { // 手动构建二叉树 Node root = new Node(1);原创 2020-06-17 10:37:16 · 165 阅读 · 0 评论 -
16 哈希表的简单实现
哈希表基本介绍: 散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。代码实现:import java.util.Scanner;// 测试哈希表public class HashTableDemo { public static void main(String[] args) {原创 2020-06-16 22:36:03 · 276 阅读 · 0 评论 -
15 斐波那契查找算法的思想与代码实现
1. 斐波那契查找算法思想: 斐波那契查找原理与二分、插值相似,仅仅改变了中间结点(mid)的位置,mid 不再是中间或插值得到,而是位于黄金分割点附近,即 mid=low+F(k-1)-1(F 代表斐波那契数列),如下图所示代码实现import java.util.Arrays;public class FibonacciSearch { public static void main(String[] args) { int[] arr = {1,8,10,8原创 2020-06-16 11:06:31 · 244 阅读 · 0 评论 -
14 顺序查找、二分查找、插值查找的思想以及代码实现
文章目录1. 顺序查找2. 二分查找3. 插值查找1. 顺序查找思想: 遍历整个数组,查找待查找的元素。代码实现public class SeqSearch { public static void main(String[] args) { int[] arr = {4,7,5,1,9,27,45,33,22}; int index = seqSearch(arr, 29); System.out.println(index);原创 2020-06-15 11:28:42 · 190 阅读 · 0 评论 -
13 排序算法的总结
算法种类时间复杂度空间复杂度稳定性直接插入排序best: O(n)O(n)O(n)avg: O(n2)O(n^2)O(n2)worst: O(n2)O(n^2)O(n2) O(1)O(1)O(1)稳定折半插入排序avg: O(n2)O(n^2)O(n2)O(1)O(1)O(1)稳定希尔排序avg: O(n1.3)O(n^{1.3})O(n1.3)worst: O(n2)O(n^2)O(n2)O(1)O(1)O(1)不稳定冒泡排序best: O(n...原创 2020-06-14 17:00:55 · 120 阅读 · 0 评论 -
12 基数排序思想及代码实现
基数排序思想: 将所有待比较数值统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。 这样从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列。图解:代码实现:import java.util.Arrays;/** * 基数排序 */public class RadixSort { public static void main(String[] args) { int[] arr = {53, 3, 17, 2原创 2020-06-14 16:59:44 · 199 阅读 · 0 评论 -
11 快速排序、归并排序的思想以及代码实现
文章目录1. 快速排序2. 归并排序1. 快速排序思想: 却低昂一个基准值,通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比基准值小,另一部分所有的数据都必基准值大,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列 。图解代码实现import java.util.Arrays;public class QuickSort { public static void main(String[] args原创 2020-06-14 12:19:04 · 188 阅读 · 0 评论 -
10 插入排序、希尔排序思想以及代码实现
文章目录1. 插入排序1.1 思想1.2 代码实现2. 希尔排序2.1 思想2.2 代码实现1. 插入排序1.1 思想插入排序(Insertion Sorting)的基本思想是:把 n 个待排序的元素看成为一个有序表和一个无序表,开始时有序表中只包含一个元素**,**无序表中包含有 n-1个元素,排序过程中每次从无序表中取出第一个元素,把它的排序码依次与有序表元素的排序码进行比较,将它插入到有序表中的适当位置,使之成为新的有序表。图示1.2 代码实现import java.util原创 2020-06-07 17:50:07 · 159 阅读 · 0 评论 -
09 冒泡排序、选择排序的思想以及代码实现
冒泡排序、选择排序的思想以及代码实现文章目录冒泡排序、选择排序的思想以及代码实现1. 冒泡排序1.1 思想1.2 代码实现2. 快速排序2.1 思想2.2 代码实现1. 冒泡排序1.1 思想冒泡排序(Bubble Sorting)的基本思想是:通过对待排序序列从前向后,依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就象水底下的气泡一样逐渐向上冒。优化: 因为排序的过程中,各元素不断接近自己的位置,如果一趟比较下来没有进行过交换,就说明序列有序,因此可以在排序过程中设置一原创 2020-06-05 16:58:07 · 193 阅读 · 0 评论 -
08 递归-迷宫问题
描述: 给出一个迷宫,运用递归,得到走出迷宫的路径信息。代码实现:import java.util.ArrayList;import java.util.List;/** * 一些约定: * 1. 围墙及路障用 1 表示 * 2. 没有走过的点用 0 表示 * 3. 可以走通的点用 2 表示 * 4. 走过但走不通的点用 3 表示 * 5. 走的策略为:下右上左 */public class Maze { publi..原创 2020-05-14 20:25:38 · 120 阅读 · 0 评论 -
07 逆波兰计算器(后缀表达式求值)
逆波兰计算器1. 思路分析:(3+4)×5-6 对应的后缀表达式就是 3 4 + 5 × 6 - , 针对后缀表达式求值步骤如下:从左至右扫描,将 3 和 4 压入堆栈;遇到+运算符,因此弹出 4 和 3(4 为栈顶元素,3 为次顶元素),计算出 3+4 的值,得 7,再将 7 入栈;将 5 入栈;接下来是×运算符,因此弹出 5 和 7,计算出 7×5=35,将 35 入栈;将 6 入栈;最后是-运算符,计算出 35-6 的值,即 29,由此得出最终结果。2. 代码实现:/** *原创 2020-05-14 15:28:24 · 152 阅读 · 0 评论 -
06 中缀表达式转后缀表达式的详细步骤及代码实现
中缀表达式转换为后缀表达式1. 步骤:初始化:运算符栈 stack, 存储中间结果的列表 list;从左至右扫描中缀表达式;遇到操作数时,加入到 list 中;遇到运算符时,比较其于 satck 栈顶运算符的优先级:(1)如果 stack 为空,或者栈顶运算符为 ( ,则直接将此运算符入栈;(2)否则,若优先级比栈顶运算符的高,将此运算符入栈;(3)否则,将 stack 栈顶的运算符弹出并加入到 list 中,再次转到 (4.1) 与新的栈顶运算符比较。遇到括号时:(原创 2020-05-14 15:25:13 · 567 阅读 · 0 评论 -
05 中缀表达式求值思路及代码实现
中缀表达式求值1. 思路:定义两个栈:数栈、符号栈。通过一个索引,遍历表达式。如果发现是数字,就直接入数栈。如果发现是一个符号,则分情况讨论:(1) 如果发现符号栈为空就直接入栈。(2) 如果当前的操作符的优先级大于栈中的操作符,就直接入符号栈。(3) 如果符号栈当前有操作符,就进行比较,如果当前的操作符的优先级小于或等于栈中的操作符,就从数栈中弹出两个数,从符号栈中弹出一个符号,进行运算,将结果入数栈,再将当前的符号入符号栈。当表达式遍历完毕,就顺序的从数栈和符号栈中原创 2020-05-14 15:20:32 · 454 阅读 · 0 评论 -
04 栈的基本介绍及代码实现
栈1. 栈的介绍栈是一个先入后出 (FILO-First In Last Out) 的有序列表。栈(stack) 是限制线性表中元素的插入和删除只能在线性表的同一端进行的一种特殊线性表。允许插入和删除的 一端,为变化的一端,称为栈顶(Top),另一端为固定的一端,称为栈底(Bottom)。根据栈的定义可知,最先放入栈中元素在栈底,最后放入的元素在栈顶,而删除元素刚好相反,最后放入的元 素最先删除,最先放入的元素最后删除。2. 栈的应用场景子程序的调用:在跳往子程序前,会先将下原创 2020-05-14 15:16:42 · 137 阅读 · 0 评论 -
03 单链表、双向链表、循环链表(约瑟夫环问题)及代码实现
链表1. 链表介绍内存中的存储方式:链表是以节点的方式来存储,是链式存储 。每个节点包含 data 域, next 域:指向下一个节点。如图:发现链表的各个节点不一定是连续存储。链表分带头节点的链表和没有头节点的链表,根据实际的需求来确定。单链表(带头结点) 逻辑结构示意图如下:2. 单链表的实现节点定义:/** * 英雄节点类 */class HeroNode { public int no; public String name; p原创 2020-05-10 22:13:28 · 346 阅读 · 0 评论 -
02 数据结构与算法之队列、循环队列及代码实现
队列1. 队列介绍队列是一个有序列表,可以用数组或是链表来实现。遵循先入先出的原则。即:先存入队列的数据,要先取出。后存入的要后取出。2. 数组模拟队列 MaxSize 是该队列的最大容量。front 和 rear 分别记录队列前后端的下标,初始值为 front = rear = -1。队空:front == rear。队满:rear == MaxSize - 1。入队:将尾指针往后移:rear + 1;若尾指针 rear 小于队列的最大下标 maxSiz原创 2020-05-10 22:06:42 · 117 阅读 · 0 评论 -
01 数据结构与算法之稀疏矩阵的处理及代码实现
稀疏矩阵1. 基本介绍稀疏矩阵:数组存放很多没有意义的数据。稀疏数组的处理方法:(1)记录数组一共有几行几列,有多少个不同的值。(2)把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模。2. 思路分析遍历原始的稀疏矩阵,得到有效的数据的个数 sum。根据 sum 就可以创建新数组 newArray[sum + 1][3]。新数组的第一行存储稀疏数组的行数、列数、有效数个数。之后的每一行存储有效数据的行数、列数、该有效数。[外链图片转存失败,源站原创 2020-05-10 22:02:30 · 573 阅读 · 0 评论