
数据结构
Foools
这个作者很懒,什么都没留下…
展开
-
尚硅谷Java数据结构与java算法 全194章笔记整理
前言 视频地址:https://www.bilibili.com/video/BV1E4411H73v?from=search&seid=13120683720695451628 评价:整个教程的数据结构部分讲的挺好的,知识点全都覆盖了,而且每个数据结构都有代码解释,但是最后20节算法部分讲的有点乱,算法部分我决定直接刷leetcode了 数组 稀疏数组: 二维数组的省内存的保存方法,一般是n行3列,三列分别为行,列,值。 二维数组转稀疏数组: 遍历整个二维数组,查看有多少个有效数字 根据有效数字原创 2021-08-11 19:28:01 · 2395 阅读 · 1 评论 -
多路查找树,B树,B+树,B*树
多路查找树 二叉树的问题分析: 二叉树在构建时,需要进行多次i/o操作(海量数据存在数据库或文件中),节点很多的话,构建速度会有影响。 节点很多,会造成二叉树过高,降低操作速度 我们就可以引入多叉树,多叉树每个节点可以有更多的数据项和更多的子节点。 一个多叉树的例子 B树: 通过重新组织节点,降低树的高度,并且减少i/o读写次数来提升效率。 2-3树 2-3树是最简单的B树结构 所有叶子节点在同一层(B树都满足这个条件) 有两个节点的节点叫做二节点,二节点要么没有子节点,要么有两个子节点 有三原创 2021-03-24 21:06:12 · 158 阅读 · 0 评论 -
平衡二叉树 AVL树(java)
平衡二叉树(AVL树) 创建二叉排序树{1,2,3,4,5}时,左子树全部为空,查询速度明显降低,无法发挥二叉排序树的优势,所以需要平衡二叉树 平衡二叉树它的左右两个子树的高度差绝对值不超过1,并且它的左右两个子树也都是平衡二叉树。 当需要创建一颗AVL树的时候,往往需要__左旋转,右旋转,双旋转__ 旋转方法添加在Node类中的add方法中 左旋转 当数列{4,3,6,5,7}加入8时,rightHight()-leftHight() > 1成立, 树就不是一个AVL树了 思路: 创建一个原创 2021-03-24 21:03:17 · 210 阅读 · 0 评论 -
二叉排序树(java)
二叉排序树 binary sort tree,对于二叉排序树的任何一个非叶子节点,要求左子节点的值比当前节点的值小,右子节点的值比当前节点的值大。 这个函数写在Node类中,但是需要使用Tree的类来调用 排序树增加节点的思想: 如果新加入node的值比当前节点小 当前节点的left为空,node设置为left 当前节点的left不为空,使用当前节点的left递归调用 如果新加入node的值比当前节点大 当前节点的right为空,node设置为right 当前节点的right不为空,使用当前节点的原创 2021-03-24 21:01:22 · 155 阅读 · 0 评论 -
huffman树(java)
huffman树 huffman树是带权路径长度最短的树,权值较大的节点离根很近。 路径长度:根节点层数为1,从根节点到第L层节点的路径长度为L-1 带权路径长度:从根节点到该节点之间的路径长度与该节点 __树的带权路径长度__为所有叶子节点的带权路径长度之和,称为WPL(weighted path length),WPL最小就是huffman树。 权值越大的节点离根节点越近的二叉树才是最优二叉树。 huffmanTree思路分析 从小到大进行排序,每个节点可以看成是一颗最简单的二叉树 取出根节点权值最小原创 2021-03-24 21:00:11 · 242 阅读 · 0 评论 -
线索化二叉树
线索化二叉树 希望充分利用各个节点的左右指针,让各个节点可以指向自己的前后节点。 基本介绍: 二叉链表中的空指针域,存放指向该节点在某种遍历次序下的前驱和后继点的指针。 线索二叉树之后,Node节点的属性有left和right,left可能指向左子树或者前驱节点,right可能指向右子树或者后继节点。 中序线索二叉树基本思路: 在二叉树类中要定义一个pre指针,作为保留的前一个节点。 在node类中创建类型leftType, rightType 1. leftType = 0,指向左子树,leftType原创 2021-03-17 20:44:15 · 208 阅读 · 0 评论 -
树结构基础(java)
树结构 树的数据结构 数组:用下标方式访问元素,查找速度快,插入和删除速度慢 链表:插入和删除的速度较快,在检索时效率较低 树存储:存储和读取效率很高,插入,删除,修改的速度也可以保证 常用术语: 树的高度:最大层数 森林:多棵子树构成森林 二叉树的概念 每个节点最多有两个子节点的树叫做二叉树,它的子节点分为左子节点和右子节点。 二叉树所有叶子节点都在最后一层,节点总数为2^n-1,n为层数,称为满二叉树。 二叉树所有叶子节点都在最后一层或倒数第二层,最后一层叶子节点在左边连续,倒数第二层叶子节点在右边连原创 2021-03-17 20:43:22 · 176 阅读 · 0 评论 -
哈希表(java)
哈希表 散列表(Hash Table,哈希表)是根据关键码值(key value)而直接进行访问的数据结构。 它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散函数,存放记录的数组叫做散列表。 一般来说,java程序直接访问数据库的速度较慢,这时候会加一个缓存层(缓存产品:redis,memcache)来增加访问速度,除此之外,我们还可以在缓存层自己写出一个哈希表来增加访问速度。 哈希表: 数组+链表 数组+二叉树 一道题:有一个公司,当有新员工来的时候,要求将该员工信原创 2021-03-17 20:39:53 · 433 阅读 · 0 评论 -
排序算法简介(时间频度,时间复杂度,空间复杂度)
排序算法 内部排序:直接使用内存的排序 直接插入排序,希尔排序,简单选择排序,堆排序,冒泡排序,快速排序,归并排序,基数排序 测试算法运行的时间 这里是用的是输出算法执行前的时间,和算法执行之后的时间,来查看算法实际花费的时间。 代码: import java.text.SimpleDateFormat; import java.util.Date; //排序前的时间输出 Date date = new Date(); SimpleDateFormat s原创 2021-03-17 20:32:41 · 231 阅读 · 0 评论 -
前缀,中缀,后缀表达式;中缀表达式转后缀表达式
前缀,中缀,后缀表达式 前缀表达式(波兰表达式): 运算符位于操作数之前,(3+4)*5-6对应的是- * + 3 4 5 6 计算机求值:从右向左扫描表达式,遇到数字时,将数字压入栈;遇到运算 符时,弹出栈顶两个元素(先弹出的-后弹出的),用运算符对他们进行运 算,并将结果入栈,直至过程到达表达式最左端。 中缀表达式: 最常见的运算表达式 计算机操作时,一般会将其转换为后缀表达式来操作。 后缀表达式(逆波兰表达式): 运算符位于操作符号之后,(3+4)*5-6对应的是3 4 + 5 * 6 –原创 2021-03-04 20:59:00 · 185 阅读 · 1 评论 -
栈
栈(stack) 一个先入后出的有序列表 允许插入删除的一端为栈顶,固定的另一端为栈底 应用场景: 子程序的调用 处理递归调用 表达式的转换(中缀表达式转后缀表达式)与求值 二叉树的遍历 图形的深度优先搜索法 数组实现栈的思路: 1) 定义一个top表示栈顶,初始化为-1 2) 入栈:top++; stack[top] = data 3) 出栈:int value = stack[top]; top–; return value; 用单链表来实现栈的模拟: package com.dataStru原创 2021-03-04 20:54:44 · 138 阅读 · 1 评论 -
单向环形链表解决joseph约瑟夫环问题(java实现)
单向环形链表 joseph环问题 Joseph问题:n个小孩坐成一圈,编号为k的小孩从1开始报数,数到m的小孩出列,下一个小孩再从1开始报数,数到m出列,直到所有人出列为止,求出列的编号队列。 单向环形链表构建思路: 构建: 1) 先创建第一个节点,用first指向它,与自己形成环形队列。 2) 每创建一个新的节点,就把该节点加入到已有的环形列表中。 遍历: 1) 让辅助指针cur指向first 2) 通过while循环直到cur.next = first结束 约瑟夫问题: 1) 创建一个原创 2021-03-04 20:53:43 · 280 阅读 · 1 评论 -
双向链表
双向链表 双向链表相对于单链表来说: 1. 查找的方向不止是一个方向 2. 可以实现自我删除,不需要像单链表一样寻找要删除节点的前一个节点 思路分析: 遍历:和单向链表一致,可以前向,也可以后向。 添加元素到链表最后: 1) 先遍历到这个链表的最后 2) temp.next = newNode; newNode.pre = temp; 按照编号添加元素: 1) 找到要添加的位置的前一个元素temp 2) heroNode.next = temp.next; 3) temp.next = her原创 2021-03-04 20:51:18 · 124 阅读 · 1 评论 -
单链表、单链表反转、单链表的倒叙打印
单链表 链表每个节点包含data域,next域:指向下一个节点 创建HeroNode类,其中包含HeroNode next; 创建LinkedList类,先创建一个头节点 遍历思路: 通过一个辅助变量来遍历 一般来说,展示链表中所有数据要先判断链表是否为空。 添加内容思路: 直接添加到尾部:直接加到最后面(遍历找到最后面,再添加) 按顺序添加:找到要添加的位置,新节点.next = temp.next,temp.next = 新节点。 修改节点的思路: 先找到这个节点(遍历) 修改数值原创 2021-03-04 20:46:59 · 323 阅读 · 1 评论 -
队列、使用数组模拟环形队列
队列 队列是一个有序列表,可能用数组或链表来实现。 先进入的数据先取出,后进入的数组后取出。 数组模拟队列的思路: 队列本身就是一个有序列表,maxSize来记录该数组最大容量;front和rear分别记录队列前后端的下标,front随着数据输出而改变,rear随着数据输入而改变。 加入数据:若队列不为满,尾部指针后移:rear+1 拿出数据:若队列不为空,前端指针后移:front+1 代码: package com.dataStructure; import java.util.Scanner; pub原创 2021-03-04 20:45:18 · 210 阅读 · 1 评论 -
稀疏数组(与二维数组互相转换)
稀疏数组: 二维数组的省内存的保存方法,一般是n行3列,三列分别为行,列,值。 二维数组转稀疏数组: 1. 遍历整个二维数组,查看有多少个有效数字 2. 根据有效数字的个数,创建稀疏数组 3. 遍历二维数组,将有效的数字放入稀疏数组中 稀疏数组转二维数组: 1. 根据稀疏数组第一行建立空二维数组 2. 读取稀疏数组后几行数据,插入二维数组中 代码实现: package com.dataStructure; public class sparseArray { public static v原创 2021-03-04 20:43:09 · 139 阅读 · 1 评论