Это почти не зависящий от языка вопрос, а не домашняя работа. В идеале я бы использовал C # и / или SQL-сервер для решения.
Предположим, у меня есть функция GetExchangeRate(buyCurrency, sellCurrency)
. Так, если 1 фунт стоит 1,6 доллара, то GetExchangeRate('GBP', 'USD') = 1.6
и GetExchangeRate('USD', 'GBP') = 0.625
.
Заказы в системе будут представлены следующими триплетами: (buyCurrency, SellCurrency, buyCurrencyAmount)
. Таким образом, ('GBP', 'USD', 125.00) означает купить 125 фунтов стерлингов, сколько бы долларов это ни стоило.
Моя цель - сэкономить на транзакционных издержках и отменить заказы, включая транзитивность. Учет покупок и продаж между одной и той же парой валют легко сделать и легко обосновать. Скажем так, у меня может быть бизнес-причина упростить заказ, когда я покупаю GBP за USD, а также покупаю EUR за GBP и так далее ...
Я хочу транзитивно упростить этот набор заказов. Я думал о построении структуры данных графа (узлы - это валюты, а ребра - buyCurrencyAmounts), хотя данные будут храниться в таблицах SQL, и применяя для этого правильный алгоритм. Я подумал о том, чтобы сначала сделать простую сетку, затем выполнить топологическую сортировку в группе обеспечения доступности баз данных, затем начать сверху, затем идти в топологическом порядке и «сжимать» порядки вниз, например, упрощая их.
Проблема в том, что у меня не обязательно будет DAG. Но тогда я, вероятно, буду упрощать структуру графа при выполнении алгоритма, какой бы он ни был.
Какую структуру данных / алгоритм мне следует использовать для этого? Должен ли я беспокоиться о точности? Есть ли хорошие подходы, чтобы не терять центы на ходу? Можете ли вы порекомендовать хорошую библиотеку C #, которая справится с этим? Было бы сумасшедшим / неэффективным / слишком много работы, чтобы попытаться сделать это, используя только SQL Server 2008?
РЕДАКТИРОВАТЬ: Все сборы, уплачиваемые за транзакции, включены в цену (обменный курс). Там нет фиксированной фиксированной платы или что-то в этом роде.