1.分治法是什么
从定性的角度来看,分治法的核心思想就是“分而治之”。利用分而治之的思想,就可以把一个大规模、高难度的问题,分解为若干个小规模、低难度的小问题。随后,开发者将面对多个简单的问题,并很快地找到答案各个击破。在把这些简单问题解决好之后,我们通过把这些小问题的答案合并,就得到了原问题的答案。
例1:
在一个包含 n 个元素的无序数组中,要求按照从小到大的顺序打印其 n 个元素。
假设我们采用 n 个元素之间的两两比较的计算方法,去得到从小到大的序列。分析如下:
- 当数据量 n = 1 时,不需任何计算,直接打印即可;
- 当数据量 n = 2 时 ,那需要做 1 次比较即可达成目标;
- 当数据量 n = 3 时,要对这 3 个元素进行两两比较,共计 3 次比较;
- 而当数据量 n = 10 时,问题就不那么容易处理了,我们需要 45 次比较(计算方式是 0.5*n(n-1) )。
因此,要想通过上述方法直接解决一个规模较大的问题,其实是相当困难的。
基于此,分治法的核心思想就是分而治之。具体来说,它先将一个难以直接解决的大问题,分割成一些可以直接解决的小问题。如果分割后的问题仍然无法直接解决,那么就继续递归地分割,直到每个小问题都可解。
2. 分治法的价值
例2:
在 1000 个有序数字构成的数组 a 中,判断某个数字 c 是否出现过。
- 第一种方法,全局遍历。 复杂度 O(n)。采用 for 循环,对 1000 个数字全部判断一遍。
- 第二种方法,采用二分查找。 复杂度 O(logn)。递归地判断 c 与 a 的中位数的大小关系,并不断缩小范围。
其实,在小数据规模上,分治法没有什么特殊价值。只有在大数据集上,分治法的价值才能显现出来。
例3:
假如有一张厚度为 1 毫米且足够柔软的纸,问将它对折多少次之后,厚度能达到地球到月球的距离?
根据百度百科,地月平均距离是 384,403.9 千米,大约 39 万千米。
计算的过程是 2^39 = 549,755,813,888 = 55 万千米 > 39 万千米。
我们回到前面讲到的在数组 a 中查找数字 c 的例子,如果数组 a 的大小拓展到 549,755,813,888 这个量级上,使用第二种的二分查找方法,仅仅需要 39 次判断,就能找到最终结果。相比暴力搜索的方法,性能优势高的不是一星半点!这也证明了,复杂度为 O(logn) 相比复杂度为 O(n) 的算法,在大数据集合中性能有着爆发式的提高。
3. 分治法的使用方法
分治法在每轮递归上,都包含了分解问题、解决问题和合并结果这 3 个步骤。
以二分查找为例,关于分治法在排序中的使用,我们会在第 11 课时中讲到。查找问题指的是,在一个有序的数列中,判断某个待查找的数字是否出现过。二分查找,则是利用分治法去解决查找问题。通常二分查找需要一个前提,那就是输入的数列是有序的。
二分查找的思路比较简单,步骤如下:
- 选择一个标志 i 将集合 L

本文介绍了分治法的核心思想——将大问题分解为小问题解决,通过案例分析了分治法在数据查找中的优势,如二分查找在处理大规模数据时的高效性。分治法在有序数组的查找问题中展现出显著的性能提升,例如在海量数据的二分查找中只需 O(logn) 时间复杂度。文章还详细解释了二分查找的步骤及其实现,并强调了分治法的应用场景主要在有序数据环境中。
214

被折叠的 条评论
为什么被折叠?



