Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 这个模式是否简化为一个简单的公式,可能是一个递归公式?_Arrays_Algorithm_Recursion_Time Complexity_Dynamic Programming - Fatal编程技术网

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

Arrays 这个模式是否简化为一个简单的公式,可能是一个递归公式?,arrays,algorithm,recursion,time-complexity,dynamic-programming,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

我已经用蛮力写出了
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
是数组的大小。

我想我开始看到一个模式,查看数据

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  

看看这个模式,我提出了一个与科波菲尔稍有不同的解决方案,即继续重新应用中心逻辑,直到没有更多的中心,而不是只应用一次:

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项比科波菲尔项大一:

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)

我不清楚你在遵循什么样的模式。对于f({A,B,C,D}),为什么没有3*(A+B+D)的术语?您是否排除了“跳过”字母的术语?@Carser是的,这就是为什么我说“连续小节”“连续小节”出现在上面,但不清楚它是否是您模式的一部分。不管怎么说,你是用每个小节乘以它们的长度,对吗?我只是要求澄清一下,这样我们就可以避免做出假设。规则并不那么清楚,例如,在本部分的第三种情况下,
2*(A)+1*(B)+2*(C)
为什么只有B乘以1??在最后一个例子中,为什么没有单独的D?对于每个“相邻的子部分”,每个系数的规则是什么?