`
yunmanfan
  • 浏览: 94031 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

分治法

阅读更多

分治法的设计思想是,将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。

 分治策略是:对于一个规模为n的问题,若该问题可以容易地解决(比如说规模n较小)则直接解决,否则将其分解为k个规模较小的子问题,这些子问题互相独立且与原问题形式相同,递归地解这些子问题,然后将各子问题的解合并得到原问题的解。这种算法设计策略叫做分治法。

  如果原问题可分割成k个子问题,1<k≤n ,且这些子问题都可解并可利用这些子问题的解求出原问题的解,那么这种分治法就是可行的。由分治法产生的子问题往往是原问题的较小模式,这就为使用递归技术提供了方便。在这种情况下,反复应用分治手段,可以使子问题与原问题类型一致而其规模却不断缩小,最终使子问题缩小到很容易直接求出其解。这自然导致递归过程的产生。分治与递归像一对孪生兄弟,经常同时应用在算法设计之中,并由此产生许多高效算法。

  分治法所能解决的问题一般具有以下几个特征:

  1) 该问题的规模缩小到一定的程度就可以容易地解决

  2) 该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质。

  3) 利用该问题分解出的子问题的解可以合并为该问题的解;

  4) 该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子子问题。

  上述的第一条特征是绝大多数问题都可以满足的,因为问题的计算复杂性一般是随着问题规模的增加而增加;第二条特征是应用分治法的前提它也是大多数问题可以满足的,此特征反映了递归思想的应用;第三条特征是关键,能否利用分治法完全取决于问题是否具有第三条特征,如果具备了第一条和第二条特征,而不具备第三条特征,则可以考虑用贪心法或动态规划法。第四条特征涉及到分治法的效率,如果各子问题是不独立的则分治法要做许多不必要的工作,重复地解公共的子问题,此时虽然可用分治法,但一般用动态规划法较好。

  分治法的基本步骤

  分治法在每一层递归上都有三个步骤:

  分解:将原问题分解为若干个规模较小,相互独立,与原问题形式相同的子问题;

  解决:若子问题规模较小而容易被解决则直接解,否则递归地解各个子问题合并:将各个子问题的解合并为原问题的解。

分享到:
评论

相关推荐

    分治法求最大值和最小值

    "分治法求最大值和最小值" 在这篇实验报告中,我们将通过分治法来解决最大值和最小值的问题。分治法是一种将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。 实验目的: * ...

    分治法求两个大整数相乘

    ### 分治法求两个大整数相乘 #### 一、问题背景及描述 在计算机科学领域,处理大整数的运算是一项常见的需求,尤其是在密码学、数据加密以及某些科学计算场景中。对于传统整数类型(如 `int`, `long` 等)无法表示...

    分治法求最近点对

    **标题解析:**“分治法求最近点对”指的是使用分治策略来解决寻找二维空间中距离最近的两个点的问题。在计算机科学中,分治法是一种将复杂问题分解成更小、易于处理的部分的方法,然后分别解决这些部分,最后合并...

    分治法-中位数

    ### 分治法求解两个有序数组的中位数 #### 分治法简介 分治法是一种重要的算法设计思想,其核心在于将一个复杂的问题分解成若干个规模较小但结构相似的子问题,然后递归地解决这些子问题,并将各个子问题的解组合...

    实验4 分治法1

    **实验4 分治法1** 分治法是计算机科学中一种重要的算法设计策略,它将一个大问题分解为若干个小问题来解决。这种思想源于“分而治之”,旨在通过解决小规模问题来构建大规模问题的解决方案。在这个实验中,我们将...

    最大子段和(分治法)源码

    最大子段和(分治法)源码 本资源是一个关于最大子段和问题的解决方案,使用了分治法来解决该问题。最大子段和问题是指给定一个由 n 个整数(可能有负整数)组成的序列(a1, a2, …, an),求该序列中的最大子段和...

    利用分治法求解空中飞行管理问题

    分治法是一种常用的问题求解策略,特别是在处理复杂问题时能有效降低计算复杂度和问题规模。在空中飞行管理问题上,飞行安全是至关重要的,其中一项挑战就是预先识别出哪两架飞机之间存在最大的碰撞风险。如果能够...

    分治法求最大值的C++实现

    在计算机科学领域,分治法(Divide and Conquer)是一种高效的问题解决策略,它将一个复杂的大问题分解成若干个相同或相似的子问题,直到这些子问题变得足够简单,可以直接求解为止。这种方法在处理诸如排序、查找...

    分治法求01背包问题c语言

    分治法是解决复杂问题的一种策略,它将一个大问题分解为若干个规模较小的相同或相似的子问题,然后分别解决这些子问题,最后再合并子问题的解来得到原问题的解。在01背包问题中,分治法的应用并不直接,但可以通过...

    最大字段和问题 分治法.cpp.rar

    在这个题目中,我们要探讨的是"最大字段和问题",这是一个经典的算法问题,通常用分治法(Divide and Conquer)来解决。下面将详细介绍这个问题及其解决方案。 **最大字段和问题**,也被称为**最大子序列和问题**,...

    分治法求最大字段和问题——C语言代码

    在编程领域,分治法是一种常用的算法设计策略,它的核心思想是将复杂的问题分解成两个或更多的相同或相似的子问题,直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。这个过程可以递归进行,从而...

    最近对问题 分治法 ——C语言代码

    分治法是计算机科学中一种重要的算法设计策略,它的核心思想是将一个复杂的问题分解成两个或更多的相同或相似的子问题,直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。在C语言中实现分治法,...

    分治法求最近点对问题

    ### 分治法求最近点对问题 #### 实验目的与内容概述 本次实验的主要目标是理解和实现分治法解决最近点对问题。具体任务包括: 1. **最近点对问题**:给定平面上的N个点,找到其中两点间的最小距离。 2. **随机...

    分治法解方程_分治法_

    **分治法(Divide and Conquer)**是一种重要的算法设计策略,在计算机科学中广泛应用于解决复杂问题。这种策略的基本思想是将一个大问题分解成若干个规模较小、相互独立、与原问题形式相同的子问题,然后分别解决子...

    分治法求众数.doc

    **分治法求众数** 分治法是一种重要的算法设计策略,它将复杂的问题分解成较小的子问题,然后递归地解决这些子问题,最后将子问题的解合并成原问题的解。在这个实验中,我们应用分治法来寻找数组中的众数,即出现...

    最大子段和问题 蛮力法 分治法 动态规划法

    下面我们将深入探讨解决这一问题的三种主要方法:蛮力法、分治法和动态规划法。 1. **蛮力法**: 蛮力法是最直观的解法,通过遍历所有可能的子序列来找出最大和。对于长度为n的数组,我们需要检查n*(n+1)/2个子...

    分治法实现矩阵相乘

    分治法是一种解决复杂问题的有效策略,它将大问题分解为小问题来解决,然后合并小问题的解得到大问题的解。本篇文章将详细讨论如何利用分治法实现矩阵相乘。 矩阵相乘的基本概念是,两个矩阵A(m×n)和B(n×p)...

    分治法 解 平面最接近点对问题

    分治法是一种重要的算法设计策略,它将一个大问题分解为若干个规模较小的相同或相似的子问题,然后分别解决这些子问题,最后将子问题的解组合得到原问题的解。在“平面最接近点对问题”中,我们的目标是找到一组二维...

    test_分治法求最近点对问题_

    3. 要求随机生成N个点的平面坐标,应用分治法编程计算出所有点对的最短距离。4. 分别对N=100100010000100000,统计算法运行时间,比较理论效率与实测效率的差异,同时对蛮力法和分治法的算法效率进行分析和比较。5. ...

Global site tag (gtag.js) - Google Analytics