遞歸分治策略

  在前面的隨筆中其實談到了一些遞歸分治的算法,也以爲自己寫上去了,今天在看到沒有寫。下面就來補上。

  遞歸分治是算法中比較重要的思想。在之前也聊到了遞歸和遞推的區別。遞歸這裏就不再詳細講述了。下面講一講分治。分治其實很簡單,就是將一個比較大的問題分解爲很多的小問題,解決小問題的最優解比解決大問題的最優解要簡單的多,很多的小問題的最優解就組成了大問題的最優解。從這裏也可以發現,遞歸和分治在一起用的話會比較好,同時也是容易想到的。

  下面講一講遞歸的一些我會的東西,遞歸就是間接和直接調用自身的算法。比如斐波那契數列就是用遞歸比較簡單解決的問題之一。遞歸有三個要素,遞歸主體,遞歸邊界,遞歸參數。這三個要素組成了遞歸。先講一講遞歸的主體,遞歸的主體算法就是遞歸的主體,這一部分是比較重要的,因爲遞歸的大部分操作都在這裏實現。遞歸邊界就是遞歸的盡頭,因爲任何一個算法都要在有限的時間內得出結果,否則就是失敗的,遞歸的邊界就給遞歸提供了一個結束的具體條件。遞歸的參數是每次遞歸發生變化的數值,有時爲了輸入的方便,遞歸的參數會有一部分參數沒有發生變化,這也是可以的。

  紙上談兵終究學不會,下面就來具體就問題來詳細探討一下。

  先講一個簡單的,容易想的。“最長公共子序列”問題,最長公共子序列問題可能大家用動態規劃做的比較多,因爲用動態規劃比遞歸要簡單的多。但是最長公共子序列也可以用遞歸來做。下面就來講一講具體的實現,最長公共子序列問題就是在兩串字符串中找出來兩個字符串都具有的子序列(子序列可以間斷,但是順序不可以亂)。問題了解了,談談思路吧,分治的思想就是將問題分爲小問題,我們將問題分解爲一個字符的比較,這個就簡單了。同時也可以用遞歸來將剩餘的問題交給下一個自身算法來解決。這樣遞歸的主體就是解決一個字符的比較。但是下面遇到了一個問題,當前比較的字符一樣時還可以往下面遞歸,但是不一樣時該怎麼遞歸呢?我們可以將A,B比作兩個字符串,i表示當前比較的字符,i-1就是下一個字符的位置。這樣當Ai==Bi時,遞歸就是Ai-1和Bi-1的比較。當Ai和Bi不一樣時,就可以分爲Ai與Bi-1和Ai--1與Bi的比較,這樣,還是遞歸到了下一個子問題。比較兩者的大小,選出大的就可以了。 

  遞歸的主體解決了,下面解決遞歸的邊界。遞歸的邊界可能大家想到了當i==0時,就結束了,這個比較好想到,但是其他的問題遞歸的邊界可能就不是很好想了。遞歸的參數就呼之欲出了,兩個字符串的比較位置就是參數(也可以將字符串比較一次直接刪除比較的元素),這裏要注意的就是遞歸常用的一個方法,試探與回溯,因爲算法不可能直接求出來最優解,需要算法不停的試探下一個結果是對還是錯,同時還要回到算法開始的位置。(本題可能並不需要這種方法,因爲並沒有對字符串做出更改)。

  上面就是最長公共子序列的遞歸算法的大致思路,這裏因爲一些原因(懶),這裏就不在列出代碼。上面可能就是一個大致的思路,具體的細節可能還會有一些不一樣。但是大致一致。下面就練習一個簡單的遞歸思路。

  求出一個數組所有的元素和,這個問題很多人估計一個for循環就可以完成了,但是我們是用遞歸的思想來實現。下面來說一說思路。

  先想一下遞歸的主體,我們可以計算當前數組位置的一個元素的和,然後將剩下的交給後面的遞歸算法來做。主體完成,遞歸的邊界也就容易想到,當數組中的所有元素遞歸一遍後就是遞歸結束的邊界。遞歸的參數前面也是很簡單,當前累加的元素的位置就是參數,這裏爲了方便也將數組作爲參數傳了進來。

  算法的實現我用了一個更加複雜的方式(順便練一練二分),就是將遞歸的算法交給了兩部分,只是計算了數組的中間位置(或者中間位置都沒有計算)。下面就粘貼具體代碼:

public class demo5 
{
	public static int f(int a[],int end)
	{
		if(end<0)
		{
			return 0;
		}
		return f(a,end-1)+a[end];
		
	}
	public static int f(int a[],int min,int max)
	{
		int mid=(max+min)/2;
		if(mid==max){
			return a[max];
		}
		return f(a,min,mid)+f(a,mid+1,max);
		
	}
	public static void main(String args[])
	{
		int a[]={2,3,4,5,6,7,8,10};
		int i=f(a,0,7);
		System.out.println(i);
	}
	

}

  代碼沒有什麼難點,看看就明白了

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