
算法
文章平均质量分 78
太阳伞下的阿呆
愿天下的每个阿呆都能拥有一个可以依靠的太阳伞
展开
-
背包问题-Java版实现
背包问题简而言之:背包承重有限情况如果装入物品的价值最高。细化分类有有三种01背包问题(unbounded knapsack problem):一共有N件物品,第i(i从1开始)件物品的重量为w[i],价值为v[i]。在总重量不超过背包承载上限W的情况下,能够装入背包的最大价值是多少完全背包问题(unbounded knapsack problem):与01背包不同就是每种物品可以有无限多个:一共有N种物品,每种物品有无限多个,第i(i从1开始)种物品的重量为w[i],价值为v[i]。在总重量不超过原创 2021-08-29 20:01:13 · 647 阅读 · 0 评论 -
并查集应用
并查集简单回顾下并查集概念的几个概念初始化,makeSet,为每个元素构建一个集合find,查找集合根节点union,合并集合详情任意门:https://blog.youkuaiyun.com/u010597819/article/details/104600289并查集的应用场景判断两个集合是否存在交集最小生成树应用岛屿数量题目给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直原创 2021-08-22 19:23:41 · 235 阅读 · 0 评论 -
数据结构之图结构解最短路径
图结构邻接矩阵:可以理解为一个二维数组,即一个正方形的图。例如:动态规划解LCS最长公共子序列,实现代码见:https://blog.youkuaiyun.com/u010597819/article/details/86646297邻接表:将二维数组中的其中一维换成链表结构,即不定长度。主要用于非稠密(稀疏的)的图结构,减少资源浪费,案例取自《数据结构与算法分析 java语言描述》例如:假设一个城镇...原创 2019-07-27 12:33:26 · 295 阅读 · 0 评论 -
缓存置换算法之LRU/LFU
常见缓存置换算法LRU 最近最久未使用FIFO 先进先出置换算法 类似队列OPT 最佳置换算法 (理想中存在的)NRU Clock置换算法LFU 最少使用置换算法PBA 页面缓冲算法LRU实现原理:链表+hash表查询插入时间复杂度:O(1)代码实现:LinkedHashMapdubbo的工具LRU工具类便是继承自LinkedHashMap:com.alibaba.dubbo.common.utils.LRUCache数据结构HashMap结构基础上,为所有Node节点维护一个原创 2021-07-31 16:35:58 · 412 阅读 · 0 评论 -
二叉树四种遍历方式
二叉树四种遍历方式,前中后序遍历按照根节点的访问顺序命名前序遍历:根节点-》左子树-》右子树中序遍历:左子树-》根节点-》右子树后序遍历:左子树-》右子树-》根节点平行序遍历源码地址:https://github.com/GallantKong/tree.git案例数据 /** * 案例数据: * 15 * / \ * 10 20 * / \ / \原创 2021-07-25 15:15:29 · 143 阅读 · 0 评论 -
聊聊1.8版ConcurrentHashMap优化
hash冲突链表结构优化hash冲突的链表长度超过阈值TREEIFY_THRESHOLD=8则转为红黑树结构为什么阈值为8?红黑树平均查找时间复杂度log(N),log(8)=3,链表平均查找长度为N/2,8/2=4,转换后性能更高理想情况下,hash桶中节点的频率遵循泊松分布,桶长度超过8的概率非常小,约为6*10的负8次方,通常情况下不回发生结构转换为什么不直接使用红黑树?因为二叉树(红黑树其实是一种二叉树)虽然查询效率高,但是空间开销非常大,单个 TreeNode 需要占用的空间大约原创 2021-05-30 21:50:01 · 695 阅读 · 0 评论 -
无限循环小数展示算法题
题目给定两个整数,分别表示分数的分子 numerator 和分母 denominator,以字符串形式返回小数。如果小数部分为循环小数,则将循环的部分括在括号内。示例 1:输入: numerator = 1, denominator = 2输出: “0.5”示例 2:输入: numerator = 2, denominator = 1输出: “2”示例 3:输入: numerator = 2, denominator = 3输出: "0.(6)”实现package com.galla原创 2021-05-16 08:54:13 · 1218 阅读 · 0 评论 -
二叉树之字形遍历
案例数据 3 / \ 9 20 / \15 7实现package com.gallant.test;import java.util.ArrayList;import java.util.List;/** * @author : 会灰翔的灰机 * @date : 2021/4/30 */public class ZigzagLevelOrder { /** * @param root : * @return :原创 2021-05-09 22:48:12 · 407 阅读 · 0 评论 -
链表算法
从尾到头打印链表实现结合栈结构实现package com.gallant.test;import java.util.Stack;import lombok.Builder;import lombok.Data;/** * @author : 会灰翔的灰机 */public class LinkedListAlgorithm1 { private static LinkNode init(int size) { LinkNode root = null; Lin原创 2021-05-01 10:53:08 · 124 阅读 · 0 评论 -
共享内存架构中的缓存一致性
摘自曼彻斯特大学伊恩·沃森的讲座概述我们已经讨论过在单核上的性能优化局部性向量现在让我们优化一个共享内存程序两种架构:基于总线的共享内存机器(小规模)基于目录的共享内存机器(大规模)基于总线共享内存的体制基本情况很简单:
脑裂问题HDFS 1.0 架构,图片取自:《Hadoop:The Definitive Guide》1.0问题namenode单点问题随着集群扩展,namenode管理文件元数据存在瓶颈2.0解决方案增加协调者(coordinator)管理一主多从的NameNode节点提供高可用的NameNodefederation联邦解决方案,可以理解为分片方案类似于分库分表脑裂问题(分区问题)正常情况下的协调者机房1与机房2出现网络故障后,机房2重新选举leader,导致脑裂问题如下。导原创 2020-08-16 17:16:14 · 2491 阅读 · 4 评论 -
分配内核内存(buddy系统和slab系统)(3)
目录内存管理中的分区分配方法(1)伙伴系统(算法)-内存分配技术(2)分配内核内存(buddy系统和slab系统)(3)管理内核进程空闲内存的两种策略:1. 伙伴系统 –伙伴分配系统是一种算法,它把一个大的内存块切分为一个小的部分来满足请求。该算法通常给出最符合的内存块。块的两个更小的子部分是相同大小的,称为伙伴。两个伙伴中的一个以同样的方式进一步切分为更小的子部分,直到请求被满足为止。该技术的好处是两个伙伴可以根据内存请求合并形成一个大尺寸的块。例如 – 如果发出一个需求25Kb的请求翻译 2020-05-10 08:20:50 · 994 阅读 · 0 评论 -
伙伴系统(算法)-内存分配技术(2)
目录内存管理中的分区分配方法(1)伙伴系统(算法)-内存分配技术(2)分配内核内存(buddy系统和slab系统)(3)算法描述静态分区 方案受固定活跃进程数的限制,并且空间的使用也可能不是最优的。伙伴系统是一个内存分配与管理算法,该算法管理的内存以2的幂次增长。假设内存大小是2,假设需求S大小的内存。If 2<S<=2: 分配全部内存Else: 递归二等分切分块,...翻译 2020-05-03 15:28:05 · 1035 阅读 · 0 评论 -
内存管理中的分区分配方法(1)
目录内存管理中的分区分配方法(1)伙伴系统(算法)-内存分配技术(2)分配内核内存(buddy系统和slab系统)(3)四种常见的内存管理技术在操作系统中,以下是四种常见的内存管理技术单一连续分配: MS-DOS使用的最简单的分配方法。所有内存(除了一些为OS预留的内存) 都可以用于一个进程分区分配: 内存被分成不同的块或区。每个进程基于需求分配内存。分页内存管理: 内存被分到...翻译 2020-05-02 22:39:25 · 1945 阅读 · 0 评论 -
FreeBSD的一个可扩展的并发malloc(3)实现
Jason Evans jasone@FreeBSD.orgApril 16, 2006摘要FreeBSD项目从版本5开始就致力为为多处理器计算系统持续提供可扩展支持。已经取得了足够足够的进展,C类库的malloc(3)内存分配器是运行在多处理器系统的多线程应用的潜在瓶颈。在本文中,我们提供一个新的内存分配器,建立在现有技术的基础上,为应用提供一个可扩展的并发分配。基准测试表明该分配器,对多...翻译 2020-04-25 22:52:26 · 551 阅读 · 0 评论 -
为什么Map的大小必须是2的幂
环境:jdk1.8构造函数首先我们看下HashMap构造函数,以及默认容量DEFAULT_INITIAL_CAPACITY设置,指定初始化容量的构造函数中对初始化容量做了2的幂处理,例如:指定17,处理后会变成32(向上取幂)。默认容量16也是2的幂,并且注释中写明了必须为2的幂。/** * The default initial capacity - MUST be a power of...原创 2020-03-15 17:01:05 · 433 阅读 · 2 评论 -
Geohash
定义Geohash是将一个地理位置编译为一个数字与字母组成的短字符串算法逻辑例如:天安门附近经纬度:116.403694,39.911836。我们按照geohash将其转为长度5的geohash1. 经纬度按照二分法二分,经纬度如果属于二分后的左区间则取0,右区间则取1绿色背景表示纬度落在区间bit value 代表转为二进制的取值mean value 代表二分后选中区间(绿色背景...原创 2020-03-08 18:57:17 · 1670 阅读 · 0 评论 -
数据结构之并查集
表示法一个不相交集合森林(树集合)有许多元素组成,每个元素保存一个id,一个父指针,并且在高效算法中,还保存一个size或一个rank值这些元素的父指针被排列成一个或多个树的形式,每一个树代表一个集合。如果一个元素的父指针没有指向其他元素,那么这个元素就是这棵树的root节点,并且是该集合的代表成员。一个集合可以只由一个元素组成。不管怎样,如果元素有一个父,这个元素被标识为跟随它父指针链向上直...翻译 2020-03-01 21:09:37 · 316 阅读 · 0 评论 -
斐波那契堆
结构描述斐波那契堆是满足最小堆树的集合,最小堆树指的满足子节点key小于等于它父节点key,也就是说集合的最小key一定是所有树中某一个的root节点。斐波那契堆比二项堆更加灵活。树没有规定的形状,极端情况下一个单独的树可以包含堆所有的元素。这种灵活性允许以一种延迟的方式执行一些操作,将工作延迟到以后的操作中。例如:合并堆可以将两个树列表连接起来就可以简单的完成,降低key的操作有时从父节点中切...翻译 2020-02-22 10:42:05 · 1128 阅读 · 0 评论 -
Floyd-Warshall、Dijkstra、Bellman–Ford、SPFA
最短路径算法Floyd-Warshall(弗洛伊德算法)弗洛伊德算法的原理是动态规划,用于计算两点之间的最短路径。该算法的优点在于极其简单,代码仅几行。缺点是时间复杂度高O(n3),空间复杂度Ω(n2)算法描述算法用于比较图结构中两个顶点间所有可能的路径。点集合设为V(1…k),求点i,点j中间经过k的最短距离D(i,j,k)最短路径经过点k。D(i,j,k)=D(i,k,k-1)+D...原创 2020-02-15 12:23:43 · 541 阅读 · 0 评论 -
排序算法之冒泡-快速-计数-桶-基数-堆Java版
冒泡排序package org.gallant.algorithm;import static org.gallant.algorithm.SortUtil.println;import java.util.ArrayList;import java.util.List;import java.util.Random;/** * @author 会灰翔的灰机 * @date ...原创 2020-01-25 11:38:10 · 626 阅读 · 0 评论 -
JDT之抽象语法树
问题描述公司业务迭代通过开关进行风险规避,在开关打开时走新业务逻辑,关闭时走老业务逻辑。这导致有大量的开关代码遗留,每次人工清理开关容易遗漏出错。为了减少出错概率,将清理开关动作进行自动化解决方案使用JDT工具解析java源码代码进行针对开关的语义自动替换清理JDT使用引入依赖<dependency> <groupId>org.eclipse.jdt<...原创 2019-10-20 20:24:14 · 1105 阅读 · 2 评论 -
分布式唯一ID
实现分布式唯一ID采用Twitter公司开源的雪花算法由左至右的位含义1位保留未使用41位为毫秒级时间(41位的长度可以使用69年左右)5位datacenterId和5位workerId(10位的长度最多支持部署1024个节点)12位是毫秒内的计数(12位的计数顺序号支持每个节点每毫秒产生4096个ID序号)snowflake生成的ID整体上按照时间自增排序,并且整个分布式系统...原创 2019-09-16 17:17:11 · 272 阅读 · 0 评论 -
小论分布式一致性算法
互联网时代里面讨论最多的便是分布式服务,而每一个分布式服务必然有一个分布式锁解决并发问题。分布式锁则就像是一个文件锁,例如:在单机服务中我想要写一个文件就要对其加锁,简单的应用级别的实现(当然linux系统有文件锁的支持)则是写之前获取一把锁,比如fileName.lock,创建一个锁文件,声明当前文件被锁定。写完之后释放锁则删除该文件。分布式系统中也同样需要类似的机制实现。如果分布式中每个节点服...原创 2019-06-30 23:09:38 · 239 阅读 · 1 评论 -
数据结构与算法分析 java语言描述-树
磁盘与CPU访问成本分析CPU:1台500-MIPS(500MHz)的机器,即可能每秒执行50010001000=5亿条指令。磁盘:7200RPM的磁盘,即每分钟7200转;因此1转=60/7200=1/120秒,或即8.3毫秒。磁盘访问时间分为三部分:寻道时间,也称寻找时间:磁头移动到指定磁道需要的时间延迟时间:磁头定位到某一磁道的扇区所需要的时间传输时间:从磁盘读出或者写入经历的时...原创 2019-04-14 23:25:45 · 309 阅读 · 0 评论 -
排序算法之插入-希尔-归并Java版
Java基础排序算法public class Sorts { /** * 插入排序 * @param array : */ private static void insertSort(int[] array) { println(Ints.asList(array)); for (int i=1;i&lt;arra...原创 2019-01-25 15:01:38 · 305 阅读 · 0 评论 -
Java动态规划算法解决LCS问题
Java动态规划算法解决LCS问题最近项目中遇到LCS问题,于是研究了下,写了一个简单的实现public class LongestCommonSubsequence { /** * 获得所有子结构的LCS长度,并存储LCS路线供getLCS方法使用,用来判断LCS的下一个子结果集 * @param text1 : * @param text2 : ...原创 2019-01-25 15:01:05 · 947 阅读 · 0 评论 -
JUC之AbstractQueuedSynchronizer
CLH锁AQS是CLH锁的变形实现,首先我们先了解下CLH锁CLH锁,是根据作者的名字简称命名,优点:无饥饿,先到先服务的公平性,下面的实现代码是最简单的一种实现方式。可以看到实现方式是一种链式结构并不是一个真正存在的队列在维护节点/** * @author 会灰翔的灰机 * @date 2019/8/6 */public class CLHLock { public sta...原创 2019-08-31 09:59:37 · 325 阅读 · 0 评论 -
CLH锁与MCS锁
Ticket锁(传送门)的缺点在于扩展性,cpu不断增加扩展时,对于共享变量(当前叫号叫到了几号)的访问会成为系统的瓶颈,共享变量递增导致大量的线程本地缓存被置为无效,需要通过内存总线访问主存刷新本地缓存,会造成拥塞。而CLH锁与MCS锁正式为了解决此瓶颈而衍生的算法。下面我来看一下他们的实现以及对比。CLH锁定义CLH锁是一个可扩展,高性能,公平的基于链表的自旋锁,应用线程仅自旋在本地变量...原创 2019-10-06 07:59:37 · 588 阅读 · 0 评论 -
TicketLock
票锁比较直白,可以称为号码锁,叫号锁。是一种自旋锁,之前讲过CLH锁(传送门)也是一种自旋锁。TicketLock定义ticket lock就像是平时使用美味不用等一样,自己先通过公众号排队取号,然后不断的会刷新(自旋)当前叫到了第几号,如果叫到自己的号,就说明可以获取锁去吃饭啦。TicketLock锁流程假设饭店只有一个位子初始时位子是空的,叫号0第一位顾客取号,取号0匹配号成功...原创 2019-09-15 14:44:23 · 1508 阅读 · 2 评论