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