- 博客(685)
- 资源 (1)
- 问答 (6)
- 收藏
- 关注
原创 Java版-图论-最短路-Floyd算法
根据上面提示,可以计算出,最大有100个点,最大耗时为100*wi,即最大的耗时为10000,任何耗时计算出来超过这个值可以理解为不可达了;
2024-12-10 15:57:19
391
原创 Java版-图论-最小生成树-Prim算法
如图:Prim算法的基本思想是从一个顶点开始,逐步构建最小生成树。与Kruskal算法相比,Kruskal是选择最小边,通过判断连通性加入最小生成树;Prim算法是选择点,构成最小生成树,然后选择未加入的点,通过权重判断是否能加入最小生成树;下面是详细的构建过程:首先加入index=0的点,此时最小生成树包含了只有0;注意,此时最小生成树节点[0,5],是两个,这两个是一个整体;
2024-12-10 14:26:43
555
原创 Java版-图论-最小生成树-Kruskal算法
为了造出一棵最小生成树,我们从最小边权的边开始,按边权从小到大依次加入,如果某次加边产生了环,就扔掉这条边,直到加入了 n-1 条边,即形成了一棵树。
2024-12-09 15:36:11
459
原创 Java版-图论-拓扑排序与有向无环图
对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边∈E(G),则u在线性序列中出现在v之前。通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列,简称拓扑序列。简单的说,由某个集合上的一个偏序得到该集合上的一个全序,这个操作称之为拓扑排序。
2024-12-09 10:43:45
604
原创 Java版-速通ETL工具中简单的DAG执行实现
/节点id//节点名称//前置节点//节点是否执行完成//节点是否执行成功//节点输出数据//节点配置数据/*** 节点的具体执行*/= null &&!//前置节点都执行完了,可以开始执行本节点任务了//本节点执行完了,通知下@Overridetry {//一些失败的处理....节点包含必要的状态:完成情况,成功失败情况。
2024-12-04 14:56:17
383
原创 Java版-速通队列和栈的基本操作
队列是种先进先出的数据结构。队列的基本操作主要是入队和出队。数据从队尾进入队列,从队首出队列。其中,pointer代表头队首第一个位置的数据。当头部有数据出队时,对应的pointer指针会往后移动一位。如果有数据入队,会直接加在队尾:我们会发现,随着队首数据的数据的出队,队首指针之前的空间都会被浪费掉,而且随着使用次数变多,空间浪费会越来越高。为了重复使用这部分空间,避免浪费,我们可以设计一个队首与队尾相连接的队列,重复利用空间。
2024-12-04 14:53:32
410
原创 Java版-速通数据结构-树基础知识
BST1,每个节点中的值必须大于(或等于)存储在其左侧子树中的任何值2,每个节点中的值必须小于(或等于)存储在其右子树中的任何值我们可以把BST看成是进化了的二叉树。而且观察BST的这个特点,是不是让你想起来我们之前说过的数组的二分法,利用二分法对有序数组进行查找,可以提高搜索效率。如果对BST进行搜索,我们也可以充分利用BST的特征。根节点不包含字符,除根节点外每一个节点都只包含一个字符;从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串;
2024-12-04 14:51:47
315
原创 Java版-速通链表的基本操作
对于线性表来说,主要由顺序表示或链式表示。其中,顺序表示,我们在对应到实现的时候,经常使用数组进行实现。利用数组来实现一个线性的结构,好处是元素随机访问的时间复杂度都控制在常数内,并且元素的物理存放位置固定。但是用数组存放,如果遇到数组空间不足的情况,常常需要进行扩容操作,如,我们Java中常见的的ArrayList实现,在进行扩容的时候,需要将原数组数据拷贝到新的数组空间中,这一操作数据量较大时候比较耗时。
2024-12-04 14:48:45
126
原创 Java版-速通数组基础知识
我们首先来看一个数组的查找问题,对于升序数组nums,在数组中查找target,并返回target在nums中的索引位置。如果未找到返回-1。首先我们用最简单的无脑暴力法,从index=0的位置开始,往后依次对比,如果对比成功返回当前位置,如果不成功返回-1.index++) {return -1;从平均时间复杂度来看,这段代码复杂度为O(n)。再回到题目,数组nums是升序的,这一点是我们在代码中没有利用到的条件,如果我们第一次先去比较数组中间的数字,如果。
2024-12-04 14:37:46
114
原创 Java版-速通基本的位运算操作
为了简单点儿,我们只使用四位0和1。对于四位0和1,我们能表示的正数范围为0000 ~ 1111(0~15);如果最高位用作符号位,0表示正数,1表示负数,则能表示的数字范围为(-7~7);首先来看最简单的正数情况,如果为正数,那么原码,反码,补码规定为一致的;所以我们下面的讨论,主要是针对有符号位的负数。
2024-12-04 14:26:46
231
原创 CopyOnWriteArrayList实现解析
一,内部核心变量定义 /** The lock protecting all mutators */ final transient ReentrantLock lock = new ReentrantLock(); /** The array, accessed only via getArray/setArray. */ private transient volatile Object[] array;数据存放在arry内部;二,读取操作 /**
2022-02-17 21:25:31
413
原创 Java SPI
what SPI?SPI全称Service Provider Interface,是Java提供的一套用来被第三方实现或者扩展的接口,它可以用来启用框架扩展和替换组件。 SPI的作用就是为这些被扩展的API寻找服务实现。如何使用定义如下类:public interface SPITestInterface { String consoleSth(String source);}public class DefaultSPITestInterfaceImplOne implements
2022-01-20 13:32:36
1336
原创 LinkedHashMap实现解析
1,基本核心结构LinkedHashMap继承HashMap,除了有那些HashMap内部的结构外,还定义了 一个双向链表,/** * HashMap.Node subclass for normal LinkedHashMap entries. */static class Entry<K,V> extends HashMap.Node<K,V> { Entry<K,V> before, after; Entry(int hash, K ke
2022-01-01 16:30:26
811
原创 HashMap核心代码解析
1,基本结构图解HashMap首先是一个 数组,数组的每个位置,挂的是链表或者红黑树 (jdk 1.8及其以上);在jdk 1.8之前,HashMap的实现仅仅是在数组的每个位置上 挂链表;只用链表的弊端:可能以为位置上hash冲突过多,造成去定位时候,查找效率比较低,ps,链表的查找时间复杂度为O(n),红黑树查找的复杂度为O(logn);2,如何去定位在数组中的位置首先先来看HashMap是如何把数据打散的:首先先来看HashMap是如何把数据打散的:static final int ha
2022-01-01 15:40:52
1012
原创 redis——基于redission的延时队列
private RBlockingQueue<TeacherAuthProgressContext> blockingQueue; private RDelayedQueue<TeacherAuthProgressContext> delayedQueue;初始化: blockingQueue = client.getNativeClient().getBlockingQueue(queueName); if (blockingQueue == n...
2021-12-21 16:06:03
1430
原创 Guava:使用ListenableFuture来执行有返回值的线程任务
首先来定义一个任务: @Getter @Setter @AllArgsConstructor class GetThreadReturnResult implements Callable<String>, Serializable { private static final long serialVersionUID = 2277437296426921203L; private String id; @Overr
2021-12-21 15:05:47
945
原创 Java一些并发类实现原理
基础元素实现原理volatileLock前缀指令+JMM+缓存一致性模型+内存屏障(JMM内存屏障映射为操作系统内存屏障)synchronized锁升级(优化 ),monitor对象+等待通知(重量级锁)finalJMM保证cascmpxchg...
2021-12-18 14:46:12
785
原创 synchronized实现解析
JVM层的实现对于代码: int dataV = 1; public synchronized void changeData() { dataV++; } public void readData() { synchronized (this) { System.out.println(dataV); } }同步代码块首先来看代码块方法readData反编译之后:对于同步代码快,反编译
2021-12-16 18:00:30
355
原创 volatile实现解析
反汇编生成代码使用测试代码,观察value值生成的汇编代码:volatile int value = 1; @Test public void test() { value++; }反汇编观察value++时候的代码: 0x000000011541f775: lock addl $0x0,(%rsp) ;*putfield queueaddl操作前面,会加入一个lock前缀指令。下面来查询lock前缀指令的作用:lock描述翻译:lo
2021-12-16 15:35:36
782
原创 缓存数据库双写不一致问题处理
我们的数据库操作中,一般会封装同步修改缓存的写法,但是这是一个两步操作,有可能带来缓存数据库数据不一致的问题。使用redisson提供的分布式锁解决参考:基于redis的分布式锁在我们之前加锁的逻辑中,对于读写的一段逻辑进行加锁,但是在高并发的场景中,有可能出现同一时刻,锁竞争过多,有可能有的线程会经历过长时间的等待。解决加锁的这种问题,回顾下我们的java提供的一些线程安全的类,可以为我们提供如下解决思路:数据分段将数据通过不同的一个组值,分成多段进行加锁,减少竞争发生时候,等待的线程数.
2021-12-05 14:27:21
1440
原创 基于redis的分布式锁
java使用redisson的客户端 String lockKey = StringUtils.join(new String[]{qid, SafeConverter.toString(resultGroupId)}, ":"); RLock lock = client.getNativeClient().getLock(lockKey); try { lock.lock(); //这里写具体
2021-12-05 11:41:23
1078
原创 图解Java虚拟机内存模型
类装载子系统负责将我们用到的文件,加载到JVM的运行时数据区字节码执行引擎负责执行加载到方法区中的字节码在执行字节码的同时,修改对应线程的程序计数器,标记当前正在执行的代码运行时数据区- 线程独享的部分虚拟机栈主要是存放调用方法时候用到的一些数据;下面我们用一段简单代码来说明下: @Data public static class User implements Serializable { Integer id; String name; .
2021-12-04 20:23:35
1230
原创 Java原子更新类
@Test public void test6() throws Exception { AtomicInteger value = new AtomicInteger(0); CyclicBarrier cyclicBarrier = new CyclicBarrier(100); ExecutorService executorService = Executors.newCachedThreadPool(); for (int .
2021-11-23 20:27:57
406
原创 线程同步控制
CyclicBarrierint iMax = 100; CyclicBarrier barrier = new CyclicBarrier(iMax); int shareValue = 0; Lock lock = new ReentrantLock(); @Test public void test() throws Exception { for (int i = 0; i < iMax; i++) { Some
2021-11-23 18:37:37
202
原创 区块链原理入门
定义区块创建区块链/** * \* Created: liuhuichao * \* Date: 2021/11/20 * \* Time: 5:26 下午 * \* Description:区块定义 * \ */@Data@AllArgsConstructor@NoArgsConstructorpublic class Block implements Serializable { private static final long serialVersionUID = -7
2021-11-20 17:41:59
11305
原创 LC指北-持续更新中
先导篇-数据结构基础数据结构部分知识框架:数据结构数据结构内容总结:数据结构内容详情进阶篇动态规划01背包问题:01背包完全背包问题:完全背包多重背包问题:多重背包回溯算法贪心算法并查集并查集基础知识:并查集基础...
2021-09-09 21:42:42
200
原创 动态规划问题3--多重背包
多重背包问题描述及其代码在01背包的基础上,01背包是每个物品有一个,所以只能放入一次,此时我们再加入一个物品个数的数组s,表示每个物品的个数,多重背包介于01背包和完全背包中间,加入了判断物品个数的一个维度,我们可以在01背包基础上,增改下代码(这里面我们直接上一维数组的了,不讲空间优化了,有兴趣的可以去看前面写过的背包问题,已经写过了):/** * @param V 最大容量 * @param C 物品个数 * @param v 价值数组 * @param w
2021-09-09 17:51:07
338
原创 动态规划2——完全背包问题解析
完全背包问题描述有C种物品和一个容量为V的背包,每种物品都有无限件。第i件物品的体积是v[i],价值是w[i].求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。与之前的01背包不同的是,每个物品都有无限个,对于同一个物品,可以放置多个。基本解法首先还是先来用基本解法来一遍,不带优化的。先看多个物品的状态转移方程。当不选择该物品时候,这个时候值跟01背包的一样,还是dp[i - 1][fv];当选择该物品时候,对于一个固定容量,如果该物品能被放进去,要想价值最大,
2021-09-07 18:50:38
330
原创 动态规划1 —— 01背包详解
从斐波那契数列说起斐波那契数列(Fibonacci sequence),对于n(n>=0),n=0时,f(0)=0;n=1时,f(1)=1;n=2时,f(2)=f(0)+f(1);n=3时,f(2)=f(1)+f(2);以此类推…求解f(n)。最早 ,我们可能在课本上学过,这是个经典的递归问题,于是,能很很快写出递归的代码: public int fib(int N) { if (N == 0) { return 0; }
2021-09-03 18:37:14
393
原创 Java版-数据结构-并查集模板1-路径压缩和按秩合并
并查集的概念引人并查集,在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中。这一类问题近几年来反复出现在信息学的国际国内赛题中。其特点是看似并不复杂,但数据量极大,若用正常的数据结构来描述的话,往往在空间上过大,计算机无法承受;即使在空间上勉强通过,运行的时间复杂度也极高,根本就不可能在比赛规定的运行时间(1~3秒)内计算出试题需要的结果,只能用并查集来描述。并查集是一种树型的数据结构,
2021-03-27 14:04:44
394
原创 将二叉搜索树构建为高度平衡二叉树的方法1--拆解为有序数组,构建高度平衡二叉树
/** * 先得到值,之后重建 * * @param root * @return */ public TreeNode balanceBST(TreeNode root) { if (root == null) { return null; } List<Integer> data = new ArrayList<>(); inOrde.
2020-10-06 14:21:49
297
原创 Java版-字符串算法-超简单KMP实现讲解
最长公共前后缀 /** * 获取最长公共前后缀长度 * * @param s * @return */ private int[] getNext(String s) { int[] result = new int[s.length()]; int len = 0, i = 1; while (i < s.length()) { if (s.charAt(i) == s
2020-07-16 15:06:43
1042
3
原创 Java版-字符串算法-求解最长回文字串——Manacher 算法
之前用动态规划法和中心扩散法求解过这个问题,复习戳这里:LeetCode——5,最长回文子串,看这篇之前,如果不是很明白这个问题的通用解法,先看懂这个再往下看。鉴于dp和中心扩散法,时间复杂度都为n,在这里,我们对中心扩散法进行优化,去掉多次访问同一位置,将中心扩散法优化为时间复杂度为n的算法。 /** * Manacher -- n复杂度算法 * * @param s * @return */ public String longestPali
2020-07-09 15:34:15
474
原创 LeetCode——5,最长回文子串
/** * \* Created: liuhuichao * \* Date: 2019/2/19 * \* Time: 5:41 PM * \* Description: 最长回文子串 * <p> * 给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。 * <p> * 示例 1: * <p> * 输入: "babad" * 输出: "bab" * 注意: "aba" 也是一个有效答案。 * 示例 2: *
2020-07-09 11:21:43
296
原创 Java版-LRU Cache实现
LRU全名是:Least recently use 简单的说就是:最近最少使用。核心思想有以下几点:1,当空间不足时候,先淘汰掉最不常使用到的数据。2,经常访问到的数据的优先级比较高。下面来看几种LRU Cache的简单java实现。使用LinkedList实现class Node { int key; int value; Node(int key, int value) { this.key = key;
2020-07-04 14:18:49
343
假装美少女战士
2021-06-29
Hbase连接报错RpcRetryingCaller
2016-12-22
REST ful api发布到linux报错404
2016-03-29
安卓平板安卓ubunt系统
2016-03-13
安卓ListView如何遍历每个Item保存我每条上添加的数据
2015-10-26
使用bootstrap的一个东西,然后下报出这样一个错误,怎么改写代码才行?()
2015-04-02
TA创建的收藏夹 TA关注的收藏夹
TA关注的人