在算法设计方面,通常采用以下技术:
- 动态编程
- 贪婪策略
- 分而治之
尽管对于前两种方法,有著名的理论基础,即Bellman最优性原理和拟阵理论(分别是Greedoid),但我找不到基于D&C的算法通用框架。
首先,我知道我们(或更确切地说,教授)在函数式编程类中引入的某种东西,称为“算法框架”,它是在组合器的上下文中产生的。作为示例,我们为D&C算法提供了如下框架:
定义:令为非空集。我们称解的元素,而的元素(即的子集)称为问题。然后,D&C骨架为4元组,其中:
- 是在一系列问题的谓词和我们说一个问题是基本的当且仅当成立。
- 是映射,为每个基本问题分配解决方案。
- 是一个映射 ,它将每个问题分为一组子问题。
- 是一个映射,它将子问题的解决方案(取决于“枢轴问题”的类型)连接起来以产生一个解决方案。
然后,对于给定的骨架和问题,以下泛型函数计算一个解(在形式上义)为:
在第二行中,对于映射的共域的子集,我们使用符号。
但是,我们没有进一步检查可以用这种方式表达的问题的潜在“结构”属性(正如我所说的,这是一个函数编程类,这只是一个小例子)。不幸的是,我找不到这种方法的进一步参考。因此,我认为上述定义不是很标准。如果有人认识到我上面所说的内容,我会对相关文章感到高兴。
其次,对于贪心策略,我们得出了著名的结果,即当且仅当其解决方案构成加权拟阵时,一般贪心算法才能正确解决问题。D&C算法是否有相似的结果(不一定基于上述方法)?