Похоже, этот алгоритм не является оптимальным. Рассмотрим случай [-3, -2, -2, 3, 4], где положительное значение указывает на кредитора, а отрицательное указывает на должника. Используя описанный алгоритм, мы требуем четыре операции транзакции, чтобы выбить все долги:
>> [-3, -2, -2, 3, 4]
>> [0, -2, -2, 3, 1] ([0] pays [4])
>> [0, 0, -2, 1, 1] ([1] pays [3])
>> [0, 0, -1, 1, 0] ([2] pays [4])
>> [0, 0, 0, 0, 0] ([2] pays [3])
Но вы можете видеть, что долги могут быть очищены с помощью трех транзакций: человек, который должен 3 доллара, платит человеку, зачисленному 3 доллара. и затем двое, каждый из которых должен 2 доллара, платят человеку, который должен 4 доллара.
На самом деле, я считаю, что цель описанного алгоритма состоит в том, чтобы минимизировать общую сумму транзакций, а не количество транзакций, которые он делает и что может быть доказано (хотя я не буду пытаться это здесь).