分而治之的思想

分治


分治(Divide and Conquer)是一种算法范式,也是一种解决问题的思想。

步骤如下:
1.分解(Divide):将问题分解为同一类型的子问题;
2.治理(Conquer):递归地解决子问题;
3.合并(Combine):合并子问题的答案,得出原问题的答案。

任何一个可以用计算机求解的问题,所需的计算时间都与其规模有关。
问题的规模越小,越容易直接求解,所需的计算时间也越少。
例如,对于n各元素排序问题,当n=1时,不需要计算;n=2时,只需做一次比较;当n=3时,只需做3次比较……当n很大时,比较的次数是巨大的。
分治算法,就是把问题分解为同一性质的子问题,再讲子问题分解(递归),直到分解出的问题(最小子问题)可以直接求解。然后由这个解再一层层地回到原问题,同时在此过程中得到对应层的解。

 

递归

递归地两个要素:
1.基线条件(Base Case):循环调用的结束。也就是上面说的可以直接求解的“最小子问题”。
2.递归条件(Recursive Case):继续调用自己的条件。也就是将问题继续分解。

例如:n! = n*(n-1)*(n-2)***1

def f(n):
    if n == 1:		# 基线条件
        return 1
    else:			# 递归条件
        return n * f(n)

 

分治的应用例子


查找算法:二分法(Binary Search)
排序算法:快速排序(Quick Sort)、归并排序(Merge Sort)
最接近点对问题( Closest Pair of Points)
Strassen矩阵乘法( Strassen’s Algorithm)
傅里叶变换( Cooley–Tukey Fast Fourier Transform (FFT) algorithm)

 

快速排序:


def quick_sort(array):

    if len(array) < 2:  # 基线条件——最小子问题:数组中只有1个或0个数字,则无需再排序
        return array
    else:                  # 递归条件——继续分解
        pivot = array[0]
        less = [i for i in array[1:] if i <= pivot]
        greater = [i for i in array[1:] if i > pivot]
        return quick_sort(less) + [pivot] + quick_sort(greater)

分而治之(Divide and Conquer)是一种重要的算法设计策略和解决问题的方法论,在 IT 领域有着广泛的应用。 ### 概念 分而治之的基本思想是将一个复杂的问题分解为若干个规模较小、相互独立且与原问题形式相同的子问题,然后递归地解决这些子问题,最后将子问题的解合并起来得到原问题的解。这种方法通常可以降低问题的复杂度,提高算法的效率。 ### 应用 - **数据处理与分析**:在大数据处理中,分而治之可以用于分布式计算。例如,在处理大规模数据集时,将数据划分为多个小块,分配到不同的计算节点上并行处理,最后将各个节点的处理结果合并。像 Hadoop 的 MapReduce 框架就是基于分而治之思想,将大规模数据的处理任务分解为 Map(映射)和 Reduce(归约)两个阶段,分别在不同的节点上执行,提高了数据处理的效率。 - **算法设计**:许多经典算法都采用了分而治之的策略。例如,快速排序和归并排序是两种常见的排序算法,它们通过将待排序的数组不断地分解为更小的子数组,分别对这些子数组进行排序,最后将排序好的子数组合并成一个有序的数组。 - **图形处理**:在计算机图形学中,分而治之可以用于处理复杂的图形和图像。例如,在渲染大型场景时,可以将场景划分为多个小块,分别对每个小块进行渲染,最后将渲染结果合并成完整的图像。 ### 相关算法 - **快速排序(Quick Sort)**:选择一个基准元素,将数组分为两部分,使得左边部分的元素都小于基准元素,右边部分的元素都大于基准元素,然后递归地对左右两部分进行排序。 ```python def quick_sort(arr): if len(arr) <= 1: return arr else: pivot = arr[len(arr) // 2] left = [x for x in arr if x < pivot] middle = [x for x in arr if x == pivot] right = [x for x in arr if x > pivot] return quick_sort(left) + middle + quick_sort(right) ``` - **归并排序(Merge Sort)**:将数组分成两个子数组,分别对这两个子数组进行排序,然后将排序好的子数组合并成一个有序的数组。 ```python def merge_sort(arr): if len(arr) <= 1: return arr mid = len(arr) // 2 left = merge_sort(arr[:mid]) right = merge_sort(arr[mid:]) return merge(left, right) def merge(left, right): result = [] i = j = 0 while i < len(left) and j < len(right): if left[i] < right[j]: result.append(left[i]) i += 1 else: result.append(right[j]) j += 1 result.extend(left[i:]) result.extend(right[j:]) return result ``` - **二分查找(Binary Search)**:在有序数组中查找一个特定元素时,将数组分成两部分,判断目标元素在左半部分还是右半部分,然后递归地在相应的部分中继续查找。 ```python def binary_search(arr, target): left, right = 0, len(arr) - 1 while left <= right: mid = (left + right) // 2 if arr[mid] == target: return mid elif arr[mid] < target: left = mid + 1 else: right = mid - 1 return -1 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值