【问题标题】:Solution to Subset Sum problem with high sums and decimal places高和小数位子集和问题的解决方案
【发布时间】:2011-07-08 16:29:28
【问题描述】:

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

1) 集合中大约有 1,000 个数字(可能会增长到几千个)

2) 总额达到数十亿

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

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

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

这可行吗?

-克里普

【问题讨论】:

  • 我不太清楚你想要什么。能给我举个例子吗?或者一个示例实现(可能很慢)
  • “终于整个进程运行了1000次”---所以每个进程都有不同的数字集?
  • Jacob,是的,对于 1000 倍的外部运行,数字和总和不同
  • 您需要一个精确的解决方案还是一个近似值就足够了?我非常怀疑你能否找到一个精确有效的精确算法,因为问题是 NP 完全的。

标签: c# algorithm subset-sum


【解决方案1】:

我假设您已经了解 DP 伪多边形算法,这几乎是唯一可以远程(以获得最佳答案)处理 1,000 个元素的方法

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

例如,

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 个元素,而且范围很大,你可能会遇到麻烦。

【讨论】:

  • 我喜欢通过乘以 100 转换为整数的想法。需要考虑一下您帖子的其余部分...谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-21
  • 2020-11-04
  • 1970-01-01
  • 2020-07-13
  • 1970-01-01
相关资源
最近更新 更多