算法重拾之路——凸多边形最优三角剖分
2014-12-22 11:20
302 查看
***************************************转载请注明出处:http://blog.csdn.net/lttree********************************************
第二章:动态规划
>凸多边形最优三角剖分<
算法描述:
▪ 多边形: 平面上一条分段线性闭曲线。即 一系列首尾相接的直线段所组成的。
▪ 通常用多边形顶点的逆时针序列表示 凸多边形,即 P = { v0,v1,...,vn-1 } 表示具有n条边,v0,v1,...,vn,其中,约定 v0 = vn。
▪ 若 vi与vj 是多边形上不相邻的两个顶点,则线段vivj称为多边形的一条弦。且弦vivj将多边形分割成两个不同的三角剖分。
▪ 凸多边形最优三角剖分问题:给定凸多边形 P
= { v0,v1,...,vn-1 },以及定义在由凸多边形的边和弦组成的三角形上的权函数w。要求确定该凸多边形的三角剖分,使得该三角剖分所对应的权,即三角剖分中诸三角形上权之和为最小。
算法分析:
▪ 定义三角形上各种各样的权函数w。例如:w(vi,vj,vk)= |vivj| + |vjvk| + |vkvi|,其中,|vivj|是点vi到vj的欧氏距离(定义可看最下面的注解①)。相应于此权函数的最优三角剖分即为最小弦长三角剖分。
▪ 最优子结构性质: 若凸(n+1)边型
P = { v0,v1,...,vn-1 } 的最优三角剖分T包含三角形 v0vkvn,1≤k≤n-1,则T的权为三个部分权的和:三角形v0vkvn的权,子多边形{ v0,v1,...,vk } 和 { vk+1,vk+2,...,vn }的权之和。
可以断言,由T所确定的这两个子多边形的三角剖分也是最优的。因为若有
{ v0,v1,...,vk } 或 {vk,vk+1,...,vn }的更小权的三角剖分将导致T不是最优三角剖分的矛盾。
▪ 递归结构:设t[i][j],1≤i<j≤n为凸多边形{ vi-1,vi,...,vj } 的最优三角剖分所对应的权值函数值,即其最优值。最优剖分包含三角形vi-1vkvj的权,子多边形{vi-1,vi,...,vk}的权,子多边形{vk,vk+1,...,vj}的权之和。
因此,可得递归式为:
同矩阵连乘问题算法相似,此算法时间复杂度为O(n^3) 空间复杂度为O(n^2)
算法程序:
<span style="font-family:Comic Sans MS;font-size:14px;">//凸多边形的权
int weight[]
= {{0,2,2,3,1,4},{2,0,1,5,2,3},{2,1,0,2,1,4},{3,5,2,0,6,2},{1,2,1,6,0,1},{4,3,4,2,1,0}};
// 权函数
int w(int a,int b,int c)
{
return weight[a][b] + weight[b][c] + weight[a][c];
}
int MinWeightTriangulation( int n , int** t , int** s )
{
// 初始化表格
for( int i = 1 ; i <= n ; ++i )
t[i][i] = 0;
//r为当前计算的链长(子问题规模)
for( int r = 2 ; r <= n ; ++r ) {
//n-r+1为最后一个r链的前边界
for( int i = 1 ; i <= n-r+1 ; ++i ) {
//计算前边界为r,链长为r的链的后边界
int j = i+r-1;
//将链ij划分为A(i) * ( A[i+1:j] )这里实际上就是k=i
t[i][j] = t[i+1][j] + w(i-1,i,j);
s[i][j] = i;
for( int k = i+1 ; k < i+r-1 ; ++k ) {
//将链ij划分为( A[i:k] )* (A[k+1:j])
int u = t[i][k]+t[k+1][j]+w(i-1,k,j);
if( u < t[i][j] ) {
t[i][j] = u;
s[i][j] = k;
}
}
}
}
return t[1][N-2];
}
// 构造最优解
void Traceback(int i,int j,int **s)
{
if(i==j) return;
Traceback(i,s[i][j],s);
Traceback(s[i][j]+1,j,s);
cout<<"V"<<i-1<<",V"<<j<<",V"<<s[i][j]<<endl;
}</span>
相关注解:
①欧氏距离:即 欧几里得度量(euclidean metric),是一个通常采用的距离定义,指在m维空间中,两个点的真实距离。比如在二维空间,点A(x1,y1) 和 点B(x2,y2)的欧氏距离为: d=sqrt( (x1-x2)^2 + (y1-y2)^2
); 扩展到三维空间即为: d=sqrt( (x1-x2)^2 + (y1-y2)^2 + (z1-z2)^2 ) 。由此可继续推出m维空间的欧氏距离。
②图片来源:风仲达
***************************************转载请注明出处:http://blog.csdn.net/lttree********************************************
第二章:动态规划
>凸多边形最优三角剖分<
算法描述:
▪ 多边形: 平面上一条分段线性闭曲线。即 一系列首尾相接的直线段所组成的。
▪ 通常用多边形顶点的逆时针序列表示 凸多边形,即 P = { v0,v1,...,vn-1 } 表示具有n条边,v0,v1,...,vn,其中,约定 v0 = vn。
▪ 若 vi与vj 是多边形上不相邻的两个顶点,则线段vivj称为多边形的一条弦。且弦vivj将多边形分割成两个不同的三角剖分。
▪ 凸多边形最优三角剖分问题:给定凸多边形 P
= { v0,v1,...,vn-1 },以及定义在由凸多边形的边和弦组成的三角形上的权函数w。要求确定该凸多边形的三角剖分,使得该三角剖分所对应的权,即三角剖分中诸三角形上权之和为最小。
算法分析:
▪ 定义三角形上各种各样的权函数w。例如:w(vi,vj,vk)= |vivj| + |vjvk| + |vkvi|,其中,|vivj|是点vi到vj的欧氏距离(定义可看最下面的注解①)。相应于此权函数的最优三角剖分即为最小弦长三角剖分。
▪ 最优子结构性质: 若凸(n+1)边型
P = { v0,v1,...,vn-1 } 的最优三角剖分T包含三角形 v0vkvn,1≤k≤n-1,则T的权为三个部分权的和:三角形v0vkvn的权,子多边形{ v0,v1,...,vk } 和 { vk+1,vk+2,...,vn }的权之和。
可以断言,由T所确定的这两个子多边形的三角剖分也是最优的。因为若有
{ v0,v1,...,vk } 或 {vk,vk+1,...,vn }的更小权的三角剖分将导致T不是最优三角剖分的矛盾。
▪ 递归结构:设t[i][j],1≤i<j≤n为凸多边形{ vi-1,vi,...,vj } 的最优三角剖分所对应的权值函数值,即其最优值。最优剖分包含三角形vi-1vkvj的权,子多边形{vi-1,vi,...,vk}的权,子多边形{vk,vk+1,...,vj}的权之和。
因此,可得递归式为:
同矩阵连乘问题算法相似,此算法时间复杂度为O(n^3) 空间复杂度为O(n^2)
算法程序:
<span style="font-family:Comic Sans MS;font-size:14px;">//凸多边形的权
int weight[]
= {{0,2,2,3,1,4},{2,0,1,5,2,3},{2,1,0,2,1,4},{3,5,2,0,6,2},{1,2,1,6,0,1},{4,3,4,2,1,0}};
// 权函数
int w(int a,int b,int c)
{
return weight[a][b] + weight[b][c] + weight[a][c];
}
int MinWeightTriangulation( int n , int** t , int** s )
{
// 初始化表格
for( int i = 1 ; i <= n ; ++i )
t[i][i] = 0;
//r为当前计算的链长(子问题规模)
for( int r = 2 ; r <= n ; ++r ) {
//n-r+1为最后一个r链的前边界
for( int i = 1 ; i <= n-r+1 ; ++i ) {
//计算前边界为r,链长为r的链的后边界
int j = i+r-1;
//将链ij划分为A(i) * ( A[i+1:j] )这里实际上就是k=i
t[i][j] = t[i+1][j] + w(i-1,i,j);
s[i][j] = i;
for( int k = i+1 ; k < i+r-1 ; ++k ) {
//将链ij划分为( A[i:k] )* (A[k+1:j])
int u = t[i][k]+t[k+1][j]+w(i-1,k,j);
if( u < t[i][j] ) {
t[i][j] = u;
s[i][j] = k;
}
}
}
}
return t[1][N-2];
}
// 构造最优解
void Traceback(int i,int j,int **s)
{
if(i==j) return;
Traceback(i,s[i][j],s);
Traceback(s[i][j]+1,j,s);
cout<<"V"<<i-1<<",V"<<j<<",V"<<s[i][j]<<endl;
}</span>
相关注解:
①欧氏距离:即 欧几里得度量(euclidean metric),是一个通常采用的距离定义,指在m维空间中,两个点的真实距离。比如在二维空间,点A(x1,y1) 和 点B(x2,y2)的欧氏距离为: d=sqrt( (x1-x2)^2 + (y1-y2)^2
); 扩展到三维空间即为: d=sqrt( (x1-x2)^2 + (y1-y2)^2 + (z1-z2)^2 ) 。由此可继续推出m维空间的欧氏距离。
②图片来源:风仲达
***************************************转载请注明出处:http://blog.csdn.net/lttree********************************************
相关文章推荐
- 凸多边形最优三角剖分的两种算法分析
- SMU 1106 - 凸多边形的最优三角剖分问题(区间DP)
- 凸多边形的最优三角剖分问题
- 凸多边形最优三角剖分
- 凸多边形最优三角剖分
- 算法竞赛入门经典 例题 9-7 最优三角剖分
- 凸多边形的最优三角剖分
- 动态规划---凸多边形的最优三角剖分问题
- 算法笔记——【动态规划】凸多边形最优三角剖分
- 算法之路四:codeforces 4A
- 路网最优路径算法之一单向和双向搜索
- 我的算法学习之路
- 算法优化:rgb向yuv的转化最优算法,快得让你吃惊!
- 我的算法学习之路
- 凸边形最优三角剖分
- 算法优化:rgb向yuv的转化最优算法,快得让你吃惊(转)
- poj 2195 最优匹配算法的优化
- 【算法导论】动态规划之“最优二叉搜索树”
- 设计一个最优算法来查找n个元素数组中的最大值和最小值
- (转)我的算法学习之路