分而治之的理论基础


22

在算法设计方面,通常采用以下技术:

  • 动态编程
  • 贪婪策略
  • 分而治之

尽管对于前两种方法,有著名的理论基础,即Bellman最优性原理和拟阵理论(分别是Greedoid),但我找不到基于D&C的算法通用框架。

首先,我知道我们(或更确切地说,教授)在函数式编程类中引入的某种东西,称为“算法框架”,它是在组合器的上下文中产生的。作为示例,我们为D&C算法提供了如下框架:

定义:令为非空集。我们称的元素,而的元素(即的子集)称为问题。然后,D&C骨架为4元组,其中:A,SS P:=P(A)A(Pβ,β,D,C)

  • Pβ是在一系列问题的谓词和我们说一个问题是基本的当且仅当成立。pPβ(p)
  • β是映射,为每个基本问题分配解决方案。PβS
  • D是一个映射 ,它将每个问题分为一组子问题。PP(P)
  • C是一个映射,它将子问题的解决方案(取决于“枢轴问题”的类型)连接起来以产生一个解决方案。P×P(S)S

然后,对于给定的骨架和问题,以下泛型函数计算一个解(在形式上义)为:s=(Pβ,β,D,C)pfs:PSp

fs(p)={β(p)if p is basicC(p,f(D(p)))otherwise

在第二行中,对于映射的共域的子集,我们使用符号。f(X):={f(x):xX}Xf

但是,我们没有进一步检查可以用这种方式表达的问题的潜在“结构”属性(正如我所说的,这是一个函数编程类,这只是一个小例子)。不幸的是,我找不到这种方法的进一步参考。因此,我认为上述定义不是很标准。如果有人认识到我上面所说的内容,我会对相关文章感到高兴。

其次,对于贪心策略,我们得出了著名的结果,即当且仅当其解决方案构成加权拟阵时,一般贪心算法才能正确解决问题。D&C算法是否有相似的结果(不一定基于上述方法)?

Answers:



1

我不知道像贝尔曼的“分而治之”算法的最佳性原则那样具体的东西。但是,对我而言,分而治之的基础似乎是对问题输入的递归(或归纳式)定义,然后是将问题的解决方案组合为更大的解决方案的一种方法。此处的关键见解是递归地考虑问题输入,并将其运用到递归D&C算法中。

以mergesort为例。让我们从输入开始,它是元素的数组。可以递归定义数组的结构,如下所示:n

  • 对于,数组为空。n=0
  • 对于,数组是单例元素n=1
  • 对于,该数组是大小为()和大小为(n>1n2n2

然后,我们通过将排序映射到此结构来处理mergesort算法。基本情况,其中被简单排序。递归的情况是从递归排序数据的递归位置开始的,即。然后,我们基本上找到了串联的替代,最终被合并。因此请注意,我们基本上只是采用了数据的递归结构并将其映射到递归解决方案。 n1

重要的是要注意,这并不一定会带来D&C算法所期望的结果。我们可以如下定义数组结构:

  • 对于,数组为空。n=0
  • 对于,该数组是连接到大小为的数组的单个元素。 n>0n1

按照我们在此处用于mergesort的相同策略,可以进行递归插入排序。因此,通常我们会开发涉及多个递归元素的递归定义,即将数据集切成一半或三分之一。

现在,有了用于分析D&C算法的主定理,这为具有特定总体运行时效率的D&C算法子组件的效率期望提供了一些启示。


您提供的示例适合我在问题中给出的一般情况(实际上,给出具体的应用可能会有所帮助)。但是,我的问题是,是否存在一个标准(例如BOP或拟阵结构)来解决适合此模式的算法可以解决的问题。
Cornelius Brand
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.