【发布时间】:2023-04-05 00:33:02
【问题描述】:
我们每天都有许多付款 (Transaction) 进入我们的业务。每个Transaction 都有一个ID 和一个Amount。我们要求将其中一些交易与特定金额相匹配。示例:
Transaction Amount
1 100
2 200
3 300
4 400
5 500
如果我们想找到总和为 600 的交易,您将有多个集合 (1,2,3),(2,4),(1,5)。
我找到了一个我已经适应的算法,它的工作原理如下。 30 笔交易需要 15 毫秒。但交易数量平均约为 740,最大接近 6000。执行此搜索的效率更高吗?
sum_up(TransactionList, remittanceValue, ref MatchedLists);
private static void sum_up(List<Transaction> transactions, decimal target, ref List<List<Transaction>> matchedLists)
{
sum_up_recursive(transactions, target, new List<Transaction>(), ref matchedLists);
}
private static void sum_up_recursive(List<Transaction> transactions, decimal target, List<Transaction> partial, ref List<List<Transaction>> matchedLists)
{
decimal s = 0;
foreach (Transaction x in partial) s += x.Amount;
if (s == target)
{
matchedLists.Add(partial);
}
if (s > target)
return;
for (int i = 0; i < transactions.Count; i++)
{
List<Transaction> remaining = new List<Transaction>();
Transaction n = new Transaction(0, transactions[i].ID, transactions[i].Amount);
for (int j = i + 1; j < transactions.Count; j++) remaining.Add(transactions[j]);
List<Transaction> partial_rec = new List<Transaction>(partial);
partial_rec.Add(new Transaction(n.MatchNumber, n.ID, n.Amount));
sum_up_recursive(remaining, target, partial_rec, ref matchedLists);
}
}
Transaction 定义为:
class Transaction
{
public int ID;
public decimal Amount;
public int MatchNumber;
public Transaction(int matchNumber, int id, decimal amount)
{
ID = id;
Amount = amount;
MatchNumber = matchNumber;
}
}
【问题讨论】:
-
Wrong site 我想...
-
列表中是否有很多重复值?
-
不,所有值都是唯一的,我们目前正在努力缩小我们从中选择的列表,但它可能不会对集合产生太大影响。
-
@Sinatr 我认为这是正确的领域,因为我正在专门研究我拥有的算法的当前 C# 实现。
-
@anothershrubery,codereview - 你有工作代码并想要改进它,programmers - 最佳算法(语言不可知或
c#)。如果您有错误(不工作的代码)或遇到问题(性能),Stackoverflow 很好。我不是坚持,但我认为你有更好的算法。另一件事是你没有解释你的,但它看起来像直接的(递归迭代),内存效率很高但性能很差。
标签: c# algorithm performance subset-sum