低效分治算法的复杂性
Posted
技术标签:
【中文标题】低效分治算法的复杂性【英文标题】:Complexity of inefficient divide and conquer algorithm 【发布时间】:2013-10-13 10:06:01 【问题描述】:大小为n
的实例被划分为大小为n-a
的p≥2
实例,其中a
是一个小的integer
,p
是一个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=1
和p=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 的指数。
【讨论】:
以上是关于低效分治算法的复杂性的主要内容,如果未能解决你的问题,请参考以下文章