这种模式是否简化为一个简单的公式,可能是一个递归的公式?

时间:2016-10-30 01:59:53

标签: arrays algorithm recursion time-complexity dynamic-programming

我写的蛮力写到N=4,我想知道是否可以用一个简单的递归公式来表达它。

f({A}) = 1 * (A) 
       = A

f({A,B}) = 2 * (A + B) + 1 * (A) + 1 * (B) 
         = 3A + 3B

f({A,B,C}) = 3*(A+B+C)+2*(A+B)+2*(B+C)+2*(A)+1*(B)+2*(C)
           = 7A + 8B + 7C

f({A,B,C,D}) = 4*(A+B+C+D)+3*(A+B+C)+3*(B+C+D)+4*(A+B)+2*(B+C)+4*(C+D)+4*(A)+2*(B)+2*(C)+4*(C)
             = 15A + 18B + 18C + 15D

我实际上不确定通过原始数组的连续子部分(如我上面每个等于的第一部分)或单个数字来查看它们是否更重要。

我看到如果我按个别数字对它们进行分组,则第一个和最后一个是2^n - 1,其中n是数组的大小。

2 个答案:

答案 0 :(得分:1)

我想我开始在这里看到一个模式,看看数据

F([A])       =   A
F([A,B])     =  3A +  3B
F([A,B,C])   =  7A +  8B +  7C
F([A,B,C,D]) = 15A + 18B + 18C + 15D

按公共因素对它们进行分组,并将其留在附加内容

F([A])       =   A
F([A,B])     =  3(A+B)
F([A,B,C])   =  7(A + B + C) + B
F([A,B,C,D]) = 15(A + B + C + D) + 3(B+C)

他们出现的模式是跟随

F([]) = 0
F(X)  = (2^n-1)*sum(X) + F(center(X))

其中n是X的大小,sum(X)是X中元素的总和,center(X)是一个删除给定数组的第一个和最后一个元素的函数

然后下一个是

F([A,B,C,D,E]) = 31(A+B+C+D+E) + F([B,C,D])
               = 31(A+B+C+D+E) + 7(B+C+D) + C
               = 31A + 38B + 39C + 38D + 31E  

答案 1 :(得分:0)

看一下这个模式,我想出了一个与Copperfield略有不同的解决方案,即在没有更多中心的情况下继续重新应用中心逻辑,而不是只应用一次:

F(x) = (2^n - 1) * sum(x) + F(center(x)) + F(center(center(x)) ....

F({A}) = 1A
F({A,B}) = 3A + 3B
F({A,B,C}) = 7A + 8B + 7C 
F({A,B,C,D}) = 15A + 18B + 18C + 15D
F({A,B,C,D,E}) = 31A + 38B + 40C + 38D + 31E
F({A,B,C,D,E,F}) = 63A + 78B + 84C + 84D + 78E + 63F

结果是相同的,直到F({A,B,C,D,E}),其中C项比Copperfield大一个:

F({A,B,C,D,E}) = 31(A+B+C+D+E) + F({B,C,D}) + F({C})
               = 31(A+B+C+D+E) + 7(B+C+D) + C + C
               = 31A + 38B + 40C + 38D + 31E

从那里差异增加。可以从提供的数据中进行解释,直到OP提供下一个术语以查看哪个解决方案是正确的(或者两者都是错误的。)

最后,OP的最后一个等式在最终术语中似乎是一个错误:

f({A,B,C,D}) = 4*(A+B+C+D)+3*(A+B+C)+3*(B+C+D)+4*(A+B)+2*(B+C)+4*(C+D)+4*(A)+2*(B)+2*(C)+4*(C)

可能应该是:

f({A,B,C,D}) = 4*(A+B+C+D)+3*(A+B+C)+3*(B+C+D)+4*(A+B)+2*(B+C)+4*(C+D)+4*(A)+2*(B)+2*(C)+4*(D)