这是我在stackoverflow中的第一篇文章。
我需要为财务应用程序建议算法。假设我们有2个这样的数字列表(是的,它们是银行交易):
List 1 | List 2
-------------------------------------
1000 | 200
7000 | 300
3000 | 10000
16000 | 500
| 16000
| 4100
考虑到某些条件,我需要将数字相互匹配:
匹配可以是一对一,一对多,甚至多对多。因此,这里两个16000匹配(一对一),列表1中的1000匹配列表2中的200 + 300 + 500(一到三),列表2中的10000匹配列表1中的7000 + 3000(一个 - 至二),等等。
一个数字可用于多个匹配。
两个列表中的数字可能相同或不同。
应设置一对多匹配中的最大数字。
多对多比赛不是必须的。但如果我们也拥有它们会很好!
有些数字可能无法比拟。没关系。
我正在做的是使用两个复杂的嵌套循环。它有效,但随着数字的数量或每场比赛中允许的最大数量增加,完成需要很长时间!
有没有更好的算法来做到这一点?
答案 0 :(得分:3)
我认为我是正确的断言,如果我错了,SO会给我一个踢,你计算的内核是NP-hard,这意味着你(非常)不太可能找到一个多项式时间解决方案。您的内核是给定一个数字(例如10000
)和其他数字的列表,查找列表中所有与该单个数字相加的子集。
此内核是subset sum problem的变体。
鉴于此,您可以找到的算法有多好,并且您对找到“快速”算法的期望可能会令人失望。
为了使您的算法更快,我建议您首先对两个列表进行排序。从列表1中取第一个数字,从列表2中取出小于或等于列表1中的数字的所有数字,找出匹配项,重复...然后按列号逐个列出数字...
答案 1 :(得分:0)
要执行此操作,首先要生成每个列表的组合。例如,对于列表1,组合是:
1000
3000
7000
16000个
1000 3000
1000 7000
1000 16000
3000 7000
3000 16000
7000 16000
1000 3000 7000
1000 3000 16000
1000 7000 16000
3000 7000 16000
1000 3000 7000 16000
对于每个组合,您可以生成组合中项目的总和。现在你有两个总和列表。要解决问题,请将两个列表相交。有各种算法来执行交集。一种简单的方法是将两个列表中较小的一个放入二叉树中。然后,对于较大列表中的每个项目,您可以在二叉树中找到它。该算法具有n * log(n)时间复杂度。