具有高和和小数位的子集求和问题的解决方案

时间:2011-07-08 16:29:28

标签: c# algorithm subset-sum

寻找针对此特定情况的子集求和问题的解决方案(在C#或其他算法中):

1)大约有1000个数字(可能会增长到几千)

2)总和达到了数十亿美元

3)数字是货币值,因此具有两位小数的精度(例如2,345.17)

4)集合中的数字既可以是正数也可以是负数(所以处理净额)

然后我需要重复此搜索(使用相同的数字组)但不同的总和,最多1,000次。最后整个过程运行了1000次。所以我们看着1,000,000次运行。目标是在2分钟内完成。这意味着每次运行时间不应超过0.12 ms。

这可行吗?

-Krip

1 个答案:

答案 0 :(得分:0)

我假设你已经知道了DP伪多边形算法,这对于1,000个元素来说几乎是唯一的远程(对于最佳答案)易于处理的方法

通常实现算法的方式涉及最大总和的大小数组,每个数组表示该索引处数字的不同存储桶。要使其适应小数,您需要将数据从十进制转换为整数(乘以100)。您也可以使用set数据结构来实现它,这可能更容易和节省空间。

如,

import copy
j = {0:1}
lst = [1,2,8,2.3,214]

for i in lst:
    newj = copy.copy(j)
    for k in j:
        newj[k+i]=1
    j = newj

使用不同的总和重复子集和算法应该不是问题 - 如果您遵循DP算法,您将计算所有可能的总和,然后您可以每次重新检查您的集合以获得新的总和。

真正的问题是你的集合的大小,因为它会随着算法的进展而增长。在更糟糕的病态情况下,集合的大小将随着元素的数量呈指数增长(每个总和是唯一的,2 ^ n个元素)。如果有一些重叠,你会更好。我猜测1000个元素虽然范围很大,但你可能遇到了麻烦。