- 博客(23)
- 收藏
- 关注
原创 赫夫曼树
赫夫曼树介绍重要概念构成赫夫曼树的步骤:代码介绍1、给定n个权值作为n个叶子节点,构造一棵二叉树,若该树的带权路径长度(wpl)达到最小,称这样的二叉树为最优二叉树,也称为霍夫曼树(哈夫曼树);2、赫夫曼树是带权路径长度最短的树,权值较大的结点离根较近;重要概念1、路径和路径长度:在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。通路中分支的数目称为路径长度。若规定根结点的层数为1,则从根节点到第L层结点的路径长度为L-12、结点的权以及带权路径长度:若将树中结点赋给一个有
2020-11-30 22:57:12
136
原创 线索二叉树(前序、中序、后续)
线索二叉树介绍代码介绍1、n个节点的二叉链表中含有n+1(2n-(n-1)=n+1)个空指针域。利用二叉链表中的空指针域,存放指向该节点在某种遍历次序下的前驱和后继节点的指针(这种附加的指针称为线索)。2、这种加上了线索的二叉链表称为线索链表,相应的二叉树称为线索二叉树。根据线索性质的不同,线索二叉树可以分为前序线索二叉树、中序线索二叉树、后续线索二叉树三种。3、一个节点的前一个节点,称为前驱节点。4、一个节点的后一个节点,称为后继节点。代码public class ThreadBinary
2020-11-19 01:31:38
1857
原创 顺序二叉树
顺序二叉树介绍特点代码介绍从数据存储来看,数组存储方式和树的存储方式可以互相转换,既数组可以转换成树,树也可以转换成数组。特点1、顺序二叉树通常只考虑完全二叉树;2、第n个元素的左子节点为2n+1;3、第n个元素的右子节点为2n+2;4、第n个元素的父节点为(n-1)/2;5、n标识二叉树的第几个元素(为了和数组下标符合n从0开始);代码public class ArrayBinaryTreeDemo { public static void main(String[] arg
2020-11-19 01:11:41
172
原创 二叉树
二叉树介绍概念前、中、后序遍历代码介绍1、数组存储方式分析有点:通过下标方式访问元素速度快。对于有序数组,还可以使用二分查找提高检索效率。缺点:如果要检索具体某个值,或者插入值(按一定顺序)会整体移动,效率比较低。2、链式存储方式分析优点:在一定程度上对数组存储方式有优化(插入和删除)缺点:检索效率仍然低3、树存储方式分析能提高数据存储,读取的效率,比如利用二叉排序树,既可以保证数据的检索速度,同时也可以保证数据的插入删除修改速度。概念1、树有很多种,每个节点最多只能有两个子节点的一
2020-11-16 23:46:40
153
原创 类加载子系统
类加载子系统介绍加载阶段 Loading加载.class文件的方式连接阶段 Linking验证 Verify准备 Prepare解析 Resolve初始化阶段 Initialization类加载器引导类加载器Bootstrap ClassLoader自定义加载器User-Defined ClassLoader应用程序类加载器(系统类加载器)AppClassLoader扩展类加载器 Extension ClassLoader演示代码双亲委派机制工作原理优势沙箱安全机制判断两个class对象是否为同一个类对类加
2020-11-14 16:55:18
99
原创 查找算法
查找算法线性查找二分查找插值查找斐波那契(黄金分割法)查找介绍原理线性查找/** * 线性查找 * @param array * @param value * @return */ public static int SeqSearch(int[] array,int value){ for (int i = 0; i < array.length; i++) { if(value == array[
2020-11-14 13:57:27
104
原创 动态代理
动态代理JDK动态代理原理核心类局限代码cglib动态代理原理核心类局限代码JDK动态代理原理java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvocationHandler来处理。核心类Proxy 创建代理利用反射机制生成一个实现接口的匿名类。InvocationHandler 方法拦截器接口 需要实现invoke方法。局限只能代理实现了接口的类。代码public class JDKProxyMain { interface JDKProxy
2020-11-14 13:56:41
99
原创 排序算法整理
排序算法排序算法分类冒泡排序基本思想代码选择排序基本思想代码插入排序基本思想代码希尔排序基本思想代码快速排序基本思想代码归并排序介绍代码基数排序(桶排序)基本思想注意代码排序算法分类1.内部排序:将需要处理的所有数据都加载到内部存储器中进行排序。2.外部排序算法:数据量过大,无法全部加载到内存中,需要借助外部存储进行排序。冒泡排序基本思想通过对待排序序列从前向后(从下标较小的一端开始),依次比较相邻元素的值,若发现逆序则交换,使较大的元素逐渐从前向后移动,就像水底下的气泡一样逐渐往上冒。1.一
2020-11-10 20:34:58
142
原创 时间复杂度和空间复杂度
时间复杂度时间频度忽略常数项忽略低次项忽略系数时间复杂度:常见的时间复杂度:1.常数阶O(1)2.对数阶O(log^2^n)3.线性阶O(n)4.线性对数阶O(nlog~2~n)5.平方阶O(n^2^)、立方阶O(n^3^)、k次方阶O(n^k^)6.指数阶O(2^n^)平均时间复杂度和最坏时间复杂度空间复杂度时间频度一个算法花费的时间与算法中语句的执行次数成正比,哪个算法中语句执行次数多,它花费时间就多。一个算法中的语句执行次数称为语句频度或时间频度。记为T(n)。举例:忽略常数项T(n)=2n
2020-11-04 00:15:21
135
原创 递归解决八皇后问题
八皇后问题在8×8的国际象棋棋盘上摆放8个皇后,使其不能互相攻击。既:任意两个皇后都不能处在同一行,同一列和同一斜线上,问有多少种摆法。思路分析(回溯算法) 1.第一个皇后先放第一行第一列 2.第二个皇后放在第二行第一列,然后判断行不行,如果不行,继续放到第二列,第三列,依次把所有列都放完,直到找到一个合适的 3.继续第三个皇后,还是第一列、第二列...直到第八个皇后也能放在一个不冲突的位置,算是找到了一个正确解 4.当得到一个正确解时,在栈回退到上一个栈时,就会开始回溯,既将第一个皇后,放到
2020-11-01 15:38:42
104
原创 递归解决迷宫回溯问题
代码public class Maze { public static void main(String[] args) { //创建二维数组模拟迷宫 int[][] maze = new int[8][7]; range(0,7).forEach(value -> { maze[0][value] = 1; maze[7][value] = 1; }); rang
2020-11-01 14:44:01
194
2
原创 栈实现逆波兰计算器
栈实现逆波兰计算器栈栈的应用场景用数组实现栈前缀、中缀、后缀表达式前缀表达式前缀表达式的计算机求值中缀表达式后缀表达式后缀表达式的计算机求值中缀表达式转后缀表达式逆波兰计算器代码实现栈栈的应用场景1.子程序的调用:在跳往子程序前,会先将下个指令的地址存到堆栈中,直到子程序执行完后再将地址取出,以回到原来的程序中。2.处理递归调用:和子程序的调用类似,只是除了存储下一个指令的地址外,也将参数、区域变量等数据存入堆栈中。3.表达式的转换(中缀表达式转后缀表达式)与求值(实际解决)。4.二叉树的遍历。
2020-10-31 16:33:13
188
原创 单向环形链表解决Josephu问题
Josephu问题设编号为1,2,...n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始报数,数到m的那个人出列,它的下一位又从1开始报数,数到m的那个人又出列,依次类推,至到所有人出列为止,由此产生一个出队编号的序列。代码public class Josephu { public static void main(String[] args) { CircleSingleLinkedList list = new CircleSingleLinke
2020-10-29 21:33:24
62
原创 原型模式
原型模式定义结构代码JAVA中的原型模式浅度克隆深度克隆原型管理器定义用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。克隆生成对象结构代码JAVA中的原型模式浅度克隆深度克隆原型管理器...
2020-10-28 22:50:28
62
原创 双向链表
双向链表class DoubleLinkedList{ DoubleDataNode head = new DoubleDataNode(); //添加节点方法 public void add(DoubleDataNode node){ DoubleDataNode tmp = head; while(true){ if(tmp.next == null){ tmp.next = node;
2020-10-24 22:14:20
63
原创 工厂模式
工厂模式简单工厂定义结构代码工厂方法模式抽象工厂模式简单工厂定义提供一个创建对象实例的功能,而无需关心其具体实现。被创建实例的类型,可以是接口,抽象类,也可以是具体的类。结构#mermaid-svg-l6raRFop0YAz6gUa .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-l6raRFop0Y
2020-10-24 16:39:10
100
原创 单向链表
链表/定义一个SingleLinkedList来管理数据class SingleLinkedList{ //用来做链表的头节点,不放数据 private DataNode head = new DataNode(); //添加节点方法,非排序 public void add(DataNode node){ DataNode tmp = head; while(true){ if(tmp.next == null)
2020-10-18 22:40:28
75
原创 队列
介绍队列是一个有序列表,可以用数组或是链表来实现。遵循先入先出的原则。既:先存入队列的数据,要先取出。后存入的要后取出。数组模拟环形队列public class CircleArray{ private int maxSize;//数组最大长度 private int front;//队列头指针,指向第一个元素 private int rear;//队列尾指针,指向最后一个元素的下一个位置(为了区分两个指针的方向,队列尾端空一个位置) private int[] a
2020-10-18 22:38:39
98
原创 稀疏数组
稀疏数组应用场景处理方式案例应用场景当一个数组大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存数据。处理方式1)记录数组一共有几行几列,有多少个不同的值。2)把具有不同值的元素行列及值记录在一个小规模的数组中,从而缩小程序的规模。案例原始数组0、0、0、0、0、00、0、0、0、0、00、0、0、3、0、00、0、0、0、0、0对应稀疏数组row,col,val4,5,12,3,2...
2020-10-18 22:34:07
115
原创 数据结构分类
数据结构分类线性结构非线性结构线性结构1.线性结构作为最常用的数据结构,其特点是数据元素之间存在一对一的线性关系2.线性结构有两种不同的存储结构,顺序存储结构(数组)和链式存储结构(链表)。顺序存储的线性表称为顺序表,顺序表中的存储元素是连续的。链式存储的线性表称为链表,链表中的存储元素不一定是连续的,元素节点中存放数据元素以及相邻元素的地址信息。3、线性结构常见的有:数组、队列、链表和栈非线性结构非线性结构包括:二位数组、多维数组、广义表、树结构、图结构。...
2020-10-18 22:29:02
112
原创 单例模式Singleton
单例模式Singleton简介举例饿汉式(静态常量)代码讨论饿汉式(静态代码块)代码讨论懒汉式(线程不安全)代码讨论懒汉式(线程安全,同步方法)代码讨论懒汉式(双重检查)代码讨论静态内部类代码讨论枚举代码讨论简介单例模式就是采取一定的方法保证在整个软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法(静态方法)。举例JDK里面的java.lang.Runtime 使用了单例模式(饿汉)饿汉式(静态常量)代码//饿汉式(静态常量)class SingleTon
2020-10-15 15:42:42
84
原创 UML类图
UML类图UML类图介绍依赖泛化(继承)实现关联聚合组合UML类图介绍用于描述系统中的类(对象)本身的组成和类(对象)之间的各种静态关系。类之间的关系:依赖、泛化(继承)、实现、关联、聚合、组合依赖只要是在类中用到了对方,那么他们之间就存在依赖关系。如果没有对方就编译不了。成员变量,方法参数,方法返回类型、局部变量都可以构成依赖关系。#mermaid-svg-H0mxhZ6ifOohN8vA .label{font-family:'trebuchet ms', verdana, aria
2020-10-14 00:00:47
65
原创 设计模式七大原则
设计模式七大原则设计模式目的1. 单一职责原则要求:举例:优点:2. 接口隔离原则要求:举例:优点:3. 依赖倒置原则4. 里氏替换原则5. 开闭原则6. 迪米特法则7. 合成复用原则设计模式目的设计模式是为了让程序,具有更好的代码重用性(相同功能的代码,不用多次编写)、可读性(编程## 标题规范性、便于其他程序员阅读和理解)、可扩展性(方便增加新功能时)、可靠性(增加新功能不会影响旧功能)、高内聚低耦合(功能模块之间界限分明)。设计模式原则是程序员在编程时,应当遵守的原则,也就是各种设计模式的基础(
2020-10-12 11:55:06
573
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人