Это почти не зависящий от языка вопрос, а не домашнее задание. В идеале я бы использовал 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, сколько бы долларов это ни стоило.
Моя цель - сэкономить на транзакционных издержках и отменить заказы, в том числе транзитивность. Учет покупок и продаж между одной и той же парой валют легко осуществить, и это легко оправдать. Скажем так, у меня может быть деловая причина упростить заказ, когда я покупаю фунты стерлингов за доллары США, а также покупаю евро за фунты стерлингов и так далее ...
Я хочу транзитивно упростить этот набор заказов. Я думал построить структуру данных графа (узлы - это валюты, а ребра - это buyCurrencyAmounts), даже если данные будут храниться в таблицах SQL, и применить к этому правильный алгоритм. Я подумал о том, чтобы сначала выполнить простую сетку, а затем топологическую сортировку на DAG, затем начать сверху, затем пройти по топологическому порядку и «сжать» порядки вниз, например упрощая их.
Проблема в том, что у меня не обязательно будет DAG. Но тогда я, вероятно, буду упрощать структуру графа по мере выполнения алгоритма, какой бы он ни был.
Какую правильную структуру данных / алгоритм мне следует использовать для этого? Стоит ли беспокоиться о полученной точности? Есть ли какие-нибудь хорошие способы не терять центы на ходу? Можете ли вы порекомендовать хорошую библиотеку C #, которая справится с этим? Было бы безумно / неэффективно / слишком много работы пытаться сделать это, используя только SQL Server 2008?
РЕДАКТИРОВАТЬ. Все комиссии за транзакции включены в цену (обменный курс). Нет фиксированной фиксированной платы или чего-то подобного.
GetExchangeRates(A,B) * GetExchangeRates(B,A) == 1
? - person unkulunkulu   schedule 25.07.2011GetExchangeRate(...)
, которая будет выполняться вO(1)
. Мы предполагаем, что процесс взаимозачета никогда не пересекает полночь. - person Hamish Grubijan   schedule 25.07.2011