Algorithm 低效分治算法的复杂性

Algorithm 低效分治算法的复杂性,algorithm,complexity-theory,big-o,divide-and-conquer,Algorithm,Complexity Theory,Big O,Divide And Conquer,大小n的实例分为p≥2个实例,每个大小n-a其中a是一个小的整数,p是一个常数。此操作的计算成本(即划分为实例)为一个单位,C(0)=1。 我试图找到这个设计的复杂性。我很难将这些词放入方程中,我认为递归应该是这样的: C(n) = (n-a)*C(n/p) + 1 这是正确的吗?我想应该是这样的: C(n) = (p)*C(n-a) + 1 我的理由是你说“p”≥在您的问题中,每个大小为n-a'的实例有2个。因此,大小减小为C(n-a),并且存在p个子问题。所以我认为它应该是类似于p*C(

大小
n
的实例分为
p≥2个
实例,每个大小
n-a
其中
a
是一个小的
整数
p
是一个
常数
。此操作的计算成本(即划分为实例)为一个单位,
C(0)=1。

我试图找到这个设计的复杂性。我很难将这些词放入方程中,我认为递归应该是这样的:

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

这是正确的吗?

我想应该是这样的:

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

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

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

我的建议是以
a=1
p=2
为例。在这种情况下,您必须解决两个大小为
n-1
的子问题,然后花1个单位的时间组合解决方案。如果求解
n=1
需要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⋅C(n-a)+1是正确的

我只想提一下,这会导致

C(n)=∑i=0,…,n/a pi=pn/a+1-1


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

不,不是。再读一遍这个问题,确定创建的子问题的数量和每个子问题的大小。目前,等式中的这些都是错误的。记住公式是:C(大小)=(子问题数量)*C(子问题大小)+(除法成本)。你都知道,只要把公式解释正确就行了。我不会直接回答这个问题,我希望你能这样做。同时要知道,如果没有人回答,而你确实明白了,你就能够回答你自己的问题。如果你这样做了,一定要在回答的同时提供一个可靠的解释。我对这个问题投了反对票,因为我认为这不是一个帮助家庭作业的地方。它没有为SO存档添加任何有用的内容:没有人会搜索“低效的分而治之算法”,而且该示例非常简单和人为,对正在工作的程序员有任何帮助。当你没有像以前那样多地学习时,这也会占用别人的时间。(我知道我们都有自己的特殊情况,有时非常困难,但这是我的观点。)@SergeyOrshanskiy这是应该避免分治算法的两种情况之一。。。作为一名程序员,我认为知道何时编写迭代或递归代码很重要。。。这也是我现在想的,但这会是n的复杂指数吗。。。我会继续尝试的。你确实在标题中提到了“低效”这个词。也许这就是这个问题的全部要点,以表明使用“分而治之”可以实现近乎指数级的时间复杂度。我同意措辞有点奇怪。。。我最终发现复杂性是C(n)=p^(n/a)+[(p^(n/a)-1)/(p-1)],这将是一个大的O(p^n),它是指数型的。