低效分治算法的复杂性

Posted

技术标签:

【中文标题】低效分治算法的复杂性【英文标题】:Complexity of inefficient divide and conquer algorithm 【发布时间】:2013-10-13 10:06:01 【问题描述】:

大小为n 的实例被划分为大小为n-ap≥2 实例,其中a 是一个小的integerp 是一个constant。这个操作(即划分实例)的计算成本是一个单位,有C(0)=1.

我试图找出这种设计的复杂性。我无法将单词放入等式中,我认为递归应该是这样的:

C(n) = (n-a)*C(n/p) + 1

这对吗?

【问题讨论】:

不,不是。再读一遍这个问题,确定创建的子问题的数量和每个子问题的大小。目前,这些等式是错误的。 请记住,公式是:C(size) = (子问题的数量)*C(子问题的大小) + (划分成本)。你都知道,只要正确解释公式。我不会直接回答这个问题,我希望你这样做。 也知道,如果没有人回答,而您确实想通了,您就可以回答自己的问题。如果您这样做,请务必提供可靠的解释以及您的答案。 我不赞成这个问题,因为我相信 SO 不是家庭作业帮助的地方。它没有为 SO 存档添加任何有用的东西:没有人会搜索“低效的分而治之算法”,而且该示例非常简单和人为,对工作的程序员有任何帮助。当你没有像其他人那样学习时,它也会占用其他人的时间。 (我知道我们都有自己的特殊情况,有时非常困难,但这是我的看法。) @SergeyOrshanskiy 这是应该避免分而治之算法的两种情况之一......作为程序员,我认为知道何时编写迭代或递归代码很重要。 【参考方案1】:

我想应该是这样的:

C(n) = (p)*C(n-a) + 1

我的理由是您在问题中说“p≥2 个实例,每个实例的大小为 n-a”。因此大小减少到C(n-a),并且有 p 个子问题。所以我认为它类似于p*C(n-a)。你说对了另一个术语。如你所说,每一步划分的成本是C(0) = 1

【讨论】:

hmmm...这也是我现在的想法,但这是否会是 n 中的指数级复杂性...继续尝试。 你确实在标题中提到了“低效”这个词。也许这就是这个问题的全部意义所在,以表明分而治之可以实现近乎指数的时间复杂度。【参考方案2】:

好吧,因为这看起来像一个学校作业,特别是因为“效率低下的分治算法”的措辞,我也不会直接回答。

我的建议是以a=1p=2 为例。在这种情况下,您必须解决两个大小为n-1 的子问题,然后花费 1 个单位的时间来组合解决方案。如果你需要 1 个单位的时间来求解n=1,即C(1)=1,那么你得到

C(1)=1
C(2) = 2*C(1) + 1 = 3
C(3) = 2*C(2) + 1 = 7
C(4) = 2*C(3) + 1 = 15

等等。所以你得到C(n) =2^n - 1。如果 a 不是 1,这基本上是同一件事:你只需提升到权力 n/a 而不是 n

顺便说一句,您将a 称为“小整数”,而将p 称为“常数”,这不是很奇怪吗?当然,这两个表达的意思是一样的。就渐近行为而言,所有常数都是“小”的。

【讨论】:

我同意措辞有点奇怪......我最终发现复杂性是 C(n) = p^(n/a) + [(p^(n/a) - 1) / (p - 1)] 这将是大 O(p^n) 指数。【参考方案3】:

正如 Shashank 所写,C(n) = p⋅C(n-a) + 1 是正确的。

我只想提一下,这会导致

C(n) = Σi=0,...,n/a pi = pn/a + 1 - 1

所以 C(n) 在 O(pn/a) 中,它是 n 的指数。

【讨论】:

以上是关于低效分治算法的复杂性的主要内容,如果未能解决你的问题,请参考以下文章

特定分治算法的复杂性

python_分治算法贪心算法动态规划算法

创建两个不均匀子问题的分治算法的时间复杂度。

算法:分治法和时间复杂度 O(nlogn) 有啥关系?

算法有关点分治的一些理解与看法

算法系列之常用算法之一----分治算法