johnson 算法 貪心

題目
有n個作業要在兩臺機器M1和M2組成的流水線上完成加工。每個作業i都必須先花時間ai在M1上加工,然後花時間bi在M2上加工。
確定n個作業的加工順序,使得從作業1在機器M1上加工開始到作業n在機器M2上加工爲止的總時間最短。

思路
假設a1=1,b1=3,a2=2,b2=4;
如果先加工a1,b1,那麼需要時間1+3+4,如果先加工a2,b2,那麼需要時間2+4+3,這兩者之間的差異來源於3-2=1,等待時間爲1,4-1=3,等待時間爲3,等待時間少的花費時間少,如何減少等待時間呢?不難看出b2-a1,與b1-a2的差異來,也就是說要用a1,b1較小的那個數來減a2,b2中較大的那個數,但是a1,與b1不能交換順序,那麼怎麼實現呢?
可看成兩部分,一部分是a1<b1的那部分,一部分是a1>b1的那部分,a1<b1的那部分按照a1的大小從小向大排,而a1>b1的那部分倒過來看,就是前小後大,那麼就可以看成一個序列,從兩頭看向中間,都是ai,bi前小後大。
到這裏實際上就可以了,但是,如何證明他的正確性呢?

數學歸納法。
數學歸納法(Mathematical Induction, MI)是一種數學證明方法,通常被用於證明某個給定命題在整個(或者局部)自然數範圍內成立。除了自然數以外,廣義上的數學歸納法也可以用於證明一般良基結構,例如:集合論中的樹。這種廣義的數學歸納法應用於數學邏輯和計算機科學領域,稱作結構歸納法。
在數論中,數學歸納法是以一種不同的方式來證明任意一個給定的情形都是正確的(第一個,第二個,第三個,一直下去概不例外)的數學定理。 [1]
雖然數學歸納法名字中有“歸納”,但是數學歸納法並非不嚴謹的歸納推理法,它屬於完全嚴謹的演繹推理法。事實上,所有數學證明都是演繹法。

最簡單和常見的數學歸納法是證明當n等於任意一個自然數時某命題成立。證明分下面兩步:
證明當n= 1時命題成立。
假設n=m時命題成立,那麼可以推導出在n=m+1時命題也成立。(m代表任意自然數)
這種方法的原理在於:首先證明在某個起點值時命題成立,然後證明從一個值到下一個值的過程有效。當這兩點都已經證明,那麼任意值都可以通過反覆使用這個方法推導出來。把這個方法想成多米諾效應也許更容易理解一些。

按照假設,由2個推向3個,也就是從n個推向n+1個,不難發現上述的解決問題辦法是正確的,
數學歸納法最大的好處是可以由簡單派生,2到3,3到4,只要符合數學歸納法這種證明方法的條件,那麼他就是正確的,***dp問題,層層遞進的問題***用數學歸納法來標尺一下所猜想的方法的正確性,很有效。
最好的一點在於從最簡單的開始出發,使得看上去眼花繚亂的問題安靜了下來,問題最開始的時候,往往是比較簡潔的

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章