自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

weixin_49561445的博客

csdn 将弃用转至个人网站https://wangqify.live

  • 博客(78)
  • 资源 (6)
  • 问答 (1)
  • 收藏
  • 关注

原创 JVM 下篇:性能监控与调优

文章目录性能优化三部曲第1步(发现问题):性能监控何时需要性能监控第2步(排查问题):性能分析第3步(解决问题):性能调优性能评价/测试指标JVM监控及诊断工具命令行jpsjstatjinfojmap导出内存镜像文件显示堆内存相关信息其它作用jhatjstackjcmdjstatdJVM监控及诊断工具GUIJconsoleVisual VMeclipse MAT获取dump文件分析堆dump文件浅堆与深堆对象实际大小内存泄漏内存泄漏与内存溢出的关系泄漏的分类Java中内存泄漏的8种情况静态集合类单例模式内部

2021-10-30 12:58:05 1117

原创 JVM 中篇:字节码与类的加载

文章目录字节码的跨平台性前端编译器Class 文件结构Class类的本质Class文件格式Class 文件结构Magic Number(魔数)文件版本号常量池constant_ pool count(常量池计数器)constant_pool[] 常量池表字面量和符号引用全限定名简单名称描述符符号引用和直接引用的区别与关联小结访问标识类索引、父类索引、接口索引集合字段表集合方法表集合属性表集合解析Class 文件解析字节码方式javap字节码指令集加载与存储指令局部变量压栈指令常量入栈指令出栈装入局部变量表指

2021-10-30 10:58:11 592

原创 JVM上篇:内存与垃圾回收

注:本文浓缩了宋红康老师JVM 入门到精通上篇(内存与垃圾回收)的精华文章目录JVMJVM 的位置JAVA代码的执行流程JVM 整体结构JVM 的架构模型JVM的生命周期主流JVM 的发展历程类的加载子系统类的加载子系统的作用类的加载过程加载链接类的初始化类的加载器分类虚拟机自带的加载器获取ClassLoader 的实例双亲委派机制工作原理优势类的主动使用和被动使用主动使用运行时数据区程序计数器介绍作用虚拟机栈栈内部的存储结构栈帧的结构局部变量表操作数栈动态链接方法的调用虚方法与非虚方法方法返回地址本地方

2021-10-24 11:37:32 2055

原创 JUC 并发编程

1 什么是 JUCjava.util.concurrent 并发工具包 用来优雅的解决多线程下的高并发问题,JUC 下的大部分类均由Doug Lea 设计开发,此乃神人也!让 Java 程序员膜拜的大神,这个憨态可掬的老者让人又爱又恨!JUC 的基本框架2 线程与进程概念进程:一个程序,或者程序的集合一个进程可以包含多个线程,至少包含一个java默认有2个线程 mian GC线程:进程下的不同操作有线程操作负责的 Thread Runnable Callablejava 无法直接

2021-10-04 00:12:04 415

原创 Exchanger 线程数据交换器

基本结构Exchanger——交换器,是JDK1.5时引入的一个同步器, 主要作用是交换数据。Exchanger有点类似于CyclicBarrier, CyclicBarrier是一个栅栏,到达栅栏的线程需要等待其它一定数量的线程到达后,才能通过栅栏。可以看成是一个双向栅栏Thread1线程到达栅栏后,会首先观察有没其它线程已经到达栅栏,如果没有就会等待,如果已经有其它线程(Thread2)已经到达了,就会以成对的方式交换各自携带的信息,因此Exchanger非常适合用于两个线程之间的数据交换。

2021-10-04 00:09:20 5600

原创 ConcurrentHashMap

JDK 7JDK1.7之前的ConcurrentHashMap使用分段锁机制实现类似分散热点的思想,以减少热点域的冲突,最大并发度受Segment的个数限制。ConcurrentHashMap在对象中保存了一个Segment数组,即将整个Hash表划分为多个分段;而每个Segment元素,即每个分段则类似于一个Hashtable;这样,在执行put操作时首先根据hash算法定位到元素属于哪个Segment,然后对该Segment加锁即可。因此,ConcurrentHashMap在多线程并发编程中可是实现

2021-10-04 00:08:17 530

原创 ConcurrentSkipListMap

基于跳表的并发安全mapConcurrentSkipListMap以跳表为基础结构的map集合,并且同时支持并发操作,比ConcurrentHashMap最大的优势应该就是有序。内部结构ConcurrentSkipListMap 实现了ConcurrentNavigableMap 接口继承于NavigableMap ,NavigableMap 则继承于sortedMap接口SortedMap提供了一些根据键范围进行查找的功能,比如返回整个Map中 key最小/大的键、返回某个范围内的子Map视图等

2021-10-04 00:06:19 2335

原创 ReadWriteLock 读写锁

当读操作远远高于写操作时,这时候使用读写锁让读-读可以并发,提高性能。读-写,写-写都是相互互斥的!提供一个数据容器类内部分别使用读锁保护数据的read()方法,写锁保护数据的write()方法public class TestReentrantReadWriterLock { public static void main(String[] args) { DataContainer dataContainer = new DataContainer(); .

2021-10-04 00:03:47 838

原创 LinkedTransferQueue

LinkedTransferQueue是一个由链表结构组成的无界阻塞TransferQueue队列。相对于其他阻塞队列,LinkedTransferQueue多了tryTransfer和transfer方法。可以算是 LinkedBolckingQueue 和 SynchronousQueue 和合体。LinkedTransferQueue是一种无界阻塞队列,底层基于单链表实现,其内部节点分为数据结点、请求结点;基于CAS无锁算法实现基本原理LinkedTransferQueue 消费者线程获取取数据时

2021-10-04 00:02:42 3567

原创 AQS-基于JDK17

全称是 AbstractQueuedSynchronizer,AbstractQueuedSynchronizer抽象类(以下简称AQS)是整个java.util.concurrent包的核心。是阻塞式锁和相关的同步器工.在JDK1.5时,Doug Lea引入了J.U.C包,该包中的大多数同步器都是基于AQS来构建的。AQS框架提供了一套通用的机制来管理同步状态(synchronization state)、阻塞/唤醒线程、管理等待队列。我们所熟知的ReentrantLock、CountDownLatch

2021-10-04 00:01:08 1012

原创 Semaphore 信号量

信号量,用来限制能同时访问共享资源的线程上限。作用: 多个共享资源互斥的使用!并发限流,控制最大的线程数Semaphore维护了一个许可集,其实就是一定数量的“许可证”。当有线程想要访问共享资源时,需要先获取(acquire)的许可;如果许可不够了,线程需要一直等待,直到许可可用。当线程使用完共享资源后,可以归还(release)许可,以供其它需要的线程使用。和CountDownLatch区别CountDownLatch:同步状态State > 0表示资源不可用,所有线程需要等待;Sta

2021-10-03 23:34:45 5757

原创 CyclicBarrier加法计数器

用来进行线程协作,等待线程满足某个计数。构造时设置『计数个数』,每个线程执行到某个需要“同步”的时刻调用 await() 方法进行等待,当等待的线程数满足『计数个数』时,继续执行当计数为0的时候还可以重复使用再次计数线程数需要和计数个数保持一致CyclicBarrier可以认为是一个栅栏。一共4个线程A、B、C、D,它们到达栅栏的顺序可能各不相同。当A、B、C到达栅栏后,由于没有满足总数【4】的要求,所以会一直等待,当线程D到达后,栅栏才会放行。public CyclicBarrier(in.

2021-10-03 23:33:40 198

原创 Fork/Join

Fork/JoinFork/Join 在 JDK 1.7 , 并行执行任务!提高效率。大数据量!大数据:Map Reduce (把大任务拆分为小任务)Fork/Join框架的使用需要根据实际情况划分子任务的大小Fork/Join 特点:工作窃取由于线程处理不同任务的速度不同,这样就可能存在某个线程先执行完了自己队列中的任务的情况,这时为了提升效率,我们可以让该线程去“窃取”其它任务队列中的任务,这就是所谓的***工作窃取算法***。每个线程都有自己的一个WorkQueue,该工作队列是一个双

2021-10-03 23:32:34 1651

原创 ThreadLocal 线程隔离

ThreadLocal而是一个java.lang 包下的线程内部的存储类,可以在线程内存储数据,数据存储以后,只有指定线程可以得到存储数据,实现线程隔离。ThreadLocal为变量在每个线程中都创建了一个副本,那么每个线程可以访问自己内部的副本变量。且在线程内部任何地方都可以使用,线程之间互不影响ThreadLocal 提供程内的局部变量,不同的线程之间不会相互程的生命周明内起作用,减少同一个程内多个函数或组件之间一些公共变量传详的复杂度在多线程并发下我们可以通过过 Threadlocal在同一线程

2021-10-03 23:31:17 3030

原创 线程池底层原理

线程池的好处降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。提高响应速度。当任务到达时,任务可以不需要的等到线程创建就能立即执行。提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。程序的运行,本质:占用系统的资源! (优化资源的使用 => 池化技术)线程池、连接池、内存池、对象池///… 创建、销毁。十分浪费资源池化技术:事先准备好一些资源,有人要用,就来我这里拿,用完之后还给我。

2021-10-03 23:30:28 243

原创 异步回调 :Future

Future接口Future 设计的初衷: 对将来的某个事件的结果进行建模Future模式,可以让调用方立即返回,然后它自己会在后面慢慢处理,此时调用者拿到的仅仅是一个凭证,调用者可以先去处理其它任务,在真正需要用到调用结果的场合,再使用凭证去获取调用结果。这个凭证就是这里的Future。Future模式下的数据获取:JDK提供了另一个接口——Callable,表示一个具有返回结果的任务:public interface Callable<V> { V call() thr

2021-10-03 23:29:33 1123

原创 原子累加器 :LongAdder

LongAdderLongAdder是java8为我们提供的新的类,跟AtomicLong有相同的效果。是对CAS机制的优化继承于Striped64 ,其子类还有LongAccumulator,DoubleAdder,DoubleAccumulatorLongAccumulator 是LongAdder的扩展,让用户自定义累加规则。可以传入函数式接口DoubleAdder操作浮点型,DoubleAccumulator 是DoubleAdder的扩展,让用户自定义累加规则。可以操作函数式接口pub

2021-10-03 23:28:28 418

原创 共享模型之内存

JMMJMM 即 Java Memory Model,它定义了主存(共享内存)、工作内存(线程私有)抽象概念,底层对应着 CPU 寄存器、缓存、硬件内存、 CPU 指令优化等。JMM 体现在以下几个方面原子性 - 保证指令不会受到线程上下文切换的影响可见性 - 保证指令不会受 cpu 缓存的影响有序性 - 保证指令不会受 cpu 指令并行优化的影响关于JMM的一些同步的约定:1、线程解锁前,必须把共享变量立刻刷回主存。2、线程加锁前,必须读取主存中的最新值到工作内存中!3、加锁和解锁是

2021-10-03 23:27:27 307

原创 ReentrantLock

特点可中断可以设置超时时间可以设置为公平锁 (先到先得)支持多个条件变量( 具有多个 WaitSet)支持可重入// 获取ReentrantLock对象private ReentrantLock lock = new ReentrantLock();// 加锁lock.lock();try { // 需要执行的代码}finally { // 释放锁 lock.unlock();} synchronized 和 ReentrantLock区别Synchronize

2021-10-03 23:23:09 203

原创 Synchronized 底层原理

Synchronized 底层原理java 对象及对象头java中的锁Monitor-重量级锁Monitor 被翻译为监视器或管程Synchronized是通过对象内部的一个叫做 监视器锁(Monitor)来实现的。但是监视器锁本质又是依赖于底层的操作系统的Mutex Lock来实现的。而操作系统实现线程之间的切换这就需要从用户态转换到核心态,这个成本非常高,状态之间的转换需要相对比较长的时间,这就是为什么Synchronized效率低的原因。因此,这种依赖于操作系统Mutex Lock所

2021-10-03 23:20:59 1129

原创 Centos 8 常用指令汇总

主要目录结构/ #根目录├── bin -> #(/usr/bin 、 /usr/local/bin) 目录存放着最经常使用的命令├── boot #系统启动文件├── dev #设备文件类似windows的设备管理器,把所有的硬件用文件的形式存储├── etc #系统配置文件,所有的系统管理所需要的配置文件和子目录 my.conf├── home #普通用户根目录,每个用户都有一个自己的目录,一般该目录名是以用户的账号命名├── lib -> usr/lib #系统共享库文件

2021-07-06 14:40:46 2131

原创 设计模式之职责链模式

职责链模式其他模式职责链模式是一种行为设计模式, 允许你将请求沿着处理者链进行发送。 收到请求后, 每个处理者均可对请求进行处理, 或将其传递给链上的下个处理者。职责链模式通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。责任链将请求的发送者和请求的处理者解耦了。概括:把请求从链中的一个对象传到下一个对象,直到请求被响应为止。通过这种方式去除对象之间的耦合。职责链模式存在以下两种情况。纯的职责链模式:一个请求必须被某一个处理

2021-06-18 08:32:45 414 1

原创 设计模式之访问者模式

访问者模式其他模式访问者模式是一种行为设计模式, 它能将算法与其所作用的对象隔离开来。访问者模封装一些作用于某种数据结构的各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。主要将数据结构与数据操作分离,解决数据结构和操作耦合性问题概括:在不改变集合元素的前提下,为一个集合中的每个元素提供多种访问方式,即每个元素有多个访问者对象访问。核心:在被访问的类里面加一个对外提供接待访问者的接口; 为整个类层次结构添加 “外部” 操作, 而无需修改这些类的已有代码。模式结构抽象访

2021-06-18 08:32:33 149

原创 设计模式之命令模式

命令模式其他模式命令模式是一种行为设计模式, 它可将请求转换为一个包含与请求相关的所有信息的独立对象。 该转换让你能根据不同的请求将方法参数化、 延迟请求执行或将其放入队列中, 且能实现可撤销操作。命名模式使得请求发送者与请求接收者消除彼此之间的耦合,让对象之间的调用关系更加灵活,实现解耦。概括:将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。核心:将发起请求的对象与执行请求的对象解耦。模式结构抽象命令类(Command)角色:声明执行命令的接口,拥有执行命令的抽象方法 e

2021-06-18 08:31:28 558 1

原创 设计模式之迭代器模式

迭代器模式其他模式迭代器模式是一种行为设计模式, 让你能在不暴露集合底层表现形式 (列表、 栈和树等) 的情况下遍历集合中所有的元素。迭代器模式,提供一种遍历集合元素的统一接口,用一致的方法遍历集合元素,不需要知道集合对象的底层表示,即:不暴露其内部的结构。概括: 定义一个中介对象来简化原有对象之间的交互关系,降低系统中对象间的耦合度,使原有对象之间不必相互了解。模式结构抽象聚合(Aggregate)角色:定义存储、添加、删除聚合对象以及创建迭代器对象的接口。具体聚合(ConcreteAgg

2021-06-17 17:38:48 108 1

原创 设计模式之观察者模式

观察者模式观察者模式是一种行为设计模式, 允许你定义一种订阅机制, 可在对象事件发生时通知多个 “观察” 该对象的其他对象。多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。这种模式有时又称作发布-订阅模式、模型-视图模式,它是对象行为型模式概括:多个对象间存在一对多关系,当一个对象发生改变时,把这种改变通知给其他多个对象,从而影响其他对象的行为。模式结构抽象主题(Subject)角色:也叫抽象目标类,它提供了一个用于保存观察者对象的聚集类和增

2021-06-17 17:38:24 101 1

原创 设计模式之中介者模式

中介者模式其他模式中介者模式是一种行为设计模式, 能让你减少对象之间混乱无序的依赖关系。 该模式会限制对象之间的直接交互, 迫使它们通过一个中介者对象进行合作。中介者模式(Mediator Pattern ),用一个中介对象来封装一系列的对象交互。中介者使各个对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。中介者模式又叫调停模式,它是迪米特法则的典型应用。类似比如MVC模式,C(Controller控制器)是M(Model模型)和V(View视图)的中介者,在前后端交

2021-06-17 17:37:36 156 1

原创 设计模式之备忘录模式

备忘录模式其他模式备忘录模式是一种行为设计模式, 允许在不暴露对象实现细节的情况下保存和恢复对象之前的状态。该模式又叫快照模式。属于行为型模式。备忘录模式(Memento Pattern)在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。概括:在不破坏封装性的前提下,获取并保存一个对象的内部状态,以便以后恢复它。模式结构发起人(Originator)角色:记录当前时刻的内部状态信息,提供创建备忘录和恢复备忘录数据的功能,实现其

2021-06-17 17:37:04 131 1

原创 设计模式之状态模式

状态模式其他模式状态模式是一种行为设计模式, 让你能在一个对象的内部状态变化时改变其行为, 使其看上去就像改变了自身所属的类一样。它主要用来解决对象在多种状态转换时,需要对 输出不同的行为的问题。状态和行为是一一对应的,状态之间可以相互转换当一个对象的内在状态改变时,允许改变其行为,这个对象看起来像是改变了其类概括:允许一个对象在其内部状态发生改变时改变其行为能力。核心:改变一个对象的状态时,输出不同的行为。模式结构环境类(Context)角色:也称为上下文,它定义了客户端需要的接口,内部

2021-06-17 17:36:37 140 1

原创 设计模式之代理模式

代理模式代理模式是一种结构型设计模式, 让你能够提供对象的替代品或其占位符。 代理控制着对于原对象的访问, 并允许在将请求提交给对象前后进行一些处理。这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能。被代理的对象可以是远程对象、创建开销大的对象或 需要安全控制的对象代理模式有不同的形式, 主要有三种静态代理、理动态代理 (JDK代理、接口代理 )和 Cglib代理(可以在内存动态的创建对象,而不需要实现接口,他是属于动态代理的范畴)。概括:为某对象提供一种代理以

2021-06-17 17:36:04 129 1

原创 设计模式之适配器模式

适配器模式概述适配器模式(Adapter Pattern)将某个类的接口转换成客户端期望的另一个接口表示,主的目的是兼容性,让原本因接口不匹配不能一起工作的两个类可以协同工作。其别名为包装器(Wrapper)适配器模式属于结构型模式主要分为三类:类适配器模式、对象适配器模式、接口适配器模式概述:将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。核心: 兼容,转换;让接口不兼容的类可以兼容,让类与类之间可以协调工作,当被适配的类变化的时候,通过适配

2021-06-17 17:35:12 189 1

原创 设计模式之单例模式

单例模式单例(Singleton)模式:某采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法(静态方法)。概括:某个类只能生成一个实例,该类提供了一个全局访问点供外部获取该实例,其拓展是有限多例模式单例模式特点:单例类只有一个实例对象;该单例对象必须由单例类自行创建;单例类对外提供一个访问该单例的全局访问点饿汉式单例模式类一旦加载就创建一个单例,保证在调用 getInstance 方法之前单例已经存在了饿汉式(静态常量)pub

2021-06-17 17:34:34 87 1

原创 设计模式之策略模式

策略模式其他模式策略模式是一种行为设计模式, 它能让你定义一系列算法, 并将每种算法分别放入独立的类中, 以使算法的对象能够相互替换。此模式让算法的变化独立于使用算法的客户此算法体现了几个设计原则:把变化的代码从不变的代码中分离出来。针对接口编程而不是具体类(定义了策略接口)。多用组合/聚合,少用继承(客户通过组合方式使用策略。策略模式的关键是:分析项目中变化部分与不变部分 。概括:定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的改变不会影响使用算法的客户。核心:

2021-06-17 17:33:59 132 1

原创 设计模式总结

概述软件设计模式(Software Design Pattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。它描述了在软件设计过程中的一些不断重复发生的问题,以及该问题的解决方案。设计模式是软件设计中常见问题的典型解决方案。 每个模式就像一张蓝图, 你可以通过对其进行定制来解决代码中的特定设计问题。设计模式目的代码重用性 (即:相同功能的代码,不用多次编写)可读性 (即:编程规范性, 便于其他程序员的阅读和理解)可扩展性 (即:当需要增加新的功能时,

2021-06-17 17:33:01 595 1

转载 算法之滑动窗口算法

滑动窗口算法基本原理与实践滑动窗口协议(Sliding Window Protocol),该协议是 TCP协议 的一种应用,用于网络数据传输时的流量控制,以避免拥塞的发生。该协议允许发送方在停止并等待确认前发送多个数据分组。由于发送方不必每发一个分组就停下来等待确认。因此该协议可以加速数据的传输,提高网络吞吐量。滑动窗口算法其实和这个是一样的,只是用的地方场景不一样,可以根据需要调整窗口的大小,有时也可以是固定窗口大小。滑动窗口算法(Sliding Window Algorithm)Sliding

2021-06-02 11:38:44 1170

原创 算法之弗洛伊德(Floyd)算法

简介:Floyd算法又称为插点法,是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法,与Dijkstra算法类似。该算法名称以创始人之一、1978年图灵奖获得者、斯坦福大学计算机科学系教授罗伯特·弗洛伊德命名。Floyd算法用于多源最短路径的求解,算出来的是所有的节点到其余各节点之间的最短距离。与迪杰斯特拉算法区别:迪杰斯特拉算法通过选定的被访问顶点,求出从出发访问顶点到其他顶点的最短路径; 弗洛伊德算法中每一个顶点都是出发访问点,所以需要将每一个顶点看做被访问顶点,求出从每一个顶点到

2021-06-02 10:32:28 4209

原创 算法之迪杰斯特拉算法

迪杰斯特拉(Dijkstra)算法是典型求单源(一个顶点到一个顶点)最短路径算法,用于计算一个结点到其他结点的最短路径。 它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止。迪杰斯特拉算法思想设G=(V,E)为一个带全有向图,把图中顶点集合V分成两组。第一组为已求出最短路径的顶点集合(用S表示,初始时S中只有一个源点,以后每求得一条最短路径 , 就将所到达最短路径的顶点加入到集合S中,直到全部顶点都加入到S中)。第二组为其余未确定最短路径的顶点集合(用U表示,U=V-S,U

2021-06-01 18:44:42 4691

原创 算法之普利姆(Prim)算法

普利姆(Prim)算法 和克鲁斯卡尔算法一样都是求最小生成树的算法所谓的最小生成树:给定一个带权的无向连通图,如何选取一棵生成树,使树上所有边上权的总和为最小,这叫最小生成树特点:1 N个顶点,一定有N-1条边2 包含全部顶点3 N-1条边都在图中4 最小生成树不是唯一的5 最小生成树边的权值总和是唯一的普利姆(Prim)算法求最小生成树,也就是在包含 n 个顶点的连通图中,找出只有(n-1)条边包含所有 n 个顶点的连通子图流程1 设G=(V,E)是连通网,T=(U,D)是最

2021-06-01 16:46:52 1050

原创 算法之克鲁斯卡尔(Kruskal)算法

克鲁斯卡尔(Kruskal)算法克鲁斯卡尔(Kruskal)算法,是用来求加权连通图的最小生成树的算法。基本思想:按照权值从小到大的顺序选择n-1条边,并保证这n-1条边不构成回路具体做法:首先构造一个只含n个顶点的森林,然后依权值从小到大从连通网中选择边加入到森林中,并使森林中不产生回路,直至森林变成一棵树为止克鲁斯卡尔算法在所有连接森林的两个不同树的边里面,寻找权值最小的边将最小的边加入一个不相交的集合来进行维护,每次加入时判断该边的起始顶点与结束顶点是否属于同一个树,即是否使森林产生回路,如果

2021-06-01 11:34:56 2380

原创 算法之Sunday算法

Sunday算法由Daniel M.Sunday在1990年提出,它的思想跟BM算法很相似:Sunday算法 算法是比BM 和KBM更高效的算法,它不关注好后缀与坏字符,只关注文本串中参加匹配的最末位字符的下一位字符的情况Sunday算法是从前往后匹配,在匹配失败时关注的是文本串中参加匹配的最末位字符的下一位字符。1 如果该字符没有在模式串中出现则直接跳过,即移动位数 = 匹配串长度 + 1;2 否则,其移动位数 = 模式串中最右端的该字符到末尾的距离+11 2 可以直接概括为模式串.leng

2021-05-31 21:35:05 540

JVM 入门到精通 Typora 版

JVM 入门到精通 Typora 版

2021-10-30

最全的并发编程JUC 笔记 Typora 版

JUC 笔记 基于JDK 17

2021-10-03

java 红黑树实现.rar

java 实现红黑树的增删改查

2021-04-27

BPlusTree.rar

java实现B+树完整代码

2021-04-27

B树Java实现.rar

300行代码实现B树的增删查

2021-04-27

HuffmanCoding.java

使用赫夫曼树对文件进行无损压缩及解压

2021-04-27

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除