已知外汇牌价折算汇率
碰到了一个关于元组的算法问题
请大家帮忙看看,能不能给个答案,或者解决思路也行.
谢谢!
三元组(a,b,c)标识a币种到b币种的汇率为c,反向亦成立。
输入一堆这样的三元组,再指定两个币种x y,问x->y的汇率是多少?
请编程实现,并给出时间、空间复杂度。
注意:x->y的汇率是唯一的。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
思路:三元组 -> 有向图 -> 求任两节点的路径 -> 矩阵乘法或Floyd-Warshal。
比如获取的外汇牌价是:
第一行表示,每1元人民币可以兑换0.116英镑。每个三元组
(c1, c2, r)
对应两条带权重的边:c1 -> c2 weighted r
和c2 -> c1 weighted 1/r
。这些牌价实际上给出一个有向图:这里假设给出的三元组不会导出矛盾,且有向图是联通的(不会有折算不到的情况)。这个有向图写成带权重的邻接矩阵就是:
矩阵元素
A[i,j]
表示1单位i
币种可以兑换多少单位的j
币种。矩阵中的零代表目前汇率未知。矩阵乘法
把矩阵
A
连乘可以逐步去除这些零元素。但是要把普通矩阵相乘中计算点积的加法替换成“取第一个大于零的数,若没有则为零”的操作。例如:(1,2,3).(0,3,2) = first_positive(1*0, 2*3, 3*2) = 6
。用“汇率乘法”计算
A
的乘方,A^k
表示最多经过k-1
步折算得到的汇率表,一直算到A^k
中没有零停止。如果有n
种货币,最多计算到A^(n-1)
。A^3
:观察
A^3
的第一行,它是所有货币对人民币的比价。任两种货币的比价就是把它们对人民币的比价的商。所以其实一开始用A
的第一行参加计算就好:A[1] * A * ... * A (最多n-1次)
,每次进行的是行向量和矩阵的乘法,直到行的所有元素非零结束。这个计算的复杂度是O(n³)。Floyd-Warshal
调整一下求最短路径算法Floyd-Warshal中的递推关系,也可以用于本题的汇率折算。Floyd-Warshal的复杂度是Θ(n³)。所以用矩阵乘法可能会更快一些。
两种算法都需要存储汇率矩阵,所以的空间复杂度都是Θ(n²)。
如果是提供三元组数组,生成一个计算 x->y 汇率的方式的最优解: 有向图最短路径算法
如果是每次提供不同的三元组数组,只需要获取一个结果就好: 有向图寻路算法
元组可以作为 dict 的 key
上面的有些算法写得好复杂,写个简单的:
测试结果如下:
这里利用的是币种名字的唯一性,两个币种拼接在一起必然也是唯一的。
我用python实现了这个题,并且托管了完整的代码,其中的算法思想希望能帮到你。链接:https://crb912.github.io/blog...