本文主要是介绍算法策略 - 分治(Divide And Conquer),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
- 分治,也就是分而治之。它的一般步骤是
- 将原问题分解成若干个规模较小的子问题(子问题和原问题的结构一样,只是规模不一样)
- 子问题又不断分解成规模更小的子问题,直到不能再分解(知道可以轻易算出子问题的解)
- 利用子问题的解推导出原问题的解
-
因此,分治策略非常适合用递归
-
需要注意的是:子问题之间是互相独立的
-
分治的应用
- 快速排序
- 归并排序
- Karatsuba算法(大数乘法)
主定力(Master Theorem)
- 分治策略通常遵守一种通用模式
- 解决模式为n的问题,分解成a个喹莫为n/b的子问题,然后再O(n^d)时间内将子问题的解合并起来
- 算法运算时间为:T(n) = aT(n/b) + O(n^d),a>0,b>1,d>=0
- 比如归并排序的运行时间是:T(n) = 2T(n/2) + O(n),a = 2,b = 2,d = 1,所以T(n) = O(nlogn)
练习1 - LeetCode — 53. 最大子序和
练习2 - 大数乘法
-
按照小学时学习的乘法运算,在进行n位数之间的相乘时,需要大约进行n^2次个位数的相乘
-
比如计算25 x 63
-
时间复杂度T(n) = 4T(n/2) + O(n) = O(n^2)
-
1960年Anatolii Alexeevitch Karatsuba提出了Karatsuba算法,提高了大数乘法的效率
这篇关于算法策略 - 分治(Divide And Conquer)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!