分治算法
来源:互联网 发布:小米手机只能用2g网络 编辑:程序博客网 时间:2024/05/16 09:32
分治算法的名字是divide-and-conquer, 从名字上看一目了然,就是先把一个问题divide成为几个子问题,然后分别解决各个子问题。兵法有云:分而治之,各个击破。
英文释义
divide the problem instance, solve subproblems recursively, combine the results, and thereby conquer the problem
算法内涵
分治算法就是把一个困难的问题分解为一系列的子问题,这些子问题具有如下的特点:
1) 子问题比原问题更新解决
2) 子问题的解可以合并为原问题的解
典型的应用包括回文以及二分查找等。
算法举例
回文
这里的回文是指资格字符串,它从头到尾读与从尾到头读的内容是一致的,比如说doggod,无论从左到右耗时从右到左都是一样的。
def isPal(s): if len(s) <= 1: return True else: return s[0]==s[-1] and isPal(s[1:-1])s = 'doggod'result = isPal(s)print result
可以看出算法就是利用递归不断的处理更小的子问题。
二分查找
二分查找也是典型的分治算法的有应用。二分查找需要一个默认的前提,那就是查找的数列是有序的。
二分查找的思路比较简单:
1) 选择一个标志i将集合分为二个子集合
2) 判断标志L(i)是否能与要查找的值des相等,相等则直接返回
3) 否则判断L(i)与des的大小
4) 基于判断的结果决定下步是向左查找还是向右查找
5) 递归记性上面的步骤
def binarySearch(L,e,low,high): if high == low: return L[low] == e mid = (low+high)//2 if L[mid]==e: return True elif L[mid]>e: if low == mid: return False else: return binarySearch(L,e,low, mid-1) else: return binarySearch(L,e,mid+1,high)def search(L,e): result = binarySearch(L,e,0,len(L)-1) print result L = range(10);e = 7search(L,e)
总结
分治算法的一个核心在于子问题的规模大小是否接近,如果接近则算法效率较高。
分治算法和动态规划都是解决子问题,然后对解进行合并;但是分治算法是寻找远小于原问题的子问题(因为对于计算机来说计算小数据的问题还是很快的),同时分治算法的效率并不一定好,而动态规划的效率取决于子问题的个数的多少,子问题的个数远小于子问题的总数的情况下(也就是重复子问题多),算法才会很高效。
- 分治算法
- 分治算法
- 分治算法?
- 【算法】分治
- 【算法】分治
- 分治算法
- 分治算法
- 分治算法
- 分治算法
- 分治算法
- 分治算法
- 分治算法
- 分治算法
- 分治算法
- 分治算法
- 分治算法
- 分治算法
- 分治算法
- 安装wampwerver时图标一直是橙色怎么解决
- android中事件分发机制
- yii2-gii的详细操作步骤
- Window和WindowManager的分析
- MFC学生选课系统
- 分治算法
- nyoj 655 光棍的yy 【大数斐波那契】
- Leetcode 76. Minimum Window Substring 最小子串窗口 解题报告
- 常见反爬错略
- Android权限系统
- How to Upgrade Node.js via NPM
- Spark Metrics配置详解
- mac下mysql5.7修改字符编码为utf-8(或许通用)
- 浅谈一个概率性问题