算法-分治法

分治法第一点:找到能解的子问题(n=特殊小值时)

分治法所能解决的问题一般具有以下几个特征:

1、该问题的规模缩小到一定的程度就可以容易地解决:
因为问题的计算复杂性一般是随着问题规模的增加而增加,因此大部分问题满足这个特征。
2 该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质:
这条特征是应用分治法的前提,它也是大多数问题可以满足的,此特征反映了递归思想的应用
3、利用该问题分解出的子问题的解可以合并为该问题的解:
能否利用分治法完全取决于问题是否具有这条特征,如果具备了前两条特征,而不具备第三条特征,则可以考虑贪心算法或动态规划。
这条特征涉及到分治法的效率,如果各子问题是不独立的,则分治法要做许多不必要的工作,重复地解公共的子问题,此时虽然也可用分治法,但一般用动态规划较好。

二分搜索技术:

给定已按升序排好序的n个元素a[0:n-1],现要在这n个元素中找出一特定元素x。
据此容易设计出二分搜索算法:
template<class Type> 
int BinarySearch(Type a[], const Type& x, int l, int r)
{
while (r >= l){ 
int m = (l+r)/2;
if (x == a[m]) return m;
if (x < a[m]) r = m-1; else l = m+1;
}
return -1;
} 
考虑二分搜索的递归算法
递归算法:
template <class T>
int BinarySearch(T A[], T v, int l, int r)
{
int j;
if( l > r && v!=A[l])
return -1;
j=(r+l)/2;
if( v == A[j])
return j;
else if (v < A[j])
return BinarySearch(A,v,l,j-1);
else
return BinarySearch(A,v,j+1,r);

猜你喜欢

转载自blog.csdn.net/wangqianqianya/article/details/79844964