- 博客(70)
- 收藏
- 关注
原创 golang中实现LRU-K算法(附带单元测试)
LRU-K中的K代表最近使用的次数,因此LRU可以认为是LRU-1。LRU-K的主要目的是为了解决LRU算法“缓存污染”的问题,其核心思想是将“最近使用过1次”的判断标准扩展为“最近使用过K次”。相比LRU,LRU-K需要多维护一个队列,用于记录所有缓存数据被访问的历史。LRU-K具有LRU的优点,同时能够避免LRU的缺点,实际应用中LRU-2是综合各种因素后最优的选择,LRU-3或者更大的K值命中率会高,但适应性差,需要大量的数据访问才能将历史访问记录清除掉。将LRU算法升级为了LRU-K算法。
2024-07-19 17:36:58
606
3
原创 高级数据结构——树状数组
树状数组(inaryndexree,),是一种一般用来处理和操作类型的题目的数据结构,时间复杂度为O(log n)。对于普通数组来说,的时间复杂度是 O(1),但的时间复杂度是 O(n)。如果使用前缀和数组呢?区间求和的时间复杂度降低为O(1),但是单点修改又会变为O(n)。那么,我们能不能找到一种数组,中和两者的时间复杂度都不那么高?
2023-11-16 13:46:22
557
原创 置换环算法
思路:我们需要将每对情侣都放在一块,编号 0 和 1 的人对应情侣 0,编号 2 和 3 的人对应情侣 1... 即编号为row[i]对应的情侣编号为row[i]/2(c++向下取整)。所以,我们通过一次遍历,通过并查集找出共有多少个置换环,交换次数就等于数组个数-环的个数,即n - x 为所求答案。置换环思想:置换环是将每个元素指向其应在的位置,最终相连成一个环(若元素就在其应在的位置,则自身成环),因此可知元素的相互交换只会在该环内进行,所以可以得出每个环内所需的交换次数即为元素个数-1。
2023-11-11 16:40:43
731
2
原创 搜索——最短路模型,多源bfs
最短路模型,即求从起点到终点的最短路径,我们可以选择dijkstra,spfa等等,在这里我们可以利用宽搜(bfs)的特性来求,因为bfs是一层一层的向外扩展的,所以当我们第一次遍历到终点时,所在的层数即为起点到终点的最短路径。多源bfs,顾名思义,多个起点的bfs,与一般的bfs不同的地方在于根据题目要求,将多个起点在初始时全部加入队列即可,后续遍历和普通bfs没什么不同。它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。
2023-09-21 13:18:32
250
原创 搜索——flood fill
flood fill,即洪水泛滥,用来解决连通块问题,通过宽搜(bfs)找到某个点所在的连通块,用深搜(dfs)的话,在数据范围较大的时候可能存在爆桟的情况。农夫约翰有一片 N∗M 的矩形土地。最近,由于降雨的原因,部分土地被水淹没了。现在用一个字符矩阵来表示他的土地。每个单元格内,如果包含雨水,则用”W”表示,如果不含雨水,则用”.”表示。现在,约翰想知道他的土地中形成了多少片池塘。每组相连的积水单元格集合可以看作是一片池塘。
2023-09-19 13:06:58
146
原创 动态规划——状态机模型
什么是状态机模型?其实大部分dp问题都可以算是状态机,因为对于一个物品,例如01背包,无非是选与不选两种状态,这两种状态就构成了一个状态机。状态机就是一种用来描述对象或者系统在不同状态之间迁移的模型。那么状态机dp是什么?阿福是一名经验丰富的大盗。趁着月黑风高,阿福打算今晚洗劫一条街上的店铺。这条街上一共有 N 家店铺,每家店中都有一些现金。阿福事先调查得知,只有当他同时洗劫了两家相邻的店铺时,街上的报警系统才会启动,然后警察就会蜂拥而至。作为一向谨慎作案的大盗,阿福不愿意冒着被警察追捕的风险行窃。
2023-09-16 21:04:56
218
原创 动态规划——多重背包
多重背包是有N种物品和一个容量为V 的背包,第i种物品最多有Mi件可用,每件耗费的空间是Ci ,价值是Wi ,求解将哪些物品装入背包可使这些物品的耗费的空间 总和不超过背包容量,且价值总和最大。多重背包和01背包很像,将多重背包里的物品全部摊开就是01背包了。有 N 种物品和一个容量是 V 的背包。第 i 种物品最多有 si 件,每件体积是 vi,价值是 wi。求解将哪些物品装入背包,可使物品体积总和不超过背包容量,且价值总和最大。输出最大价值。
2023-09-16 13:24:27
132
原创 动态规划——完全背包
有了上一篇的学习,如果想要使物品能够被多次放入,我们只需要从小到大的去枚举背包容量即可,至于已经在上一篇阐述了,不会的可以去看看。而如果是先遍历容量的遍历顺序,在计算dp[6]时,枚举第0个硬币时会得到{5, 1},因为dp[6] += dp[6 - 1] ,而枚举第1个硬币又会得到{1, 5},所以可以发现先遍历容量得到的结果就是排列数。先看先遍历物品的遍历顺序,由于我们是按照物品的顺序来遍历的,只会先计算1,再计算5,因此得到的方法数量只有{1, 5}这种情况,即组合数。
2023-09-16 10:55:09
123
原创 动态规划——01背包
背包问题经典资料背包九讲,可以上网查一下相关资料。背包一共分为01背包,完全背包,多重背包,分组背包,和混合背包,下图来自代码随想录01背包是有n件物品和一个最多能背重量为w 的背包。且每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大。根据动态规划的一般步骤来解决一下并给出01背包的模板:1.确定dp数组以及下标的含义定义dp[i][j]。2.确定状态转移方程对于每个物品,只有放或者不放两种可能,所以可得出:不放:dp[i][j] = dp[i - 1][j]
2023-09-15 23:37:47
127
原创 动态规划——最长上升子序列模型
最长上升子序列模型类的题目,一般要求我们在一系列数中求出最长的上升或者下降(即反向的上升)子序列,一般时间复杂度为O(n^2),进一步的可以利用二分+贪心维护最长的上升子序列,时间复杂度为O(nlogn)。朴素做法一般为两层循环,第一层枚举 i 从1到n,第二层枚举 j 从1到 i ,每次枚举比较当前点 i 是否比前面的某个点 j 大,如果是则根据状态转移方程f[i] = max(f[i], f[j] + 1)更新最长上升子序列的个数或者和(将+1改为+w[i]),最后得出答案。
2023-09-14 13:56:56
85
原创 动态规划——数字三角形模型
首篇先了解一下什么是动态规划,动态规划(Dynamic Programming)俗称dp,是一种解决多阶段决策问题的优化方法。它通过将问题分解为多个重叠子问题,并利用子问题的解来构建原问题的解。动态规划算法通常用于具有重复子问题的优化问题。Hello Kitty想摘点花生送给她喜欢的米老鼠。她来到一片有网格状道路的矩形花生地(如下图),从西北角进去,东南角出来。地里每个道路的交叉点上都有种着一株花生苗,上面有若干颗花生,经过一株花生苗就能摘走该它上面所有的花生。
2023-09-12 21:24:22
398
原创 leetcode第352场周赛补题
思路:用multiset来维护滑动窗口,比赛中没想到,自己暴力+剪枝过不了最后几个。思路:线性筛质数预处理出n以内的质数,然后双指针模拟。思路:枚举,计算不平衡贡献值。
2023-07-04 16:45:31
296
原创 leetcode周赛补题 6.25
思路:枚举,将题目转化为求num1 - num2 * k 能否拆成k个2的i次方,其中__builtin_popcountll()是用来求该数字在二进制形式下1的个数的库函数。思路:划分的方式其实只能在两个1中间选择,我们将每两个1之间的距离求出来就可以得出可以划分的空,然后乘法。思路:dp,f[i, j, k]三维分别表示前i个字符串,首字母以及尾字母,意义是长度的最小值。思路:排序后用哈希+双指针,维护当前收到了信息的服务器的数量。思路:贪心,找规律推公式。第107场双周赛补题。原理累乘起来就是答案。
2023-06-27 13:31:26
496
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人