1.分治法(Divide and Conquer)简介:
思想:
(1)将原始问题划分或者归结为规模更小的子问题
(2)递归或者迭代求解每个子问题
(3)将子问题的解综合得到原问题的解
应满足的条件:
(1)子问题与原始问题性质完全一样
(2)子问题之间可以彼此独立地求解
(3)递归停止时子问题可以直接求解
2.二分检索算法的基本原理:
前提是要检索的数组有序(此处假定为升序)。
迭代算法:
算法 Binary Search(T, l, r, x)
输入:数组T,下表从 l 到 r ;数 x 为要寻找的数
输出:j // 若 x 在数组中,j 为 x 的下标;否则为-1
while l<=r do
m<-(l+r)/2
if T[m] = x then return m
else if T[m]<x then l <- m+1
else r <- m-1
return -1
递归算法:
算法 Binary Search(T, l, r, x)
输入:数组T,下表从 l 到 r ;数 x 为要寻找的数
输出:j // 若 x 在数组中,j 为 x 的下标;否则为-1
if l<=r then
mid <- (start+end)/2
if T[mid]=x then return mid
else if T[m]<x then Binary Search(T,mid+1,end,x)
else Binary Search(T,start,mid-1,x)
else return -1
3.程序实现:
迭代实现:
int BinarySearch(int a[],int start,int end,int x)
{
int mid;
while(start<=end)
{
mid=(start+end)/2;
if(a[mid]==x)
return mid;
else if(a[mid]<x) //x在右半部分
start=mid+1;
else //x在左半部分
end=mid-1;
}
return -1; //未检索到x
}
递归实现:
int BinarySearch(int a[],int start,int end,int x)
{
if(start<=end)
{
int mid=(start+end)/2;
if(a[mid]==x)
return mid;
else if(a[mid]<x) //x在右半部分
BinarySearch(a,mid+1,end,x)
else //x在左半部分
BinarySearch(a,start,mid-1,x)
}
else
return -1; //未检索到x
}
3.二分检索算法的时间复杂度分析:
可认为算法中基本操作是比较。
W(n)=W(n/2)+1
W(1)=1
很容易可以算出二分检索算法的时间复杂度为O(logn)。