动态规划:产品总和

时间:2009-11-29 02:37:19

标签: algorithm statistics dynamic-programming

假设您有两个相同长度的列表,L1和L2,N。我们将prodSum定义为:

def prodSum(L1, L2) :
    ans = 0
    for elem1, elem2 in zip(L1, L2) :
        ans += elem1 * elem2

    return ans

假设L1被排序,是否有一种有效的算法可以找到L2的排列数,使得prodSum(L1,L2)<1。一些预先指定的值?

如果它可以简化问题,你可以假设L1和L2都是来自[1,2,...,N]的整数列表。

编辑:Managu的回答让我确信,如果不假设L1和L2是来自[1,2,...,N]的整数列表,这是不可能的。我仍然对采用这种约束的解决方案感兴趣。

4 个答案:

答案 0 :(得分:9)

答案 1 :(得分:8)

可能没有(没有简化的假设):你的问题是NP-Hard。这是SUBSET-SUM的一个微不足道的缩减。设count_perms(L1, L2, x)表示函数“计算L2的排列数,使得prodSum(L1,L2)&lt; x”

SUBSET_SUM(L2,n): # (determine if any subset of L2 adds up to n)
    For i in [1,...,len(L2)]
        Set L1=[0]*(len(L2)-i)+[1]*i
        calculate count_perms(L1,L2,n+1)-count_perms(L1,L2,n)
        if result positive, return true
    Return false

因此,如果有办法有效地计算你的函数count_perms(L1, L2, x),那么我们将有一个有效的算法来计算SUBSET_SUM(L2,n)。

答案 2 :(得分:2)

这也证明是一个抽象的代数问题。这对我来说已经有一段时间了,但这里有一些事情要开始。关于以下内容没有什么特别重要的(这是非常基本的;扩展了每个组与排列组同构的事实),但它提供了一种不同的方式来查看问题。

我会尝试坚持相当标准的符号:“ x ”是一个向量,而“ x i ”就是我 x th 组件。如果“L”是列表, L 是等效向量。 “ 1 n ”是一个所有分量= 1的向量。自然数集ℕ被认为是正整数。 “[a,b]”是从a到b的整数集,包括端点。 “θ( x y )”是由 x y

形成的角度

注意prodSum是点积。问题相当于找到L2上的操作(置换元素)生成的所有向量 L ,使得θ( L1 L )小于给定角度α。该操作相当于通过子空间反映ℕ n 中的一个点并显示:

  

&LT; ℕ n | (<强> X <子> I <强> X <子>Ĵ -1 )<子>(I,J )∈A&gt;

其中i和j在[1,n]中,A至少有一个元素而且(i,i)在A中(即A是非[1,n] 2 的反身子集,其中| A |&gt; 0)。更明确地(并且更模糊地)陈述,子空间是一个或多个组件等于一个或多个其他组件的点。反射对应于矩阵,其列是所有标准基矢量。

让我们将反射组命名为“RP n ”(它应该有另一个名称,但内存失败)。 RP n 与对称组S n 同构。因此

  

| RP <子>名词 | = | S n | = n!

在3维中,这给出了一组6阶。反射组是D 3 ,三角形对称组,作为立方体对称组的子组。事实证明,你也可以通过沿着 1 n 的线围绕π/ 3的增量旋转 L2 来生成点。这是模块化组ℤ 6 ,这指出了一个可能的解决方案:找到一组n阶!使用最少数量的生成器并使用它来生成L2的排列作为序列,其中 L2 增加,然后减小,角度。从那里,我们可以尝试用θ( L1 L )生成元素 L &lt;直接α(例如我们可以在每个序列的前半部分进行binsearch以找到转换点;使用它,我们可以指定满足条件的其余序列并在O(1)时间内计算它)。我们称这个组为RP' n

RP' 4 由4个子空间构成,这些子空间与ℤ 6 同构。更一般地,RP' n 由n个子空间构成,与RP' n-1 同构。

这是我的抽象代数肌肉真正开始失败的地方。我会继续努力进行施工,但是Managu的回答并没有留下太多希望。我担心将RP 3 减少到ℤ 6 是我们可以做出的唯一有用的减少。

答案 3 :(得分:0)

看起来如果l1和l2都被排序为高 - >低(或低 - >高,无论如何,如果它们具有相同的顺序),结果最大化,并且如果它们是有序的,那么结果最小化,其他顺序的改变似乎遵循一些规则;在连续的整数列表中交换两个数字总是将总和减少一个固定的数量,这似乎与它们的距离相关(即交换1和3或2和4具有相同的效果)。这只是一点点麻烦,但想法是有一个最大值,一个最小值,如果它们之间有一些预先指定的值,就有办法计算使这种情况成为可能的排列(尽管如果;列表不是均匀间隔,然后没有。好吧,不是我所知道的。如果l2是(1 2 4 5)交换1 2和2 4会产生不同的影响)