我在Java程序中有不同的金融资产对,比如EURUSD
,EURGBP
,EURCHF
等等。。。
更具体地说,我有两对:
EURUSD, EURGBP, EURCHF, XAUUSD, XAUXAG, XAGUSD
XAGNZD, AUDCHF, AUDHKD, CADHKD, CADSGD, NZDCAD
SGDHKD
我需要找到列表中没有的对的最短转换链。
例如,如果需要将
EUR
转换为NZD
(因此我需要EURNZD
对),可以看到它不在我的列表中。要进行此转换,我可以使用以下两个转换链(甚至不止这两个):
chain1: EURUSD->USDXAU->XAUXAG->XAGNZD
chain2: EURUSD->USDCHF->CHFAUD->AUDHKD->HKDCAD->CADNZD
所以,在这两个转换链中,我会选择1号,它是可用转换链中最短的。
我的问题是,你能给我推荐一个找到这条最短路径的最佳算法吗你能推荐一个伪代码吗?
谢谢
最佳答案
图上的标准Breadth First Search可以做到这一点,使用货币作为节点,并在两个节点之间进行转换时连接它们(当然,这将是一个无向图)。
上面我喜欢的维基百科页面上的伪代码是
1 procedure BFS(G,v) is
2 create a queue Q
3 create a vector set V
4 enqueue v onto Q
5 add v to V
6 while Q is not empty loop
7 t ← Q.dequeue()
8 if t is what we are looking for then
9 return t
10 end if
11 for all edges e in G.adjacentEdges(t) loop
12 u ← G.adjacentVertex(t,e)
13 if u is not in V then
14 add u to V
15 enqueue u onto Q
16 end if
17 end loop
18 end loop
19 return none
20 end BFS
其中g是图形,v是您开始的节点(在您的示例中是eur)。在将之前访问的节点添加到q(第15行)时,您应该稍微修改一下,以便在找到目标节点(第9行)时重建路径。