有关套汇的一个算法题目,请大家帮忙.说说思路也好.

chirish 2005-06-13 01:22:47
在外汇市场上,将1个单位的某种货币通过多次兑换,获得多于1个单位的同种货币,称为套汇(Arbitrage)。例如,如果1个单位的A货币可以兑换46.4个单位的B货币, 1个单位的B货币可以兑换2.5个单位的C货币,1个单位的C货币可以兑换0.0091个单位的A货币,则1个单位的A货币可以通过这三次兑换获得46.42.50.0091=1.0556个单位的A货币,这就称为套汇(获利5.56%)。现在假设给定了若干种货币及其两两之间的兑换率,请你帮助找到一种套汇方式(或判定该外汇市场上不存在套汇的可能)。
(1) 请对该问题构造一个网络优化模型,并说明建立该模型的理由(即说明该模型为什么是正确的)。
(2) 针对你所建立的网络优化模型,设计一个算法找到一种套汇方式(或判定该外汇市场上不存在套汇的可能)。
(3) 分析你所给出的算法的计算复杂度。
...全文
258 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
mmmcd 2005-06-15
  • 打赏
  • 举报
回复
Floyd算法:
中间点:k是最外循环变量
内循环:考察<u,v> , <u,k>,<k,v>

这三个循环变量的顺序不是乱来的。
mmmcd 2005-06-15
  • 打赏
  • 举报
回复
应该用Floyd算法:

For(k=1;k<=N;k++){
For(u=1;u<=N;u++){
For(v=1;v<=N;v++){
if(X(u,k)X(k,v)>X(u,v)){
X(u,v)=X(u,k)X(k,v)
Y(u,v)=Merge(Y(u,k),Y(k,v));
}
}
}
}

复杂度O(n^3)
mathe 2005-06-15
  • 打赏
  • 举报
回复
假设现在有N种货币,其中第u种1元可以兑换成第v种X(u,v)元
那么我们现在有一个N*N的矩阵X,
另外再保存一个N*N的列表Y,其中Y(u,v)表示将货币u兑换成v当前使用的方案,表示成
一个长度最多为N+1的列表,刚开始X(u,u)=1, Y(u,u)=Nil (空表), Y(u,v)={u,v}
For(i=1;i<=N){
For(u=1;u<=N;u++){
For(v=1;v<=N;v++){
For(k=1;k<=N;k++){
if(X(u,k)X(k,v)>X(u,v)){
X(u,v)=X(u,k)X(k,v)
Y(u,v)=Merge(Y(u,k),Y(k,v));
}
}
}
}
}
For(u=1;u<=N;u++){
If(X(u,u)>1){
Output(Y(u,u));
}
}

复杂度O(n^4)
mathe 2005-06-15
  • 打赏
  • 举报
回复
to mmmcd,
你只走了一趟,对于很大的环不行的
我的代码就是将你的重复运行N次,保证最差情况下(有一个长度为N的环)也可以找到.
当然实际上,运行到若干步,如果已经发现某个X(u,u)>1就可以退出了.

33,028

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧