1. 程式人生 > >減治、分治和變治的區別和聯絡

減治、分治和變治的區別和聯絡

減治: 利用了一個問題給定例項的解和同樣問題較小例項的解之間的某種關係,常用的有n和n-1的關係,有了這種關係我們可以自頂向下地遞迴求解,也可以自底向上地迭代實現,從較小例項開始求解這一角度來看減治也叫增量法。

減治法的三種方式:

1***.減常量*** 每次迭代總是從例項中減去一個相同的常量,一般為1。如求an的值,我們從an=an-1*a可以看出n和n-1之間的關係,所以可以得到遞迴式:

 f(n)=f(n-1)*a   n>0

f(n)=a n=0

減常量的例子有很多,利用源刪除法對無環有向圖進行拓撲排序就是很好的例子,即不斷重複一件事,在餘下的有向圖中求出一個源,它是一個沒有輸入邊的頂點,然後把它和從它出發的邊都刪除,頂點被刪除的次序就是拓撲排序問題的一個解。

2.減常因子 每次迭代總是從例項中減去一個相同的常數因子,因子就是倍數的意思,一般為2,就是減半。還是求an的值,可以先求一半再平方an=(an/2)2,當然跟n的奇偶性有關,如果是奇數就先提出一個a來再減半唄。

減常因子的例子也很多,最經典的莫過於折半查詢,這個效能卓越的演算法優點在於查詢鍵和陣列元素比較的次數大大減少了,每次都縮減為原來的一半。假幣問題、俄式乘法、約瑟夫斯問題都是很好的例子。

3.減可變規模 演算法每次迭代時,規模減小的模式都是不同的,也就是說每次都減小,但減小的程度不是確定的,還記得歐幾里得演算法吧,隨著不斷求餘,n越來越小,但減小的方式不是常量也不是常因子。插值查詢、二叉查詢樹中的查詢及插入都是減可變規模的例項。

分治: 首先,將一個問題劃分為同一型別的若干個子問題,子問題最好規模相同;

然後,對子問題求解;

最後,合併這些子問題的解,得到原始問題的解。

分治演算法的應用例項有很多,如歸併排序,快速排序,二叉樹遍歷等。

變治: 所謂變治,就是基於變換的方法,首先把問題的例項變得容易求解,然後進行求解,通常,對問題的變換方式有三種:

1.例項化簡:變為同樣問題的一個更簡單的例項;

2.改變表現:變為同樣例項的不同表現;

3.問題化簡:變為另一個已知演算法的問題的例項

基於這種思想的演算法也有很多,如預排序(把無序變為有序,然後處理),高斯消去法(把方程組經過初等變換,得到具有特殊性質的方程組),堆和堆排序(利用最大/小堆總是找到最大/小值)。

總結: 1.再解釋下上面的圖,分治和減治不同的地方是分治分開的兩邊都要治理,但減治減掉的那部分就不需要了

2.之前只說分治思想,哪些演算法是基於分治法得出的。這還是第一次接觸這麼細緻的概念,總得來分一下什麼屬於分治、減治和變治。這種思想給了我們動態看問題的啟示,以後遇到問題還要多角度變通地去解。