Algorithm
复习题—动态规划
- 509. 斐波那契数 这题思路比较直接,为了复习动态规划,使用迭代法+数组实现,dp[i] = fib(i), dp[i] = dp[i-1]+dp[i-2], base case: dp[0]=0,dp[1]=1;
- 322. 零钱兑换 这题是完全背包问题,由于需要计算凑成的最少硬币的个数,因此需要先对硬币按照币值从大到小的顺序排序,
dp[i][j]
表示只使用前i个硬币,将容量为j的背包装满所需要的最少硬币数。然后使用dp[i][j] = min(dp[i-1][j],dp[i][j-coins[i]]+1)
,进行状态的转换。base casedp[i][0] = 0, dp[0][i]=inf;
表示不可能。使用状态压缩,由于需要访问dp[i][j-coins[i]]
,因此需要从小到大遍历j
新题——动态规划
- 494. 目标和 (1)回溯解法:backtrack(nums,i,rest),i表示当前下标,rest表示当前目标值(可以看成是容量) 递归结束条件:i=nums.size(), if rest=0, res++ 做选择 如果是’+'号,则 rest-=nums[i], '-'号则 res+=nums[i] 回溯解法复杂度2^n,很高,可以通过备忘录来加速 (2) 动态规划解法:问题需要转化,假设A组都是+号,B组都是-号,那么sum(A)-sum(B)=target. sum(A)+sum(B)=sum(nums), 从而可得sum(A)=(target+sum(nums))/2. 问题变成了,有多少个子集使得其和为(target+sum(nums))/2。这就是典型的背包问题了. 假设dp[i][j] 表示前i个元素和为j的子集数。那么
dp[i][j] = dp[i-1][j] +dp[i-1][j-nums[i]]
. base case:dp[i][0]=1,dp[0][j]=0
状态压缩时,j从大到小遍历。注意如果target+sum(nums) 不能被2整除就无解。
Review
modern c++ nullptr、constexpr 即常量
PostgreSQL代价模型
PostgreSQL代价模型包含5个参数:
- seq_page_cost ( c s ) (c_s) (cs): 顺序扫描磁盘过程中,读一个page的代价
- random_page_cost ( c r ) (c_r) (cr):随机读磁盘过程中个,读一个page的代价
- cpu_tuple_cost ( c t ) (c_t) (ct):处理一个tuple的代价
- cpu_index_tuple_cost ( c i ) (c_i) (ci):在index scan过程中,处理一个index entry的代价
- cpu_operator_cost(c_o):执行一次操作的代价
对于一个算子,它的代价为:
C
o
=
n
s
∗
c
s
+
n
r
∗
c
r
+
n
t
∗
c
t
+
n
i
∗
c
i
+
n
o
∗
c
o
C_o = n_s*c_s+n_r*c_r+n_t*c_t+n_i*c_i+n_o*c_o
Co=ns∗cs+nr∗cr+nt∗ct+ni∗ci+no∗co
n
s
n_s
ns:顺序扫描磁盘的page数
n r n_r nr:随机扫描磁盘的page数
n t n_t nt:处理的tuple数量
n i n_i ni:索引扫描过程中index entry的数量
n o n_o no:操作执行的次数
Tips
- 缓存雪崩的应对方案:大量数据同时过期: 互斥锁、双key策略、后台更新缓存、均匀过滤时间
Redis宕机:服务熔断或者限流、主从备份可靠集群 - 缓存击穿的应对方案:互斥锁、后台更新缓存
- 缓存穿透的应对方案:限制非法请求、缓存空值或默认值、使用bloom filter加速数据端的判断
Share
这周太忙了,有点水