У нас есть ряд платежей (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;
}
}
[Неверный сайт] (http://meta.stackexchange.com/q/165519/299295) Я думаю ... – Sinatr
Много ли повторяющихся значений в списке? – samgak
Нет, все значения уникальны, мы в настоящее время работаем над тем, чтобы сузить список, который мы выбираем, но это, вероятно, не повлияет на множество. – anothershrubery