如何快速判断此集合的任何子集是否满足此条件?

时间:2012-03-12 04:46:22

标签: algorithm computer-science subset subset-sum

我知道这是一个NP难题,但我们的很多用户都在请求此功能(基本上,您当前订单中的任何一组项目是否符合我们运行的其中一项交易?或者是否您当前订单中的项目集加上另一项是否合格?)

由于提供功能更多是关于用户使用方便而不是找到正确的答案我一直在考虑使用快捷方式来执行此操作而不需要太长时间,例如,如果有超过X个项目,则不运行算法,其中X是数字这会导致明显滞后,或者只通过算法运行最近添加的X项。

有没有人在提出建议之前处理过类似的问题?

1 个答案:

答案 0 :(得分:2)

想想pidgeonhole。对于所有情况,该方法是O(m + n)复杂度。

将每个“交易”合并到一组规则中,然后循环遍历这些项目,将它们添加到每个满足其规则的pidgeonhole中。

然后循环交易,从pidgeonholes中拉出物品,如果它们在那里。

示例:

"blue car", "red car", "yellow expensive car", "red expensive car", "cheap car"

优惠:

buy a red car, get a blue car for free
buy an expensive car, get a cheap car for free

我们可以推断出的“规则”:

is_red, is_expensive, is_blue, is_cheap

所以我们有2个洞,is_red和is_expensive。循环遍历这些项目,将它们添加到满足其规则的所有孔中,从而产生这些漏洞:

is_red ( "red car", "red expensive car" )
is_expensive ( "red expensive car", yellow expensive car" )
is_blue ( "blue car" )
is_cheap ( "cheap car" )

然后循环交易:

buy a red car, get a blue car for free
is_red contains "red car", is_blue contains "blue car", so:
    pop them from the holes and make them a deal

下一笔交易:

buy an expensive car, get a cheap car for free
is_expensive doesn't contain any cars