
algorithm
文章平均质量分 67
动态一时爽,重构火葬场
这个作者很懒,什么都没留下…
展开
-
Redis 实现延迟队列的方案
在分布式系统中,延迟队列是一种常见的需求,例如订单超时取消、任务定时执行等。Redis 作为高性能的内存数据库,提供了多种实现延迟队列的方案。本文将介绍几种不同的 Redis 方案,并分析其优缺点及适用场景。原创 2025-03-04 23:34:51 · 514 阅读 · 0 评论 -
流式抽样唯一元素方案设计
根据不同的应用场景和需求,可以选择不同的流式抽样方案。如果需要高效且简单的实现,可以考虑确定性哈希抽样或布隆过滤器方案;如果对数据量和性能有更高要求,Redis HyperLogLog和分层采样则是更合适的选择;对于需要时间维度分析的场景,可以使用时间窗口 + 一致性哈希方案。原创 2025-02-27 23:19:53 · 858 阅读 · 0 评论 -
啥是滚动哈希?
滚动哈希(Rolling Hash)是一种,允许在时间内计算的哈希值,而不需要重新遍历整个子串。它常用于字符串匹配、子串查找等问题,比如就是基于滚动哈希的。在说滚动哈希方法之前,先谈谈一般窗口内哈希值是如何计算的例如对于字符串hello,那么哈希值是hashCodehelloh−a∗pow1310e−a∗pow1311l−a∗pow1312l−a∗pow1313o−a∗pow1314。原创 2025-02-20 23:35:02 · 653 阅读 · 0 评论 -
高并发读多写少场景下的高效键查询与顺序统计的方案思路
之前在某平台看到一篇有意思的场景——对于高并发读多写少场景下,如何进行高效键查询与统计早于其创建时间且没有被删除的数量(只需要先入先出,不需要从中间删元素)传统的数据库索引或简单的哈希存储难以同时满足这两个需求,尤其是在高并发环境下,如何在不影响查询效率的前提下维持顺序统计成为关键挑战。原创 2025-02-09 23:36:18 · 517 阅读 · 0 评论 -
KMP算法理解
之所以储存下一个的原因在于,在进行匹配时,模式串要跳到上一个匹配成功的位置,而字符串本身不会移动,那么在这种情况下,当前字符串要匹配的就是已经匹配成功字符的下一个位置。比如对于字符串"abab",其前缀有a、ab、aba,后缀有b、ab、bab,显然最长公共前后缀就是ab。next[i]储存了在以i为开头的后缀,和以j为结尾的前缀匹配时,j的下一个位置。正如next名字所暗示的,下一个,而不是匹配的j本身。在获取到next数组之后,就直接获取到了如果不匹配情况下,模式串该如何走。原创 2024-03-26 18:13:29 · 294 阅读 · 0 评论 -
如何实时计算数据流中位数
创建一个最小堆和最大堆,其中最小堆的最小值比最大堆的最大值还大,并使最小堆最大堆数量保持均衡,那么中位数边取乎于最小最大堆堆顶。最容易想到的思路就是直接将所有数据进行排序,然后取排序之后的中位数。不过具体的排序思路也有几种。原创 2024-03-18 11:42:44 · 493 阅读 · 0 评论 -
文档协作技术——Operational Transformations简单了解
OT是支持协作软件系统的一种广泛使用的技术。OT通常使用副本文档储存,每个客户端都拥有对文档的副本。客户端在本地副本以无锁非堵塞方式操作,并将改变传递到其他客户端。当客户端收到其他客户端传播的改变之后,通过转换应用更改,从而保证一致性初始文档为"abc",并存在客户端A、BA发起操作O1=insert[0, “x”],在位置0插入字符xB发起操作O2=delete[2, “c”],在位置2删除字符c。原创 2024-02-07 15:09:46 · 1183 阅读 · 1 评论 -
algo-桶排序
桶排序是一种分布排序,将元素数组分到多个桶内,然后每个桶再分别进行排序。其计算复杂度取决于对桶内排序所用算法、使用桶数量以及输入均匀度。主要流程如下。原创 2024-02-04 18:05:04 · 972 阅读 · 0 评论 -
algo-水塘抽样
水塘抽样是一组随机算法,通过替换k个样本,从未知大小的n个总体中选择随机样本。原创 2024-02-01 16:29:30 · 878 阅读 · 0 评论 -
什么是线段树?
线段树是用于储存区间信息的数据结构。线段树将区间划分为左右子区间进行递归求解,便形成了树形结构。并通过合并两区间信息从而取得任意区间信息例如对于数组a={10, 11, 12, 13, 14},那么就可以构建以下线段树。原创 2024-01-23 19:10:21 · 513 阅读 · 0 评论 -
基数排序简单了解
基数排序是根据数字每一位从低到高去进行分类排序的比如对于数组[1, 11, 2, 12],从个位数开始,1和11分到了桶1,2和12分到了桶二,接着十位数,1和2分到了一桶,但由于在上一次分桶中,2在1之后,所以这个顺序仍然会保留,11和12也是一样,因此最后得到正确的有序数组[1, 2, 11, 12]原创 2023-12-06 15:05:05 · 169 阅读 · 0 评论 -
algo-多数排序
多数排序在leetcode只是一个简单题,但是衍生出来的多种解法却非常有意思首先是最容易想到的hash和排序算法,接着是。原创 2023-12-06 14:21:09 · 165 阅读 · 0 评论 -
algo-H指数2
如果引用数为x,所在位置为i,那么至少有n-i个引用数不小于x。那么如果x不小于n-i,则意味着有可能取得更大的hIndex,最小符合h指数的边界应该向左移动。原创 2023-12-05 10:25:32 · 150 阅读 · 0 评论 -
数据库相关算法题 V3
更好的办法,已知期望配送日期一定不早于下单日期,那么只要用户的首单日期与最小的期望配送日期相等,那么这个首单就是即时订单。那么只需要对count()、sum()做些小小改变,count()会忽略null,那么如果都是null,返回值也就是0了;sum()如果都是null,才会返回null,那么只要在无值的时候返回0就可以了。我最初的方案原本如下,就是根据国家区域和月份分组聚合,但是忽略了在没有匹配数据的情况下sum()、count()会返回null。此外也可以根据month、group分组。原创 2023-12-03 23:35:45 · 167 阅读 · 0 评论 -
数据库相关算法题 V2
为了解决这点我们可以用上聚合函数min()去做到,如果不用的话,将会导致取到顺序的第一个登陆日期,而不是我们期待的第一次登陆日期,本题关键在于如何判断数字是连续出现的,诀窍在于采用三表连接,表a、b、c的id分别是连续的,并且num相等。两个条件就是两个子查询,我们只需要在子查询中找到所有满足条件的数据就可以了。与方法1思想类似,也是统计大于等于分数的个数,只不过是采用同表连接。在本题中,如何在group中取第一次登陆日期将是难点所在。以大于本分数的数量作为rank。如何输出相应的rank?原创 2023-12-03 10:13:30 · 168 阅读 · 0 评论 -
数据库相关算法题 V1
超过经理收入的员工显然是要将同一张表,作为经理和员工表连接。这里存在两种方法,一种是采用WHERE。居然不能select后update,还要通过一个中间表去解决。本题的关键在于多表连接,三表之间的连接与两表是一致的。对于前者直接采用distinct关键字,而后者可以。本题的关键点在于过滤掉重复的以及null的处理。最先想到的方法是找到所有订购过的,然后排除。另一种巧妙的方法是左连接筛选。另一种是使用JOIN。原创 2023-12-02 16:29:48 · 190 阅读 · 0 评论 -
innodb buffer pool
buffer pool是主存中的一个区域,InnoDB 在访问时缓存表和索引数据。缓冲池允许直接从内存访问频繁使用的数据,这加快了处理速度。在专用服务器上,高达80% 的物理内存通常分配给缓冲池。为了提高大容量读取操作的效率,将缓冲池划分为可能包含多行的页。为了提高缓存管理的效率,缓冲池被实现为页链表;使用最近使用次数最少(LRU)算法的一个变体,很少使用的数据被老化到缓存之外。原创 2023-08-10 16:23:00 · 219 阅读 · 0 评论 -
LRU数据结构
LRU缓存是非常经典的数据结构设计,本文重点在于设计出get、put方法时间复杂度都为O(1)的LRU缓存LRU缓存特征是当超出容量时会将最近最少使用的元素逐出。原创 2023-07-08 17:10:17 · 574 阅读 · 0 评论 -
H2O生成——屏障
H2O生成是只有同时存在且仅存在的情况下两个氢原子和一个氧原子,才能生成下一个氢原子或者氧原子,如此循环往复。原创 2023-04-28 23:12:32 · 959 阅读 · 0 评论 -
前缀树——以Gin路由为例
前缀树是父节点是子节点前缀的N叉树。其主要性质是在gin中也存在着非常巧妙运用前缀树进行路由匹配的结构,本文将以gin路由为例学习一下前缀树本文代码皆是参考gin@v1.7.4版本源码所构建的更适合理解改造版,并且省略了诸如标记是否是通配符的node wildChild等属性和方法。原创 2023-04-11 12:39:05 · 802 阅读 · 0 评论 -
LZ77压缩算法
读取前向缓冲区数据在搜索缓冲区进行匹配若匹配到,则编码相同字符序列到当前字符偏移量以及长度若未匹配到则直接放入原数据原创 2023-03-09 16:22:39 · 273 阅读 · 0 评论 -
Raft 算法简单了解
raft是一种旨在替代Paxos系列的共识算法,比Paxos更加容易理解Raft不是拜占庭式的容错算法:节点信任选出的领导者raft通过选举的leader实现共识。在raft集群的服务器要么是leader要么是follower,并且follower能在leader不可用时竞选leaderleader负责将日志复制到follower,并通过发送持续的心跳告知follower自身的存在。当一个follow没在规定的时间收到leader的心跳,该leader便会开始参与竞选。原创 2023-02-21 16:52:21 · 185 阅读 · 0 评论 -
如何解决哲学家就餐可能产生的死锁问题呢?
哲学家就餐是很经典的并发问题,问题描述如下五位哲学家在同一张桌子旁吃饭。每个哲学家在餐桌上都有自己的位置。每个盘子之间都有一把叉子。这道菜是一种意大利面,必须用两把叉子吃。每个哲学家只能思考或者吃。此外,哲学家只有在有左右叉子的时候才能吃意大利面。因此,只有当离他们最近的两个邻居在思考而不是吃饭时,他们才会有两把叉子。哲学家吃完饭后,会把叉子都放下。问题是如何设计一种方案(一种并行算法),使哲学家不会挨饿;原创 2023-02-21 14:22:35 · 587 阅读 · 0 评论 -
leetcode 单词拆分
题目描述给定一个非空字符串 s 和一个包含非空单词的列表 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。说明:拆分时可以重复使用字典中的单词。你可以假设字典中没有重复的单词。示例 1:输入: s = “leetcode”, wordDict = [“leet”, “code”]输出: true解释: 返回 true 因为 “leetcode” 可以被拆分成 “leet code”。示例 2:输入: s = “applepenapple”, wordDict原创 2021-07-12 16:12:28 · 789 阅读 · 0 评论