《算法设计与分析基础》笔记3
第八章 动态规划
计算二项式系数: C(n,k) = C(n-1, k-1) + C(n-1, k)。边界C(n,0) = C(n,n) = 1
Warshall算法:计算有向图的传递闭包,也就是任意两个顶点之间是否可达。R(i,j,k)表示i和j之间是否连通,其中中间节点在集合{1,2,...k}里面
那么R(i,j,k) = R(i,j,k-1) || (R(i,k,k-1) && R(k,j,k-1))
Floyd算法:计算每对顶点之间的最短路径。思路同上,只不过把布尔值换成最短距离而已。
最优二叉查找树:给定每个key出现的概率,构造一棵二叉查找树,使得平均比较次数最少。假设键值从小到大为a1,a2,...an, 对应的概率分别为p1,p1,...pn。令C[i,j]表示由节点i到j构成的子树中的最少查找次数,那么树根k一定在i,i+1,...j中,并且两棵子树都是最优的。
可以推知 C[i,j] = min { C[i, k-1] + C[k+1, j] } + Σp[i,...j]
背包问题:物品重w1,w2,...wn, 价值v1,v2,...vn, 背包承重W。令V[i,w]为前i个物品中,总重量不超过w的物品集的最大价值。这个物品集要么不包括i,要么包括i。
那么V[i,w] = max{ V[i-1, w], vi+V[i-1, w-wi] }
如果 w - wi < 0,那么就只有V[i, w] = V[i-1, w]
时间和空间效率都是O(nW)……
计算二项式系数: C(n,k) = C(n-1, k-1) + C(n-1, k)。边界C(n,0) = C(n,n) = 1
Warshall算法:计算有向图的传递闭包,也就是任意两个顶点之间是否可达。R(i,j,k)表示i和j之间是否连通,其中中间节点在集合{1,2,...k}里面
那么R(i,j,k) = R(i,j,k-1) || (R(i,k,k-1) && R(k,j,k-1))
Floyd算法:计算每对顶点之间的最短路径。思路同上,只不过把布尔值换成最短距离而已。
最优二叉查找树:给定每个key出现的概率,构造一棵二叉查找树,使得平均比较次数最少。假设键值从小到大为a1,a2,...an, 对应的概率分别为p1,p1,...pn。令C[i,j]表示由节点i到j构成的子树中的最少查找次数,那么树根k一定在i,i+1,...j中,并且两棵子树都是最优的。
可以推知 C[i,j] = min { C[i, k-1] + C[k+1, j] } + Σp[i,...j]
背包问题:物品重w1,w2,...wn, 价值v1,v2,...vn, 背包承重W。令V[i,w]为前i个物品中,总重量不超过w的物品集的最大价值。这个物品集要么不包括i,要么包括i。
那么V[i,w] = max{ V[i-1, w], vi+V[i-1, w-wi] }
如果 w - wi < 0,那么就只有V[i, w] = V[i-1, w]
时间和空间效率都是O(nW)……
浙公网安备 33010602011771号