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

2021-08-28 09:02:56 字數 1396 閱讀 3329

減治:

利用了乙個問題給定例項的解和同樣問題較小例項的解之間的某種關係,常用的有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.之前只說分治思想,哪些演算法是基於分治法得出的。這還是第一次接觸這麼細緻的概念,總得來分一下什麼屬於分治、減治和變治。這種思想給了我們動態看問題的啟示,以後遇到問題還要多角度變通地去解。

分治 減治 變治

a.分治法 divide and conquer 演算法設計思想 1.分解 把問題遞迴分解為兩個以上的子問題 子問題 與原問題性質相同,規模較小 2.求解 求解子問題 不再分解 3.合併 合併子問題的解,得到原問題的解 1.合併排序 2.快速排序 b.減治法 decrease and conquer...

斯坦福演算法設計和分析 3 分治演算法

本文預計閱讀時間4分鐘,在讀的過程中你需要帶著以下問題 分值策略一般步驟 把輸入劃分成更小的子問題。遞迴的治理子問題。把子問題的解決方案組合到一起,形成原始問題的解決方案。應用 逆序對數目 輸入包含不同整數的陣列a,輸出a中逆序對的數量,逆序是指 如果 i j 而 a i a j 那麼 i,j 就是...

equals和 的區別和聯絡

比較方式 基本資料型別 比較數值 引用資料型別 比較記憶體位址是否相同 equals比較方式 引用物件。objec模擬較的是位址值,但是繼承他的類大都重寫了equals方法比較成員變數的值是否相同。例如 integer類 自定義類也可以重寫其中equals方法,比如比較兩個user物件是否相同,可以...