Python程式:查詢貨幣套利
假設我們有一個 N x N 的貨幣匯率表。我們需要檢查是否存在一些交易序列。現在,從任意貨幣的某個金額 A 開始,我們能否最終獲得大於 A 的該貨幣金額。假設沒有交易成本,並且可以交易小數數量。
該矩陣中 [I, j] 處的數值表示用一個單位的貨幣 i 可以購買的貨幣 j 的數量。現在考慮貨幣 0 是美元 (USD),1 是加拿大元 (CAD),2 是歐元 (EUR)。我們可以透過以下方式進行套利:
出售 1 加拿大元,獲得 0.65 歐元
出售 0.65 歐元,獲得 0.7865 美元 (0.65 * 1.21)
出售 0.7865 美元,獲得 1.00672 加拿大元 (0.65 * 1.21 * 1.28)
所以,如果輸入類似於:
1 | 1.28 | 0.82 |
0.78 | 1 | 0.65 |
1.21 | 1.55 | 1 |
那麼輸出將為 True。
為了解決這個問題,我們將遵循以下步驟:
對於範圍從 0 到矩陣大小的 i,執行以下操作
對於範圍從 0 到 matrix[0] 大小的 j,執行以下操作
matrix[i,j] := -log 以 2 為底 (matrix[I, j]) 的值
v := 矩陣的行數
對於範圍從 0 到 v 的 k,執行以下操作
對於範圍從 0 到 v 的 i,執行以下操作
對於範圍從 0 到 v 的 j,執行以下操作
matrix[I, j] := matrix[I, j] 和 (matrix[I, k] + matrix[k, j]) 中的最小值
如果矩陣對角線上任何元素非零,則返回 True。
讓我們看下面的實現來更好地理解:
Python
import math class Solution: def solve(self, matrix): for i in range(len(matrix)): for j in range(len(matrix[0])): matrix[i][j] = −math.log(matrix[i][j], 2) v = len(matrix) for k in range(0, v): for i in range(0, v): for j in range(0, v): matrix[i][j] = min(matrix[i][j], matrix[i][k] + matrix[k][j]) return any(matrix[i][i] < 0 for i in range(len(matrix))) ob = Solution() matrix = [ [1, 1.28, 0.82], [0.78, 1, 0.65], [1.21, 1.55, 1] ] print(ob.solve(matrix))
輸入
matrix = [ [1, 1.28, 0.82], [0.78, 1, 0.65], [1.21, 1.55, 1] ]
輸出
True
廣告