前言
在介绍完递归、枚举、BF算法等经典算法后,今天来介绍的就是分治法
一、什么是分治法
在计算机科学中,分治法是一种很重要的算法。
字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并(百度百科)
二,分治法与递归的区分
递归是一种编程技巧,而分治法更像是解决问题的思维方式,使用分治法解决问题可以使用递归这种编程技巧来完成。两者的层面有一定的区别,分治法更偏向于解题的理论层面,而递归则偏向于解题的应用层面。
三、分治法的实例
二分查找:
二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。就是将一个遍历查找过程分为两个从头中间和从未到中间的方式。
为了实现这个过程,要找到一个查找数组的靠中间位置,然后从两头遍历到中间来依次进行查找,这个可以减少时间复杂度:
//a为一个数组,target为要查找的目标数,low数组最低位,high为最高位
void Get(int *a,int target,int low,int high)
{
while(low<=high)
{
if(a[low]==target||a[high]==target)//若查找具体位置,判断分开即可
{
cout<<"Yes,find target";
return;
}
else
{
low++;
high--;
}
}
cout<<"Sorry,no find target";
}
总结
分治法总体而言是一种解决问题的思路,将大的问题分解为小的问题(分解后的小问题与大问题可以合并,或者说是相同类型的题),这样一直到一种可以简单求解的状态