嚶嚶嚶,這都第十二週了,第十四周週四我就要考算法惹~爭取在考試之前把書上的例題全都寄几上機實現一遍,寫寫博客縷縷思路(自己複習使用,登不得大雅之堂)~~~
一.分治法的算法思想
分治法的基本思想是將一個規模爲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;
}