刪數問題的貪心策略正確性證明

2022-07-15 04:48:08 字數 2036 閱讀 3637

這篇文章是從我的另外一篇文章:基礎演算法:貪心中分離出來的。

因為證明過程比較長。。。

設集合\(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 顯然...