
数据结构
文章平均质量分 87
太阳伞下的阿呆
愿天下的每个阿呆都能拥有一个可以依靠的太阳伞
展开
-
并查集应用
并查集简单回顾下并查集概念的几个概念初始化,makeSet,为每个元素构建一个集合find,查找集合根节点union,合并集合详情任意门:https://blog.youkuaiyun.com/u010597819/article/details/104600289并查集的应用场景判断两个集合是否存在交集最小生成树应用岛屿数量题目给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直原创 2021-08-22 19:23:41 · 235 阅读 · 0 评论 -
二叉树四种遍历方式
二叉树四种遍历方式,前中后序遍历按照根节点的访问顺序命名前序遍历:根节点-》左子树-》右子树中序遍历:左子树-》根节点-》右子树后序遍历:左子树-》右子树-》根节点平行序遍历源码地址:https://github.com/GallantKong/tree.git案例数据 /** * 案例数据: * 15 * / \ * 10 20 * / \ / \原创 2021-07-25 15:15:29 · 143 阅读 · 0 评论 -
图说PriorityQueue
写offeroffer递增当前队列更改次数modCount是否超过队列长度,如果是则扩容:如果原长度小于64则每次扩容2,否则每次扩容50%递增size如果是第一个元素直接放在队列(其实是一个Object数组)0下标处添加数据siftUp,如果存在comparator则使用自定义的比较器比较,否则使用元素实现的Comparable接口的比较方法进行比较。暂定使用默认的:siftUpComparable重建二分最小堆siftUpComparable优先级队列底层结构是二分最小堆,按照顺序原创 2020-06-21 14:55:26 · 208 阅读 · 0 评论 -
分配内核内存(buddy系统和slab系统)(3)
目录内存管理中的分区分配方法(1)伙伴系统(算法)-内存分配技术(2)分配内核内存(buddy系统和slab系统)(3)管理内核进程空闲内存的两种策略:1. 伙伴系统 –伙伴分配系统是一种算法,它把一个大的内存块切分为一个小的部分来满足请求。该算法通常给出最符合的内存块。块的两个更小的子部分是相同大小的,称为伙伴。两个伙伴中的一个以同样的方式进一步切分为更小的子部分,直到请求被满足为止。该技术的好处是两个伙伴可以根据内存请求合并形成一个大尺寸的块。例如 – 如果发出一个需求25Kb的请求翻译 2020-05-10 08:20:50 · 994 阅读 · 0 评论 -
FreeBSD的一个可扩展的并发malloc(3)实现
Jason Evans jasone@FreeBSD.orgApril 16, 2006摘要FreeBSD项目从版本5开始就致力为为多处理器计算系统持续提供可扩展支持。已经取得了足够足够的进展,C类库的malloc(3)内存分配器是运行在多处理器系统的多线程应用的潜在瓶颈。在本文中,我们提供一个新的内存分配器,建立在现有技术的基础上,为应用提供一个可扩展的并发分配。基准测试表明该分配器,对多...翻译 2020-04-25 22:52:26 · 551 阅读 · 0 评论 -
Geohash
定义Geohash是将一个地理位置编译为一个数字与字母组成的短字符串算法逻辑例如:天安门附近经纬度:116.403694,39.911836。我们按照geohash将其转为长度5的geohash1. 经纬度按照二分法二分,经纬度如果属于二分后的左区间则取0,右区间则取1绿色背景表示纬度落在区间bit value 代表转为二进制的取值mean value 代表二分后选中区间(绿色背景...原创 2020-03-08 18:57:17 · 1671 阅读 · 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 评论 -
JDT-core学习
通过AST访问Java代码创建ASTParser解析Java代码为抽象语法树(ASTNode)结构继承ASTVisitor类,重写访问AST各个节点// 创建抽象语法书解析器,按照Java语言规范Java SE 11 Edition (JLS11)解析,// 支持操作所有jdk11版本的Java代码操作ASTParser astParser = ASTParser.newParser...原创 2019-11-17 16:39:45 · 1157 阅读 · 6 评论 -
JUC之StampedLock
使用案例案例取自jdk源码class Point { private double x, y; private final StampedLock sl = new StampedLock(); void move(double deltaX, double deltaY) { // an exclusively locked method long stamp ...原创 2019-10-27 22:54:01 · 352 阅读 · 0 评论 -
CLH锁与MCS锁
Ticket锁(传送门)的缺点在于扩展性,cpu不断增加扩展时,对于共享变量(当前叫号叫到了几号)的访问会成为系统的瓶颈,共享变量递增导致大量的线程本地缓存被置为无效,需要通过内存总线访问主存刷新本地缓存,会造成拥塞。而CLH锁与MCS锁正式为了解决此瓶颈而衍生的算法。下面我来看一下他们的实现以及对比。CLH锁定义CLH锁是一个可扩展,高性能,公平的基于链表的自旋锁,应用线程仅自旋在本地变量...原创 2019-10-06 07:59:37 · 588 阅读 · 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 评论 -
数据结构与算法分析 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 评论 -
分布式唯一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 评论 -
TicketLock
票锁比较直白,可以称为号码锁,叫号锁。是一种自旋锁,之前讲过CLH锁(传送门)也是一种自旋锁。TicketLock定义ticket lock就像是平时使用美味不用等一样,自己先通过公众号排队取号,然后不断的会刷新(自旋)当前叫到了第几号,如果叫到自己的号,就说明可以获取锁去吃饭啦。TicketLock锁流程假设饭店只有一个位子初始时位子是空的,叫号0第一位顾客取号,取号0匹配号成功...原创 2019-09-15 14:44:23 · 1508 阅读 · 2 评论 -
数据结构之图结构解最短路径
图结构邻接矩阵:可以理解为一个二维数组,即一个正方形的图。例如:动态规划解LCS最长公共子序列,实现代码见:https://blog.youkuaiyun.com/u010597819/article/details/86646297邻接表:将二维数组中的其中一维换成链表结构,即不定长度。主要用于非稠密(稀疏的)的图结构,减少资源浪费,案例取自《数据结构与算法分析 java语言描述》例如:假设一个城镇...原创 2019-07-27 12:33:26 · 295 阅读 · 0 评论 -
redis设计与实现之跳跃表
1. 跳跃表简介跳跃表(skiplist)是一个有序结构,它通过在每个节点中维持多个指向其他节点的指针,从而达到快速访问节点的目的跳跃表的平均查询时间复杂度为O(logN),最坏O(N)为什么选择跳跃表?大部分情况下性能与平衡树媲美实现比平衡树更为简单2. 跳跃表的实现Redis的跳跃表有两个结构定义节点结构为zskiplistNode跳跃表信息zskiplist:图5-1...原创 2019-02-21 14:46:01 · 294 阅读 · 0 评论