一、問題描述
多邊形是平面上一條分段線性的閉曲線。也就是說,多邊形是由一系列首尾相接的直線段組成的。組成多邊形的各直線段稱為該多邊形的邊。多邊形相接兩條邊的連接點稱為多邊形的頂點。若多邊形的邊之間除了連接頂點外沒有別的公共點,則稱該多邊形為簡單多邊形。
一個簡單多邊形將平面分為3個部分:被包圍在多邊形內的所有點構成了多邊形的內部;多邊形本身構成多邊形的邊界;而平面上其余的點構成了多邊形的外部。
這里給出凸多邊形的定義:
當一個簡單多邊形及其內部構成一個閉凸集時,稱該簡單多邊形為凸多邊形。也就是說凸多邊形邊界上或內部的任意兩點所連成的直線段上所有的點均在該凸多邊形的內部或邊界上。與凸多邊形對應的就是凹多邊形。
通常,用多邊形頂點的逆時針序列來表示一個凸多邊形,即P={v0 ,v1 ,… ,vn-1}表示具有n條邊v0v1,v1v2,… ,vn-1vn的一個凸多邊形,其中,約定v0=vn。
若vi與vj是多邊形上不相鄰的兩個頂點,則線段vivj稱為多邊形的一條弦。弦將多邊形分割成凸的兩個子多邊形{vi ,vi+1 ,… ,vj}和{vj ,vj+1 ,… ,vi}。多邊形的三角剖分是一個將多邊形分割成互不相交的三角形的弦的集合T。圖1是一個凸多邊形的兩個不同的三角剖分。
圖1 一個凸多邊形的2個不同的三角剖分
在凸多邊形P的一個三角剖分T中,各弦互不相交,且弦數已達到最大,即P的任一不在T中的弦必與T中某一弦相交。在一個有n個頂點的凸多邊形的三角剖分中,恰好有n-3條弦和n-2個三角形。
凸多邊形最優三角剖分的問題是:給定一個凸多邊形P={v0 ,v1 ,… ,vn-1}以及定義在由多邊形的邊和弦組成的三角形上的權函數ω。要求確定該凸多邊形的一個三角剖分,使得該三角剖分對應的權即剖分中諸三角形上的權之和為最小。
可以定義三角形上各種各樣的權函數ω。例如:定義 ω(vivjvk)=|vivj|+|vivk|+|vkvj|,其中,|vivj|是點vi到vj的歐氏距離。相應於此權函數的最優三角剖分即為最小弦長三角剖分。
二、算法思路
1、三角剖分的結構及其相關問題
凸多邊形的三角剖分與表達式的完全加括號方式之間具有十分緊密的聯系。正如所看到過的,矩陣連乘積的最優計算次序問題等價於矩陣鏈的完全加括號方式。這些問題之間的相關性可從它們所對應的完全二叉樹的同構性看出。
一個表達式的完全加括號方式對應於一棵完全二叉樹,人們稱這棵二叉樹為表達式的語法樹。例如,與完全加括號的矩陣連乘積((A1(A2A3))(A4(A5A6)))相對應的語法樹如圖2(a)所示。
圖2 表達式語法樹與三角剖分的對應
語法樹中每一個葉子表示表達式中一個原子。在語法樹中,若一結點有一個表示表達式E1的左子樹,以及一個表示表達式Er的右子樹,則以該結點為根的子樹表示表達式(E1Er)。因此,有n個原子的完全加括號表達式對應於惟一的一棵有n個葉結點的語法樹,反之亦然。
凸多邊形{v0 ,v1 ,… ,vn-1}的三角剖分也可以用語法樹來表示。例如,圖1(a)中凸多邊形的三角剖分可用圖2(b)所示的語法樹來表示。該語法樹的根結點為邊v0v6,三角剖分中的弦組成其余的內部結點。多邊形中除v0v6
邊外的每一條邊是語法樹的一個葉結點。樹根v0v6是三角形v0v3v6的一條邊,該三角形將原多邊形分為3個部分:三角形v0v3v6,凸多邊形{v0 ,v1 ,… ,v3}和凸多邊形{v3 ,v4 ,… ,v6}。三角形v0v3v6的另外兩條邊,即弦v3v6和v0v3為根的兩個兒子。以它們為根的子樹分別表示凸多邊形{v0 ,v1 ,… ,v3}和凸多邊形{v3 ,v4 ,… ,v6}的三角剖分。
在一般情況下,一個凸n邊形的三角剖分對應於一棵有n-1個葉子的語法樹。反之,也可根據一棵有n-1個葉子的語法樹產生相應的一個凸n邊形的三角剖分。也就是說,凸n邊形的三角剖分與n-1個葉子的語法樹之間存在一一對應關系。由於n個矩陣的完全加括號乘積與n個葉子的語法樹之間存在一一對應關系,因此n個矩陣的完全加括號乘積也與凸(n+1)邊形的三角剖分之間存在一一對應關系。圖2的(a)和(b)表示出了這種對應關系,這時n=6。矩陣連乘積A1A2..A6中的每個矩陣Ai對應於凸(n+1)邊形中的一條邊vi-1vi。三角剖分中的一條弦vivj,i<j,對應於矩陣連乘積A[i+1:j ]。
事實上,矩陣連乘積的最優計算次序問題是凸多邊形最優三角剖分問題的一個特殊情形。 對於給定的矩陣鏈A1A2..An,定義一個與之相應的凸(n+1)邊形P={v0 ,v1 ,… ,vn},使得矩陣Ai與凸多邊形的邊vi-1vi一一對應。若矩陣Ai的維數為pi-1×pi,i=1,2,…,n,則定義三角形vivjvk上的權函數值為: ω(vivjvk)=pipjpk。依此權函數的定義,凸多邊形P的最優三角剖分所對應的語法樹給出矩陣鏈A1A2..An的最優完全加括號方式。
2、最優子結構性質
凸多邊形的最優三角剖分有最優子結構性質。
3、最優三角剖分的遞歸結構
4、計算最優值
public static void minWeightTriangulation(int n) { for (int i = 1; i <= n; i++) { t[i][i] = 0; } for (int r = 2; r <= n; r++) {//i與j的差值 for (int i = 1; i <= n - r + 1; i++) { int j = i + r - 1; m[i][j] = m[i + 1][j] + w(i-1,i,j);//k==i的情況 s[i][j] = i; for (int k = i + 1; k < i+r-1; k++) { int u = m[i][k] + m[k + 1][j] + w(i-1,k,j); if (u < m[i][j]) { m[i][j] = u; s[i][j] = k; } } } } }
與最大矩陣連乘問題matrixChain一樣,該算法占用O(n2)空間,耗時O(n3)。
5、構造最優三角剖分