Java数据结构
文章平均质量分 89
Cpdr
confidence,persistence,determination,responsibility
展开
-
【数据结构(十三·程序员常用的10种算法)】下
普利姆(Prim)算法求最小生成树,也就是在包含nnn个顶点的连通图中,找出只有&(n-1)&条边包含所有nnn个顶点的连通子图,也就是所谓的极小连通子图。普利姆的算法如下:① 设GVEG=(V,E)GVE是连通网,TUDT=(U,D)TUD是最小生成树,VUV,UVU是顶点集合,EDE,DED是边的集合② 若从顶点uuu开始构造最小生成树,则从集合VVV中取出顶点uuu放入集合UUU中,标记顶点vvv的visite。原创 2024-02-28 20:34:36 · 649 阅读 · 0 评论 -
【数据结构(十三·程序员常用的10种算法)】上
前面我们讲过了二分查找算法,是使用递归的方式,下面我们讲解二分查找算法的非递归方式二分查找法只适用于从有序的数列中进行查找(比如数字和字母等),将数列排序后再进行查找二分查找法的运行时间为对数时间Olog2nO(log_2n)Olog2n,即查找到需要的目标位置最多只需要log2nlog_2nlog2n步,假设从 [0, 99] 的队列(100 个数,即 n=100)中寻到目标数 30,则需要查找步数为log2100log_2100log2。原创 2024-01-23 17:28:40 · 861 阅读 · 0 评论 -
【数据结构(十二·图)】图的相关知识(包括深度优先遍历和广度优先遍历)
为什么要有图?前面学了线性表和树,线性表局限于一个直接前驱和一个直接后继的关系,树也只能有一个直接前驱也就是父节点。当我们需要表示多对多的关系时, 这里我们就用到了图。原创 2023-12-13 15:58:28 · 198 阅读 · 0 评论 -
【数据结构(十一·多路查找树)】B树、B+树、B*树(6)
B 树通过重新组织节点,降低树的高度,并且减少 i/o 读写次数来提升效率。如图 B 树通过重新组织节点, 降低了树的高度.文件系统及数据库系统的设计者利用了磁盘预读原理,将一个节点的大小设为等于一个页页的大小通常为 4k),这样每个节点只需要一次 I/O 就可以完全载入将树的度M 设置为 1024,在 600 亿个元素中最多只需要 4 次 I/O 操作就可以读取到想要的元素,B 树(B+)广泛应用于文件存储系统以及数据库系统中B-tree树即B树,B 即 Balanced,平衡的意思。原创 2023-12-13 10:54:24 · 205 阅读 · 0 评论 -
【数据结构(十·树结构的实际应用)】平衡二叉树(5)
看一个案例(说明二叉排序树可能的问题)给一个数列{1,2,3,4,5,6},要求创建一颗二叉排序树(BST), 并分析问题所在上图中,BST 存在的问题分析:(1)左子树全部为空,从形式上看,更像一个单链表(2)插入速度没有影响(3)查询速度明显降低(因为需要依次比较),不能发挥 BST的优势,因为每次还需要比较左子树,其查询速度比单链表还慢平衡二叉树(AVL)原创 2023-12-13 09:46:12 · 125 阅读 · 0 评论 -
【数据结构(十·树结构的实际应用)】二叉树排序(4)
先看一个需求:给一个数列 (7, 3, 10, 12, 5, 1, 9),要求能够高效的完成对数据的查询和添加使用 数组方式1:数组未排序优点:直接在数组尾添加,速度快。缺点:查找速度慢。方式2:数组排序优点:可以使用二分查找,查找速度快。缺点:为了保证数组有序,在添加新数据时,找到插入位置后,后面的数据需整体移动,速度慢。使用 链式存储-链表不管链表是否有序,查找速度都慢,添加数据速度比数组快,不需要数据整体移动。使用 二叉排序树(本章重点)原创 2023-12-12 16:28:41 · 118 阅读 · 0 评论 -
【数据结构(十·树结构的实际应用)】赫夫曼编码(3)
文章目录1. 基本介绍1.1. 赫夫曼编码基本概念1.2. 通信领域中的编码方式1.2.1. 定长编码1.2.2. 变长编码1.2.3. 赫夫曼编码(属于变长编码的一种)2. 实例应用-赫夫曼编码实现数据压缩2.1. 创建赫夫曼树2.2. 生成赫夫曼编码2.2.1. 生成赫夫曼树对应的赫夫曼编码表2.2.2. 赫夫曼编码字节数组(赫夫曼编码后的数据)3. 实例应用-赫夫曼编码实现数据解压4. 实例应用-使用赫夫曼编码压缩文件4.1. 压缩文件4.2. 解压文件4.3 赫夫曼编码压缩文件注意事项1. 基本原创 2023-12-11 20:09:01 · 176 阅读 · 0 评论 -
【数据结构(十·树结构的实际应用)】赫夫曼树(2)
给定 n 个权值作为 n 个叶子结点,构造一棵二叉树,若该树的带权路径长度(wpl)达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree), 还有的书翻译为霍(赫)夫曼树。赫夫曼树是带权路径长度最短的树,权值较大的结点离根较近。①路径和路径长度:在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。通路中分支的数目称为路径长度。若规定根结点的层数为 1,则从根结点到第 L 层结点的路径长度为 L-1。②结点的权及带权路径长度。原创 2023-12-10 16:00:27 · 134 阅读 · 0 评论 -
【数据结构(十·树结构的实际应用)】堆排序(1)
堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为 O(nlogn),它也是不稳定排序。堆是具有以下性质的完全二叉树:(1) 每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆。(2) 每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。没有要求结点的左孩子的值和右孩子的值的大小关系。大顶堆特点:arriarr2∗i1aiarr2∗i2arri>=arr2∗i1。原创 2023-12-10 11:56:58 · 140 阅读 · 0 评论 -
【数据结构(九)】线索化二叉树(3)
将数列 {1, 3, 6, 8, 10, 14 } 构建成一颗二叉树. (n+1=7个空指针域)问题分析:1.当对上面的二叉树进行中序遍历时,数列为 {8, 3, 10, 1, 6, 14 }2.但是 6 的 右指针,8、10、14 这几个节点的 左右指针,并没有完全的利用上(共7个空指针域)3.如果希望充分的利用 各个节点的左右指针,让各个节点可以指向自己的前后节点,怎么办?线索二叉树nnn个结点的二叉链表中含有n1n+1n1【公式2n−n−1n12。原创 2023-12-09 20:10:16 · 149 阅读 · 0 评论 -
【数据结构(九)】顺序存储二叉树(2)
给一个数组 {1,2,3,4,5,6,7},要求以二叉树前序遍历的方式进行遍历。前序遍历的结果应当为1,2,4,5,3,6,7。,(如上图第2个节点(编号为1的节点)的右子节点的编号为2 * 1+2=4),(如上图第2个节点(编号为1的节点)的左子节点的编号为2 * 1+1=3),(如上图第2个节点(编号为1的节点)的父节点的编号为(1-1)/2=0)时,仍然可以以前序遍历,中序遍历和后序遍历的方式完成结点的遍历。1.上图的二叉树的结点,要求以数组的方式来存放。个元素的左子节点的,编号为。原创 2023-12-09 15:37:58 · 123 阅读 · 0 评论 -
【数据结构(九)】二叉树基础(1)
小结: 看输出父节点的顺序,就确定是前序,中序还是后序。原创 2023-12-09 10:40:57 · 163 阅读 · 0 评论 -
【数据结构(八)】哈希表
散列表(Hash table,也叫哈希表),是根据关键码-值(Key、value)而直接进行访问的数据结构。也就是说,它通过把关键码-值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。原创 2023-12-06 17:33:46 · 231 阅读 · 1 评论 -
【数据结构(七)】查找算法
在 java 中,我们常用的查找有四种:① 顺序(线性)查找② 二分查找/折半查找③ 插值查找④ 斐波那契查找二分查找算法存在查找效率较慢的情况,因为其中的mid是从中间开始取的。} /** 思路分析:* 1. 在找 mid 的索引值,不要马上返回* 2. 向 mid 索引值的左边扫描,将所有满足1000的元素的下标,加入到集合ArrayList* 3. 向 mid 索引值的右边扫描,将所有满足1000的元素的下标,加入到集合ArrayList。原创 2023-12-05 22:16:23 · 655 阅读 · 0 评论 -
【数据结构(六)】排序算法的时间复杂度比较(4)
由于数据太大,因此把数据放在磁盘中,而排序通过磁盘和内存的数据传输才能进行;:如果a原本在b的前面,而a=b,排序之后a可能会出现在b的后面;:如果a原本在b前面,而a=b,排序之后a仍然在b的前面;:运行完一个程序所需内存的大小。:所有排序操作都在内存中完成;: 一个算法执行所耗费的时间。原创 2023-12-05 16:31:52 · 129 阅读 · 0 评论 -
【数据结构(六)】希尔排序、快速排序、归并排序、基数排序的代码实现(3)
文章目录1. 希尔排序1.1. 简单插入排序存在的问题1.2. 相关概念1.3. 应用实例1.3.1. 交换法1.3.1.1. 逐步推导实现方式1.3.1.2. 通用实现方式1.3.1.3. 计算时间复杂度1.3.2. 移动法2. 快速排序2.1. 相关概念2.2. 实例应用2.2.1. 思路分析2.2.2. 代码实现2.3. 计算快速排序的时间复杂度3. 归并排序3.1. 相关概念3.2. 代码实现3.3. 计算归并排序的时间复杂度4. 基数排序4.1. 相关概念4.2. 代码实现4.2.1. 逐步推导实原创 2023-12-05 15:50:27 · 701 阅读 · 0 评论 -
【数据结构(六)】冒泡排序、选择排序、插入排序的代码实现(2)
选择式排序属于内部排序法,是从欲排序的数据中,按指定的规则选出某一元素,再依规定交换位置后达到排序的目的。选择排序(select sorting)是一种简单的排序方法。原创 2023-12-04 17:21:55 · 774 阅读 · 0 评论 -
【数据结构(六)】排序算法介绍和算法的复杂度计算(1)
排序也称排序算法(Sort Algorithm),排序是将一组数据,依指定的顺序进行排列的过程。原创 2023-12-04 17:20:22 · 1322 阅读 · 0 评论 -
【数据结构(五)】递归
arr[8] ={0 , 4, 7, 5, 2, 6, 1, 3} //对应 arr 下标 表示第几行,即第几个皇后,arr[i] = val , val 表示第 i+1 个皇后,放在第 i+1 行的第 val+1 列。八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。④当得到一个正确解时,在栈回退到上一个栈时,就会开始回溯,即将第一个皇后,放到第一列的所有正确解,全部得到。(2)各种算法中也会使用到递归,比如快排,归并排序,二分查找,分治算法等.路径策略:下 --> 右 --> 上 --> 左。原创 2023-12-02 15:04:04 · 111 阅读 · 0 评论 -
【数据结构(四)】前缀、中缀、后缀表达式(逆波兰表达式)和逆波兰计算器的代码实现(2)
⑩下一个扫描到 - 符号,由于 - 的优先级与 + 相同,故执行 4.(3):将s1栈顶的运算符弹出并压入到s2中,再次转到 4.(1) 与s1中新的栈顶运算符相比较,由于原来的 + 入了s2栈,即s1栈为空,所以直接将 - 运算符入s1栈。②遇到 + 运算符,因此弹出 4 和 3(4 为栈顶元素,3 为次顶元素),计算出 3 + 4 的值,得 7 ,再将 7 入栈;②遇到 + 运算符,因此弹出 3 和 4(3为栈顶元素,4为次顶元素),计算出 3 + 4 的值,得 7,再将 7 入栈。原创 2023-11-23 11:28:06 · 262 阅读 · 0 评论 -
【数据结构(四)】栈(1)
栈(stack)是一个先入后出(FILO-First In Last Out)的有序列表。栈(stack)是限制线性表中元素的插入和删除只能在线性表的同一端进行的一种特殊线性表。(允许插入和删除的)一端为变化的一端,称为栈顶(Top),另一端为固定的一端,称为栈底(Bottom)。根据栈的定义可知,最先放入栈中元素在栈底,最后放入的元素在栈顶,而删除元素刚好相反,最后放入的元素最先删除,最先放入的元素最后删除图解方式说明出栈(pop)和入栈(push)的概念。原创 2023-11-21 19:15:38 · 296 阅读 · 0 评论 -
【数据结构(三)】单向环形链表和约瑟夫问题(3)
用一个不带头结点的循环链表来处理 Josephu 问题:先构成一个有 n个结点的单循环链表,然后由 k 结点起从 1 开始计数,计到 m 时,对应结点从链表中删除,然后再从被删除结点的下一个结点又从 1开始计数,直到最后一个结点从链表中删除算法结束。n 的 n 个人围坐一圈,约定编号为 k(1 ≤ k ≤ n)的人从 1 开始报数,数到 m 的那个人出列,它的下一位又从 1 开始报数,数到 m 的那个人又出列,依次类推,直到所有人出列为止,由此产生一个。出圈的顺序: 2->4->1->5->3。原创 2023-11-20 22:30:35 · 492 阅读 · 0 评论 -
【数据结构(三)】双向链表(2)
所以前面我们单链表删除时节点,总是找到 temp(temp 是待删除节点的前一个节点)。②单向链表不能自我删除,需要靠辅助节点 ,而双向链表,则可以。和单向链表一样,可以向前,也可以向后查找。①单向链表,查找的方向只能是一个方向,而。①直接找到要删除的这个节点,比如temp。[示意图]按照单链表的顺序添加,稍作修改即可.因为是双向链表,因此,可以实现自我删除某个节点。①先找到链表的最后一个节点。双向链表的第二种添加方式,按照。默认添加到双向链表的最后。思路和原理与单向链表一样。原创 2023-11-20 20:32:19 · 129 阅读 · 0 评论 -
【数据结构(三)】单链表(1)
在Java中,可以使用类来实现链表结构,每个节点作为类的实例,包含数据和指向下一个节点的引用(以及可能的前一个节点的引用,对于双向链表)。通过操作节点的引用,可以实现链表的各种操作,如插入、删除、查找等。原创 2023-11-19 22:08:34 · 539 阅读 · 0 评论 -
【数据结构(二)】队列(2)
银行排队的案例队列是一个有序列表,可以用数组或是链表来实现。遵循先入先出的原则。即:先存入队列的数据,要先取出。后存入的要后取出(使用数组模拟队列示意图)原创 2023-11-18 10:26:42 · 314 阅读 · 0 评论 -
【数据结构(二)】稀疏 sparsearray 数组(1)
当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。稀疏数组的处理方法①记录数组一共有几行几列,有多少个不同的值②把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模上图右表中:第[0]行表示:数组大小是6×7,共有8个不为0的值;下面每一行都代表不为0的数值所在的行列数,[1]~[8]共有8个。原创 2023-11-17 20:22:41 · 331 阅读 · 0 评论 -
【数据结构(一)】线性结构和非线性结构
数据结构包括:线性结构和非线性结构原创 2023-11-17 16:55:36 · 438 阅读 · 0 评论