簡體   English   中英

具有頂點權重和邊緣運算的多邊形算法

[英]Algorithm for polygon with weight on vertices and operations on edges

我正在考慮以下問題的算法(在carrercup上找到):

給定具有N個頂點和N個邊的多邊形。 每個頂點都有一個int數(可能是負數),每個邊上有一個set(*,+)的運算。 每次,我們從多邊形中移除邊E,將由邊(V1,V2)鏈接的兩個頂點合並到具有值的新頂點:V1 op(E)V2。 最后一種情況是兩個帶有兩條邊的頂點,結果是較大的一個。 返回最大結果值可以從給定的多邊形獲得。

我想我們可以使用貪婪的方法。 即,對於具有k個邊的多邊形,找到一對(p,q),其在折疊時產生最大數量:(p,q)= max({i operation j:i,j - 相鄰邊)

然后只需在多邊形上調用遞歸:1。讓函數CollapseMaxPair(P(k)) - 得到帶有k個邊的多邊形並返回帶有k-1邊的“折疊”多邊形2.然后我們的遞歸:

 P = P(N);
 Releat until two edges left
     P =  CollapseMaxPair( P )
 maxvalue = max ( two remained values)

你怎么看?

我在這里回答了這個問題: 谷歌訪談:找到多邊形的最大總和,並向我指出該問題與此問題重復。 既然沒有人完全回答這個問題,我也決定在這里添加這個答案。

正確識別(標記)后,這確實非常類似於矩陣乘法問題(為了快速完成,我將以什么順序乘以矩陣)。

這可以使用動態算法以多項式求解。

我將改為解決一個類似的,更經典的(和相同的)問題,給定一個帶有數字,加法和乘法的公式,括號的哪種方式給出最大值,例如6+1 * 2變為(6+1)*2超過6+(1*2)

讓我們將輸入a1 to an表示a1 to an實數,將o(1),... o(n-1)表示為*+ 我們的方法將如下工作,我們將觀察子問題F(i,j),它代表a1,... aj的最大公式(在括號后)。 我們將創建一個這樣的子問題表,並觀察F(1,n)正是我們正在尋找的結果。

限定

F(i,j)

 - If i>j return 0 //no sub-formula of negative length
 - If i=j return ai // the maximal formula for one number is the number
 - If i<j return the maximal value for all m between i (including) and j (not included) of:
     F(i,m) (o(m)) F(m+1,j) //check all places for possible parenthasis insertion

這經歷了所有可能的選擇。 通過對大小n = ji的歸納來完成TProof的正確性並且非常簡單。

讓我們進行運行時分析:

如果我們不為較小的子問題動態保存值,則運行速度非常慢,但我們可以使此算法在O(n^3)執行相對較快

我們創建一個* n表T,其中索引i,j處的單元格包含F(i,j)填充F(i,i)和F(i,j),其中j小於i,在O(1)中完成每個單元格,因為我們可以直接計算這些值,然后我們對角線並填充F(i + 1,i + 1)(我們可以快速完成,因為我們已經知道遞歸公式中的所有先前值),我們重復這個n n對角線的時間(表格中的所有對角線)和填充每個單元格需要(O(n)),因為每個單元格都有O(n)個單元格,我們用O(n ^ 2)填充每個對角線,這意味着我們填充所有表中的O(n ^ 3)。 填寫完表后,我們顯然知道F(1,n)是你問題的解決方案。

我們填寫表格的順序

現在回到你的問題

如果將多邊形轉換為n不同的公式(一個用於從每個頂點開始)並在其上運行公式值的算法,則可以獲得所需的值。

這是貪婪算法失敗的情況:

想象一下,你的多邊形是一個有頂點A,B,C,D(左上,右上,右下,左下)的正方形。 這給了我們邊(A,B),(A,D),(B,C)和(C,D)。

設權重為A = -1,B = -1,C = -1,D = 1,000,000。

A (-1) ------ B (-1)  
|             |  
|             |  
|             |  
|             |  
D(1000000) ---C (-1)  

顯然,最好的策略是崩潰(A,B),然后崩潰(B,C),這樣你就可以自己最終得到D. 但是,您的算法將以(A,D)或(D,C)開頭,這將不是最佳的。

結合最小總和的貪婪算法也有類似的弱點,所以我們需要考慮別的東西。

我開始看到我們想要嘗試將所有正數放在一邊,所有負數放在另一邊。

如果我們將初始多邊形完全視為一個狀態,那么我們可以想象所有可能的子狀態是后續圖形是邊緣被折疊。 這創建了一個樹狀結構。 BFS或DFS最終將為我們提供最佳解決方案,但代價是在最壞的情況下遍歷整個樹,這可能不如您所希望的那樣高效。

您正在尋找的是一種貪婪的最佳方法,可以搜索這棵樹,這種方法可以說是最佳的。 也許你可以通過它創建一個類似A *的搜索,雖然我不確定你的可接受啟發式是什么。

我不認為貪心算法有效。 令頂點為A = 0,B = 1,C = 2,並且邊緣為AB = a-5b,BC = b + c,CA = -20。 貪婪算法選擇BC首先評估,值3.然后AB,值,-15。 但是,有一個更好的序列可供使用。 首先評估AB,值-5。 然后評估BC,值-3。 我不知道有更好的算法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM