美文网首页
减治算法及与分治、变治对比

减治算法及与分治、变治对比

作者: Tenloy | 来源:发表于2020-04-10 09:39 被阅读0次

# 减治算法

将规模为n的问题递减为 n-1/n-2 的子问题,反复递减后对子问题分别求解,再建立子问题的解与原问题的解的关系

分治法与减治法
关键都是:将父问题划分为子问题
区别是:分治法最后一搬需要将子问题合并求原问题的解,而减治法一般情况是:父问题的解便存在于某个子问题的解中

是一种一般性的算法设计技术,它利用了一个问题给定实例的解和同样问题较小实例的解之间的关系。一旦建立了这样一种关系,我们既可以自顶至下(递归)也可以自底至上地运用它(非递归)。

减治法有3种主要的变种:

  • 减一个常量,常常是减1(例如插入排序)
    n个元素我们减去C个元素(C是一个正整数)
  • 减一个常因子,常常是减去因子2(例如折半查找)
    将集合的元素一分为二或者分成多份。比如将n-1改为n/2
  • 减可变规模(例如欧几里得算法).
    集合中每次减去的规模不一样,比如有n个元素的集合,我第一次减去一个元素成为n-1第二次减去了n/2的元素成为(n-1)/2.

# 对比

分治法(divide-and-conquer method)

是将一个问题划分成多个同一类型的子问题(子问题最好规模相同),之后求这些子问题的解,如果有必要的话合并(分治法一般需要合并)这些子问题的解,以得到 原始问题的答案。

分治法基础概念比较容易理解,我们可以将其理解一个树结构的处理问题方式,比如一个问题将其抽象为求n,然后分成了两个求n/2的问题,之后两个求n/2的问题又接着分形成了四个求n/4的问题,最后求得n/4的解,经过回溯得到了原本求n问题的答案。

分治和减治不同的地方是分治分开的两边都要治理,但减治减掉的那部分就不需要了。

变治法

所谓变治,就是基于"变换"的方法,首先把问题的实例变得容易求解,然后进行求解,通常,对问题的变换方式有三种:

  1. 实例化简:变为同样问题的一个更简单的实例;
  2. 改变表现:变为同样实例的不同表现;
  3. 问题化简:变为另一个已知算法的问题的实例

这个方法的思路类似于数学建模的思路,将生活的问题进行简单的抽象,以便对此进行研究,举一个简单的例子:

在操场(欧几里得平面)上有n>=3个人,每个人都有唯一一位最近的邻居,他们手上拿着1块奶油块,收到信号后,都会把派扔向他最近的邻居。假设n是奇数,而且每个人都可以100%命中对方,请判断对错:每次至少有一个人不会被奶油派击中。
这个问题应该是正确的,我们来以3个人A,B,C举例,假如A与B的距离为c,B与C的距离为a,C与A的距离为b,那么如果每个人都会被扔到那么他们的距离关系应当满足 c<a,b<c,a<c; 显然我们发现这是存在前后矛盾的因此我们可以断定每次至少有一个人不会被奶油派击中是正确的。

这是将实际问题抽象的一个例子,将人抽象成点,将距离抽象成线的长度,并且利用反证法来证明这个假设。

基于这种思想的算法也有很多,如:

  • 预排序(把无序变为有序,然后处理)
  • 高斯消去法(把方程组经过初等变换,得到具有特殊性质的方程组)
  • 堆和堆排序(利用最大/小堆总是找到最大/小值)

# 经典运用

  • 查找(折半、二叉查找树)
  • 选择问题
  • 插入排序
  • 堆排序
  • 假币问题

相关文章

  • 减治算法及与分治、变治对比

    # 减治算法 将规模为n的问题递减为 的子问题,反复递减后对子问题分别求解,再建立子问题的解与原问题的解的关系 ...

  • 从减治法到插入排序再到希尔排序

    减治法和分治法 在算法学习的路上,我们必定会听过一个名词:分治法。这个算法设计思想的应用的广泛就和他的名声一样广为...

  • 减治法

    本文章注重分析算法设计的策略 所谓减治法,从字面意思理解就是减而治之,其利用一个问题实例的解与问题较小的实例的解的...

  • 读《算法导论》第2章 算法基础--2.3设计算法

    2.3.1分治法 开头讲了很多算法的结构都是递归,而这些算法遵循分治法的思想,也就是将问题分解为跟原问题差不多的子...

  • 精细养猪三字经

    一.猪生病,人心慌;抓细节,治与防;三分治,七分养;要打铁,自身强。治病猪,不能急;时候到,自然康,糊涂疗,治混感...

  • 面对分治算法,看这两道题就够了

    分治算法 分治,"分而治之"。从字面上理解就是分---治,把大的问题分成小问题,解决一个一个小问题,之后把问题的答...

  • 排序算法:归并排序

    1、环境配置: 系统:win10 编程语言:C 编译器:DevC++ 2、算法思想: 分治:先分,后治! 注意:在...

  • golang 写个归并排序

    归并排序是核心原理是分治和递归的运用,分治,那就需要分而治之,治在这里有治理合并意义。 算法描述 把长度为n的输入...

  • 算法05-减治法

    算法05-减治法 一、介绍 减治法是每一步都能缩小一定的问题规模(-1,-k,-n/2等),最后变成1个最小的小问...

  • 改革的曲折与觉醒——读《商鞅变法》之实践

    自古以来,史论,乱而必治,治而必乱。而治与乱,所考验的是改革的路径与改革的人。穷则变,变则先乱,乱后而治。凡是变革...

网友评论

      本文标题:减治算法及与分治、变治对比

      本文链接:https://www.haomeiwen.com/subject/ceelmhtx.html