![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
扶夙
这个作者很懒,什么都没留下…
展开
-
哈夫曼树和哈夫曼编码
一、在通讯领域中信息处理的方式 (1)定长编码 我们要传输一条数据: i like like like java do you like a java //共40个字符 通过Ascii码将其转化为对应的二进制形式 http://tool.alixixi.com/ascii2/ 按照二进制来传递数据,总长度为359(包括空格) 通常我们不会这么去做,主要是因为我们要传输的数据太长了,很不划算 (2)变长编码 我们要传输一条数据: i like like like java do you like a j原创 2022-04-02 13:39:00 · 905 阅读 · 0 评论 -
数据结构-B+树
一、B+树的结构特点 1.非叶子节点仅具有索引作用,也就是说,非叶子节点只能存储Key,不能存储value 2.树的所有叶节点构成一个有序链表,可以按照key排序的次序依次遍历全部数据。 二、B+树存储数据 若参数M选择为5,那么每个节点最多包含4个键值对,我们以5阶B+树为例,看看B+树的数据存储 (a) 在空树当中插入5 (b)继续插入8,10,15 (c)继续插入16 (d)继续插入17 (e)继续插入18 (f)继续插入6,9,1920,21,22 (e)继续插入7 三、B+树和B树的原创 2022-04-02 13:38:28 · 419 阅读 · 0 评论 -
数据结构-B树
一、认识2-3查找树 二叉排序树简单的实现在多数情况能够达到预期的查找效率,但是每个节点只能存储一个元素和只能有两个孩子,使得在大量数据下会造成二叉排序树的深度特别大,那么在进行查找时多次的访问会造成查找效率的下降,同时,在对二叉查找树进行插入时,可能会破坏二叉查找树的平衡。为了降低对于树的访问次数,实现树的平衡,我们需要新的数据结构来处理这样的问题。 2-3查找树的定义 2-节点 包含一个键(及其对应的值)和两条链,左连接指向2-3树中都小于该节点,右链接所指向的值都大于该节点。 3-节点 包含两个键(及原创 2022-04-02 13:38:10 · 107 阅读 · 0 评论 -
数据结构-红黑树
一、首先先来了解什么是2-3-4树 1.简介 2-3-4属于一种多路查找树,是一种四阶的B树,它的结果有以下特点 所有叶子节点都拥有相同的深度 节点只能是2-节点、3-节点、4-节点节点 元素的排序整体上保持二叉查找树的特性,即父节点大于左子节点,小于右子节点;当节点有多个元素时,每个元素都必须大于他左边的和他的左子树中的元素。 2.三种节点的示意图 ①:2-节点:有两个子树的节点 ③:3-节点:有三个子树的节点 ④:4-节点:有四颗子树的节点 3.构建一颗2-3-4树 2-3-4树中结点添加需要遵守原创 2022-04-01 17:40:10 · 90 阅读 · 0 评论 -
平衡二叉树
平衡二叉树画图网站 https://www.cs.usfca.edu/~galles/visualization/AVLtree.html 一、有序二叉树可能存在的问题 给一个数列{1,2,3,4,5,6},要求创建一颗二叉排序树(BST)并分析问题所在 二、平衡二叉树的基本介绍 平衡二叉树具有以下特点: 1)它是一颗空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两颗子树都是一颗平衡二叉树。 2)平衡因子: 左子树的高度 - 右子树的高度 我们将平衡因子的绝对值小于1的的有序二叉树称为平衡二叉树原创 2022-04-01 17:37:52 · 845 阅读 · 0 评论 -
二叉排序树的删除
一、二叉排序树的删除 二叉排序树的删除情况比较复杂,有以下三种情况需要考虑 1)删除叶子节点 (比如:2,5,9,10) 2) 删除只有一个子树的节点(比如:1) 3)删除有两个子树的节点 (比如:7,3,10) 分析情况一:删除叶子节点 (比如:2,5,9,10)思路 分析情况二: 删除只有一个子树的节点(比如:1)思路 分析情况三: 删除有两个子树的节点 (比如:7,3,10)思路 二、代码实现 1.查找相应的节点 /** * * @param value 希望删除啊的节点值 *原创 2022-04-01 17:35:42 · 1550 阅读 · 0 评论 -
树-二叉排序树的构建
一、二叉排序树介绍 二叉排序树:对于二叉排序树的任何一个非叶子节点,要求左子节点的值比当前节点的值小,右子节点的值比当前节点的值大。 特别说明:如果有相同的值,可以将该节点放在左子节点或右子节点 一、构建有序二叉树实现思路 如果左子树不为空,那么左子树上的所有值都均小于它的根节点的值 如果右子树不为空,那么右子树上的所有值都均大于或等于它的根节点的值 左,右子树也为二叉排序树 新建TreeNode节点 public class TreeNode { private TreeNode leftTreeN原创 2022-04-01 17:34:26 · 3370 阅读 · 0 评论 -
数据结构-树
一、为什么需要树这样数据结构 1.数组存储方式分析 优点:通过下表方式访问元素,速度快。对于有序数组没还可以使用二分查找提高检索速度。 缺点:如果要检索某一个具体值,效率比较低下 2.链式存储方式分析 优点:在一定程度上对数组存储方式进行优化(比如插入一个节点,只需要将插入节点,链接到链表当中可删除的效率也很好)。 缺点:在进行检索时,效率仍然比较低,比如(检索某个数值,需要从头结点开始遍历) 3.树存储方式分析 能提高数据存储,读取的效率,比如利用二叉排序树,既可以保证数据的检索速度。同时也可以保证数据的原创 2022-04-01 17:32:05 · 96 阅读 · 0 评论 -
数据结构-哈希表
一、哈希表的由来 我们的java程序通过访问数据库来获取数据,但是当我们对数据库所查询的信息进行大量分析后得知,我们要查询的数据满足二八定律,一般数据库的数据基本存储在磁盘当中。这使得每次查询数据将变得无比缓慢。为此我们可以将经常查询的数据放置在内存当中,在内存当中设置缓存,我们java程序先去缓存当中去查询数据,这样将大大节省我们的数据查询时间。 缓存可以分为两种一种是市面上的存储产品,例如redis.也或者我们自己可以开发一个缓存(哈希表) 二、哈希表的数据结构 散列表(Hash table,也叫哈希原创 2022-04-01 17:30:22 · 117 阅读 · 0 评论 -
数据结构-队列
队列的特点:先进先出(这里改成了in和out放在一起) 实现 public class Queue { private int[] arr; // 该数据用于存放数据, 模拟队列 private int front; // 队列头 private int rear; // 队列尾 //构造方法 public Queue(int size){ arr = new int[size]; front = 0; rea原创 2022-04-01 17:28:22 · 51 阅读 · 0 评论 -
数据结构-栈
栈的特点是:先进后出 一、我们为什么要将数组封装起来? 同学们的疑惑点:为什么要用数组来进行先进先出? 我们知道数组有一个特点就是能够通过下标的形式来进行获取和设置数据。但是一般情况之下我们是不能够得到数组的下标的,所以在这个地方我们一般需要借助相应的游标。并不是直接去操作数组。 这样的话我们就可以将这个数组进行封装。 二、实现栈 public class Stack { //声明一个数组 private int[] arr; //声明头结点 private int flage = 0;原创 2022-04-01 17:25:48 · 71 阅读 · 0 评论 -
数据结构-链表
线性结构的链式存储是用若干地址分散的存储单元存储数据元素,逻辑上相邻的两个数据元素在物理位置上并不一定相邻,必须采用附加信息来表示数据元素之间的顺序关系。因此存储一个数据元素的数据单元至少包含两部分------数据域和地址域 上述的结构通常称为结点 一个节点表示一个数据元素,通常节点当中的地址会把数据结点连接起来,节点当中的连接关系体现了线性表当中数据元素间的顺序关系,采用这种关系的称为线性链表。 从上图当中,head是线性链表当中的第一个节点,但是这个节点在数据域当中并没有存储数据,这里之所以写这个的原创 2022-04-01 17:22:02 · 123 阅读 · 0 评论 -
八大排序-归并排序
合并两个有序序列 基本思想 归并排序就是递归得将原始数组递归对半分隔,直到不能再分(只剩下一个元素)后,开始从最小的数组向上归并排序。 将一个数组拆分为两个,从中间点拆开,通过递归操作来实现一层一层拆分。 从左右数组中选择小的元素放入到临时空间,并移动下标到下一位置。 重复步骤2直到某一下标达到尾部。 将另一序列剩下的所有元素依次放入临时空间。 将临时空间的数据依次放入原数据数组。 动态图 下边是动态图 分解的时候我们可以使用递归的方式进行 首先我们可以先定义三个变量, 数组的头部位置可以定义为 low原创 2022-04-01 17:18:55 · 52 阅读 · 0 评论 -
八大排序-堆排序
堆:大顶堆:在完全二叉树的基础上,每个节点的值都大于或等于他的左右孩子 小顶堆:在完全二叉树的基础上,每个节点的值都小于或等于他的左右孩子 步骤: 1.定义一个游标p,然后从后向前遍历 2.找到p的左右孩子当中的最大值,和p的值进行对比,如果父节点的值大,不需要互换位 置,如果小,则互换位置 3.将最大值放入堆顶,然后进行维护,p指向堆顶,然后c指向p的孩子当中的最大值进行对比 ,然后p指向c,c指向原来c的孩子当中的最大值,然后依次向下对比,直到c指向空 4.之后堆顶元素和堆底元素进行互换,然后触发维护原创 2022-03-09 16:05:01 · 63 阅读 · 0 评论 -
八大排序-快速排序
先找一个基准数 之后将数组在相遇的位置拆分为两份继续进行以上步骤 用递归地方式 拆分到left>=right时 代码:import java.util.Arrays; public class QuickSort { public static void main(String[] args) { int[] arr = new int[] {5,7,8,9,1,4,3,2,6}; quickSort(arr, 0, arr.length-1); System.out.println(Array原创 2022-03-09 16:04:50 · 65 阅读 · 0 评论 -
数据结构-原理性
21.哈夫曼编码:是不定长编码 好处:存储空间更小 缺点:每次都有需要重新计算,解析很慢 作用:用来压缩的 空间的分配是以变量为申请单位的,哈夫曼编码存储在一个变量里 最优二叉树 每次挑任意两个最小的,所以最优树可能不唯一,但结果需要的存储空间是唯一的 22.电脑中磁盘的数据其实都是满的,之所以现实多少可用,只是把他们标记成了无效数据,并 不是空的,计算机中的的删除和格式化磁盘的原理就是把他们都标记为无效数据,并不是真 的删除,所以可以恢复数据 23.创建一个栈 代码: public class Tes原创 2022-03-09 16:04:34 · 57 阅读 · 0 评论 -
八大排序-基数排序
先按照个位排序,再按照十位排序,再按照百位排序。。。。以此类推 排序的过程就是创建编号为0~9的十个桶(二维数组),根据各个位上的值一次放进去,然后按顺序取出 crr[]是一个记录当前数组有几个数的数组 代码: package com.qcby.sort; import java.util.Arrays; public class RedixSort { public static void main(String[] args) { int[] arr = new int[]{100,15,10,2,2原创 2022-03-09 16:05:12 · 64 阅读 · 0 评论 -
八大排序-希尔排序
两两分组先排序,然后再合并排序,不断缩小步长,在组内进行插入排序 1.希尔排序如何分组: 第一轮:步长:数组长度的一半 第二轮:步长:数组长度的一半的一半 第三轮:步长:数组长度的一半的一半的一半 代码: import java.util.Arrays; public class ShellSort { public static void main(String[] args) { int[] arr = new int[]{5,7,4,2,0,1,3,6}; shellsort(arr);原创 2022-03-08 18:40:42 · 311 阅读 · 1 评论 -
八大排序-插入排序
将数组第一个看成排序好的数组,每次都把下一个插入前边已经排序好的数组中 代码: import java.util.Arrays; public class InsertSort { public static void main(String[] args) { int[] arr = new int[]{5,7,4,2,0,1,3,6}; insertsort(arr); } public static void insertsort(int[] arr) { for (int i =原创 2022-03-08 18:40:09 · 239 阅读 · 0 评论 -
八大排序-简单选择排序
每次循环找数组当中最小的值,放在有序数组中的第i位 代码: import java.util.Arrays; public class SearchSort { public static void main(String[] args) { int[] arr = new int[]{5,7,4,2,0,1,3,6}; searchSort(arr); } public static void searchSort(int[] arr) { for (int i = 0; i <原创 2022-03-08 18:39:37 · 48 阅读 · 0 评论 -
八大排序-冒泡排序
每次循环i和j都往后移一位,如果i>j的话,这两个进行交换 实现冒泡排序需要一个数组,两个游标,游标要执行多少轮 只有循环才能让游标移动 链表多用while循环,数组多用for循环,因为链表不知道长度,数组知道长度 代码: import java.util.Arrays; public class BubbleSort { public static void main(String[] args) { int[] arr = new int[]{5,7,4,2,0,1,3,6}; bub原创 2022-03-08 18:38:29 · 323 阅读 · 0 评论 -
数据结构_02
21.哈夫曼编码:是不定长编码 好处:存储空间更小 缺点:每次都有需要重新计算,解析很慢 作用:用来压缩的 空间的分配是以变量为申请单位的,哈夫曼编码存储在一个变量里 最优二叉树 每次挑任意两个最小的,所以最优树可能不唯一,但结果需要的存储空间是唯一的 22.电脑中磁盘的数据其实都是满的,之所以现实多少可用,只是把他们标记成了无效数据,并 不是空的,计算机中的的删除和格式化磁盘的原理就是把他们都标记为无效数据,并不是真 的删除,所以可以恢复数据 23.创建一个栈 代码: public class Tes原创 2022-01-18 21:49:01 · 255 阅读 · 0 评论 -
数据结构——原理性
1.数据结构本质研究的是数据在内存中如何存储 2.在磁盘中存储的是不同类型的编码,以文件形式存储。在内存中存储的是二进制的文件的实际 形式,磁盘中一个磁颗粒就是1bite 3.内存中最小的存储单位是电容 电容存储形式: 4.内存中是临时存储,因为一旦断电电容中就没电了所以数据就消失了 磁盘是永久性存储,即使没电了磁性还在 5.数组特点: ①.数组中的数据是连续的 ②.空间大小不能改 ③.数组只能存储相同的数据类型 ④.数据可以通过下标进行访问 形成原因: ①.数组是这样定义的 ②.定义后再改变开销太大原创 2022-01-11 22:12:11 · 359 阅读 · 0 评论