這篇文章是從我的另外一篇文章:基礎演算法:貪心中分離出來的。
因為證明過程比較長。。。
設集合\(a\)中有\(n\)個元素,將其中每個元素進行編號為\(a_x\)
\(\left ( x\in \left [ 1,n \right ] \right )\) :
\[\begin
a=\begin
a_1,&a_2, &a_3, &\cdot &\cdot &\cdot &a_, &a_n
\end
\end
\]1.若\(a\)是一條遞增序列,則刪除最後乙個數,其代表的數值\(s_a\)最小。
首先,將\(s_a\)通過\(a\)表示:
\[\begin
s_a=a_1\times 10^+a_2\times 10^+\cdot \cdot \cdot +a_\times10+a_n
\end
\]若刪去最後乙個數,序列\(a\)變為\(a'\),記新表示的數為\(s_\),則:
\[\begin
s_=a_1\times 10^+a_2\times 10^+\cdot \cdot \cdot +a_\times10+a_
\end
\]若所刪除的數,不是最後乙個數\(a_n\),而是任意乙個數\(a_q\),序列\(a\)變為\(a''\),記新表示的數為\(s_\),則:
\[\begin
s_=a_1\times 10^+a_2\times 10^+\cdot \cdot \cdot +a_\times10^+a_\times10^ \cdot\cdot \cdot +a_\times10+a_
\end
\]然後觀察兩式,可以看出來:\(s_\) 與\(s_\)前\(q\)項是相同的,故作差:
\[\begin
s_-s_=\left ( a_q-a_ \right )\times10^+\left ( a_-a_ \right )\times10^ \cdot\cdot \cdot +\left ( a_-a_ \right )\times10+\left ( a_-a_n \right )
\end
\]因為,序列\(a\)是遞增的,所以:
\[\begin
a_q\leq a_\leq a_\cdot \cdot \cdot a_\leq a_n
\end
\]即:
\[\begin
a_q-a_\leq0, a_-a_\leq0, \cdot \cdot \cdot a_-a_n\leq 0
\end
\]所以:\(s_-s_\leq0\),所以\(s_ \leq s_\)
所以,若\(a\)是一條遞增序列,則刪除最後乙個數,其代表的數值\(s_a\)最小。
2.若\(a\)是一條遞減序列,則刪除第乙個數,其代表的數值\(s_a\)最小。
證明方法與 1 同理。
3.由1,2可以猜想:如果\(a\)中存在\(a_1-a_i\)為單調增,\(a_-a_n\)為單調減。
單調增的部分,應該刪去最後乙個數。單調減的部分,應該刪去最初乙個數。
我們會發現,這兩個結論其實是統一的:如下圖,應該刪去折點所表示的數,也就是「山峰」。
如果我們刪除乙個數\(a_q\),位於\(a_q\)之前的數就會往後一位,得到\(s_\)
如果我們刪除「山峰」\(a_i\),位於\(a_i\)之前的數就會往後一位,得到\(s_\)
對比兩圖可以發現:\(s_-s_\)後,黃顏色框中的部分便消去了。即得到與 1證明 中類似的差值。
即\(s_\leq s_\)。
所以,若\(a\)不存在單調性,則刪除「山峰」,其代表的數值\(s_a\)最小。
貪心演算法正確性證明
貪心演算法正確性證明 wiki定義 貪心演算法 英語 greedy algorithm 又稱貪婪演算法,是一種在每一步選擇中都採取在當前狀態下最好或最優 即最有利 的選擇,從而希望導致結果是最好或最優的演算法。比如在旅行推銷員問題中,如果旅行員每次都選擇最近的城市,那這就是一種貪心演算法。用大白話說...
貪心演算法的正確性證明
貪心演算法最難的部分就是正確性的證明,常用的方法有歸納法 對演算法步數歸納 對問題歸納 和交換論證法 從最優解出發,不變壞地替換,得到貪心策略的解 下面以三個例子說明這些正確性證法。活動選擇問題 對演算法步數歸納 最優裝載問題 對問題規模歸納 最小延遲排程 交換論證 s s s 為n項活動的集合,s...
kmp優化正確性證明
鄧俊輝老師的課上給出了一種普遍的kmp演算法優化,但是沒有給出這種優化的正確性證明。或許這種正確性是顯而易見的,但這裡還是研究了一下這個演算法的正確性問題。int buildnext char p else 原演算法 j next j 優化演算法 j newnext j return next 顯然...