Redis 从入门到入土⑥:分片
分片位置:
- 客户端分片:客户端使用一致性哈希等算法决定键应当分布到哪个节点
- 代理分片:将客户端请求发送到代理上,由代理转发请求到正确的节点上
- 服务器分片:Redis Cluster
Redis 从入门到入土④:持久化
Redis 是内存型数据库,为了保证数据在断电后不会丢失,需要将内存中的数据持久化到硬盘上。
Redis 从入门到入土⑤:事务与事件
Redis 从入门到入土③:过期策略与数据淘汰
对 1e9 + 7 取模
为什么取模
OJ 上很多题目因为难度原因需要非常大的测试数据量(数据量大了自然会对算法的时间复杂度要求更高),而大数据量往往会导致溢出,虽然可以用 BigInt 等方式做题,但这就失去了这道题的原本意义。
这种情况题目会要求计算结果对 1e9 + 7 取模,因为对取模不会影响算法的正确性,既避免了高精度运算,又能保证极少的冲突情况。
这里可以先回顾下模除运算的等价性
1 | (a + b) % p = (a % p + b % p) % p |
由上述各个公式可知只要每次运算后觉得结果过大都可以对其进行取模,只要避免数据溢出,那么最终结果都是一样的。例如:
1 | int MOD = (int) 1e9 + 7; |
只要 sum 不溢出,那么其结果和对每次运算结果都 %MOD
一遍是一样的。
所以 取模成了简化大数据的一种约定,服务端给定算法取模后的测试数据,我们写算法时也进行取模,那么依然能验证算法的正确性。
891. 子序列宽度之和
一个序列的 宽度 定义为该序列中最大元素和最小元素的差值。
给你一个整数数组 nums
,返回 nums
的所有非空 子序列 的 宽度之和 。由于答案可能非常大,请返回对 1e9 + 7
取余 后的结果。
子序列 定义为从一个数组里删除一些(或者不删除)元素,但不改变剩下元素的顺序得到的数组。例如,[3,6,2,7]
就是数组 [0,3,1,6,2,2,7]
的一个子序列。
792. 匹配子序列的单词数
给定字符串 s
和字符串数组 words
, 返回 words[i]
中是 s
的子序列的单词个数 。
字符串的 子序列 是从原始字符串中生成的新字符串,可以从中删去一些字符 (可以是 none),而不改变其余字符的相对顺序。
- 例如,
“ace”
是“abcde”
的子序列。
764. 最大加号标志
在一个 n x n
的矩阵 grid
中,除了在数组 mines
中给出的元素为 0
,其他每个元素都为 1
。mines[i] = [xi, yi]
表示 grid[xi][yi] == 0
返回 grid
中包含 1
的最大的 轴对齐 加号标志的阶数 。如果未找到加号标志,则返回 0
。
一个 k
阶由 1
组成的 “轴对称” 加号标志 具有中心网格 grid[r][c] == 1
,以及 4 个从中心向上、向下、向左、向右延伸,长度为 k-1
,由 1
组成的臂。注意,只有加号标志的所有网格要求为 1 ,别的网格可能为 0
也可能为 1
。