![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
1while(true){learn}
日常笔记
展开
-
图的创建
图是一种数据结构,其中结点可以具有零个或多个相邻元素。两个结点之间的连接称为边。 结点也可以称为顶点。图的表示方式有两种:二维数组表示(邻接矩阵);链表表示(邻接表)。邻接矩阵邻接矩阵是表示图形中顶点之间相邻关系的矩阵,对于n个顶点的图而言,矩阵是的row和col表示的是1....n个点。邻接表1)邻接矩阵需要为每个顶点都分配n个边的空间,其实有很多边都是不存在,会造成空间的一定损失.邻接表的实现只关心存在的边,不关心不存在的边。因此没有空间浪费,邻接表由数组+链表组成.原创 2021-11-30 11:32:05 · 684 阅读 · 0 评论 -
多叉树
在二叉树中,每个节点有数据项,最多有两个子节点。如果允许每个节点可以有更多的数据项和更多的子节点,就是多叉树(multiway tree)B树的基本介绍B树通过重新组织节点,降低树的高度,并且减少i/o读写次数来提升效率。1)如图B树通过重新组织节点, 降低了树的高度.2)文件系统及数据库系统的设计者利用了磁盘预读原理,将一个节点的大小设为等于一个页(页得大小通常为4k),这样每个节点只需要一次I/O就可以完全载入3)将树的度M设置为1024,在600亿个元素中最多只需要...原创 2021-11-30 08:58:52 · 118 阅读 · 0 评论 -
平衡二叉树(AVL树)
1)平衡二叉树也叫平衡二叉搜索树(Self-balancing binary search tree)又被称为AVL树, 可以保证查询效率较高。2)具有以下特点:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。原创 2021-11-26 19:42:18 · 364 阅读 · 0 评论 -
二叉排序树
二叉排序树:BST: (Binary Sort(Search) Tree), 对于二叉排序树的任何一个非叶子节点,要求左子节点的值比当前节点的值小,右子节点的值比当前节点的值大。原创 2021-11-26 10:15:02 · 351 阅读 · 0 评论 -
哈夫曼编码
1)哈夫曼编码(Huffman Coding),又称霍夫曼编码,是一种编码方式, 属于一种程序算法2)哈夫曼编码广泛地用于数据文件压缩。其压缩率通常在20%~90%之间3)哈夫曼码是可变字长编码(VLC)的一种。Huffman于1952年提出一种编码方法,称之为最佳编码•i like like like java do you like a java // 共40个字符(包括空格)•d:1 y:1 u:1 j:2 v:2 o:2 l:4 k:4 e:4 i:5 ...原创 2021-11-25 16:27:23 · 307 阅读 · 0 评论 -
使用哈夫曼编码进行文件压缩
给你一个图片文件,要求对其进行无损压缩, 看看压缩效果如何。原创 2021-11-25 18:03:11 · 1454 阅读 · 0 评论 -
哈夫曼树(最优二叉树)
基本介绍:1)给定n个权值作为n个叶子结点,构造一棵二叉树,若该树的带权路径长度(wpl)达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)2)赫夫曼树是带权路径长度最短的树,权值较大的结点离根较近。概念:1)路径和路径长度:在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。通路中分支的数目称为路径长度。若规定根结点的层数为1,则从根结点到第L层结点的路径长度为L-12)结点的权及带权路径长度:若将树中结点赋给一个有着某原创 2021-11-23 19:44:03 · 239 阅读 · 0 评论 -
中序线索化二叉树
1)n个结点的二叉链表中含有n+1 【公式 2n-(n-1)=n+1】 个空指针域。利用二叉链表中的空指针域,存放指向该结点在某种遍历次序下的前驱和后继结点的指针(这种附加的指针称为"线索")2)这种加上了线索的二叉链表称为线索链表,相应的二叉树称为线索二叉树(Threaded BinaryTree)。根据线索性质的不同,线索二叉树可分为前序线索二叉树、中序线索二叉树和后序线索二叉树三种3)一个结点的前一个结点,称为前驱结点4)一个结点的后一个结点,称为后继结点 ...原创 2021-11-18 16:53:38 · 314 阅读 · 0 评论 -
顺序存储二叉树
从数据存储来看,数组存储方式和树的存储方式可以相互转换,即数组可以转换成树,树也可以转换成数组。顺序存储二叉树的特点:1)顺序二叉树通常只考虑完全二叉树2)第n个元素的左子节点为 2 * n + 1 3)第n个元素的右子节点为 2 * n + 24)第n个元素的父节点为 (n-1) / 25)n : 表示二叉树中的第几个元素(按0开始编号)package com.wang;public class ArrBinary { public static voi...原创 2021-11-17 18:45:13 · 317 阅读 · 0 评论 -
二叉树的前,中,后序遍历,查找,删除
1)树有很多种,每个节点最多只能有两个子节点的一种形式称为二叉树。2)二叉树的子节点分为左节点和右节点。3)如果该二叉树的所有叶子节点都在最后一层,并且结点总数= 2^n -1 , n 为层数,则我们称为满二叉树。4)如果该二叉树的所有叶子节点都在最后一层或者倒数第二层,而且最后一层的叶子节点在左边连续,倒数第二层的叶子节点在右边连续,我们称为完全二叉树。前序遍历: 先输出父节点,再遍历左子树和右子树中序遍历: 先遍历左子树,再输出父节点,再遍历右子树后序遍历: 先遍历左子...原创 2021-11-16 20:25:27 · 746 阅读 · 2 评论 -
哈 希 表
散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。package com.wang;import java.util.Scanner;public class HashTable { public static void main(String[] args) { Hash hashT = .原创 2021-11-16 18:19:16 · 59 阅读 · 0 评论 -
中缀表达式转后缀表达式
具体步骤如下:1)初始化两个栈:运算符栈s1和储存中间结果的栈s2;2)从左至右扫描中缀表达式;3)遇到操作数时,将其压s2;4)遇到运算符时,比较其与s1栈顶运算符的优先级: (1)如果s1为空,或栈顶运算符为左括号“(”,则直接将此运算符入栈; (2)否则,若优先级比栈顶运算符的高,也将运算符压入s1; (3)否则,将s1栈顶的运算符弹出并压入到s2中,再次转到(4-1)与s1中新的栈顶运算符相比较;5)遇到...原创 2021-11-05 19:55:21 · 209 阅读 · 0 评论 -
逆波兰计算器
package com.wang;import java.util.*;public class Test { public static void main(String[] args) { String Poland="3 4 + 5 * 6 -"; //先将表达式存入Arralist,遍历Arralist配合栈完成计算 List<String> getlist = getlist(Poland); System.out.println(getlist);...原创 2021-11-05 17:51:22 · 58 阅读 · 0 评论 -
栈模拟计算器-中缀表达式
package com.wang;public class Math { public static void main(String[] args) { //待计算表达式 String experssion="3+2*6-2"; //创建一个符号栈和一个数栈 ArrStack numStack = new ArrStack(10); ArrStack operStack = new ArrStack(10); //用于扫描 int index=0; in...原创 2021-11-04 17:34:51 · 83 阅读 · 0 评论 -
单向循环链表-约瑟夫问题
package com.wang;public class Josepfu { public static void main(String[] args) { // TODO 自动生成的方法存根 CircleList circleList = new CircleList(); circleList.addBoy(5); circleList.showBoy(); circleList.outBoy(1, 2, 5); }}//创建一个单向环形链表...原创 2021-11-03 20:16:15 · 67 阅读 · 0 评论 -
单链表练习题
求单链表中有效节点的个数 /** * 获取单链表中的有效个数不计算头结点 */ public static int getlength(HeroNode head) { if (head == null) { System.out.println("空链表"); } int length=0; HeroNode cur=head.next; while (cur != null) { length++; cur = cur.next; } ret原创 2021-11-01 21:06:54 · 100 阅读 · 0 评论 -
数组实现环形队列(java)
import java.util.Scanner;public class Huanxing { public static void main(String[] args) { Circle queue=new Circle(4);//可用空间为3,空出一个空间作为约定 char key=' ';//接收用户输入 Scanner scanner=new Scanner(System.in); boolean loop=true; //输出一个菜单 while (loop).原创 2021-09-23 20:39:18 · 97 阅读 · 0 评论 -
数组实现队列(java)
import java.util.Scanner;//数组模拟队列public class Duilie { public static void main(String[] args) { ArrayQueue queue=new ArrayQueue(3); char key=' ';//接收用户输入 Scanner scanner=new Scanner(System.in); boolean loop=true; //输出一个菜单 while (loop) {.原创 2021-09-23 20:39:12 · 110 阅读 · 0 评论 -
稀疏数组(java)
public class Xishushuzu { public static void main(String[] args) { int[][] chessArr=new int[11][11]; //0没有棋子,1表示黑子,2表示蓝子 chessArr [1][2]=1; chessArr [2][3]=2; System.out.println("原始的二维数组:"); for (int[] row:chessArr) {//定义一个一位数组来遍历接收二维..原创 2021-09-22 09:50:10 · 56 阅读 · 0 评论 -
栈
栈的英文为(stack) 栈是一个先入后出(FILO-First In Last Out)的有序列表。栈(stack)是限制线性表中元素的插入和删除只能在线性表的同一端进行的一种特殊线性表。允许插入和删除的一端,为变化的一端,称为栈顶(Top),另一端为固定的一端,称为栈底(Bottom)。根据栈的定义可知,最先放入栈中元素在栈底,最后放入的元素在栈顶,而删除元素刚好相反,最后放入的元素最先删除,最先放入的元素最后删除数组模拟栈package com.wang;impor.原创 2021-11-04 08:45:17 · 68 阅读 · 0 评论 -
双向链表的增删改查
package com.wang;public class DoubleList { public static void main(String[] args) { HeroNode1 hero1 = new HeroNode1(1,"宋江","及时雨"); HeroNode1 hero2 = new HeroNode1(2,"卢俊义","玉麒麟"); HeroNode1 hero3 = new HeroNode1(3,"吴用","智多星"); System.ou.原创 2021-11-02 21:30:21 · 55 阅读 · 0 评论 -
单链表的增删改查
链表是有序的列表,但是它在内存中是存储如下1 链表是以节点的方式来存储,是链式存储2 每个节点包含 data 域, next 域:指向下一个节点.3 如图:发现链表的各个节点不一定是连续存储.4 链表分带头节点的链表和没有头节点的链表,根据实际的需求来确定增删改package com.wang;public class SingleList { public static void main(String[] args) { HeroNode he原创 2021-11-01 18:28:41 · 120 阅读 · 0 评论 -
一个简单的数组+链表
package October;//屏蔽所有的警告@SuppressWarnings({"all"})public class Test { public static void main(String[] args) { //创建一个Node类型的数组(表) Node[] table=new Node[10]; //创建一个Node节点 Node morty = new Node("morty", null); .原创 2021-10-12 18:41:32 · 44 阅读 · 0 评论 -
实现一个简单双向链表的增删功能
package October;//屏蔽所有的警告@SuppressWarnings({"all"})public class Test { public static void main(String[] args) { Node morty = new Node("Morty"); Node rick = new Node("Rick"); Node jerry = new Node("Jerry"); //链接三个节.原创 2021-10-12 11:05:05 · 55 阅读 · 0 评论