算法複習---分治與遞歸

        嚶嚶嚶,這都第十二週了,第十四周週四我就要考算法惹~爭取在考試之前把書上的例題全都寄几上機實現一遍,寫寫博客縷縷思路(自己複習使用,登不得大雅之堂)~~~

一.分治法的算法思想

分治法的基本思想是將一個規模爲n的問題分解成k個規模較小的子問題,這些子問題相互獨立並且與原問題相同,遞歸的解決這些子問題然後將各子問題的解合併得到原問題的解

算法思想決定了適用條件,分治法的適用條件如下:

 

分治法所能解決的問題一般具有以下幾個特徵:

該問題的規模縮小到一定的程度就可以容易地解決;  

該問題可以分解爲若干個規模較小的相同問題,       (可分解)

利用該問題分解出的子問題的解可以合併爲該問題的解;(可合併)

該問題所分解出的各個子問題是相互獨立的,即子問題之間不包含公共的子問題。(子問題相互獨立)

例題1-二叉搜索算法

1.遞歸版

int BSearch(int low, int high, int obj) //二分搜索的遞歸算法
{
	int mid = (low + high) / 2;
	if (x[mid] == obj)
		return mid;
	if (low <= high)   //這是查找結束的條件
	{
		if (x[mid] > obj)
			BSearch(low, mid - 1, obj);
		else
			BSearch(mid + 1, high, obj);
	}
	else                    //如果low>high了但是還沒有找到,就返回標記值-1
		return -1;       //對,這樣有個容錯纔算比較完整

}

2.迭代版

int Cbsearch(int low, int high, int obj)
{
	while (low <= high)
	{
		int mid = (high + low) / 2;
		if (x[mid] == obj)
		{
			return mid;
		}
		else
		{
			if (x[mid] > obj)
				high = mid - 1;
			else
				low = mid + 1;
		}
	}
	return -1;
}

 

 

 

 

 

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