【问题标题】:Find Arbitrage with graph theory用图论找到套利
【发布时间】:2019-12-05 19:25:02
【问题描述】:

我正在尝试解决这个问题:https://open.kattis.com/problems/arbitrage

如果你要去参加世界总决赛,你不能依赖 捷克皇冠。你将不得不用你的钱来换取各种 外币。这个问题涉及多种货币和 他们的汇率。你的任务是验证一些交换 利率是安全的,即检测所谓套利的可能性。

套利是买卖操作的无风险组合 从市场价格的不平衡中获利。价格可能 适用于各种事物,通常是证券交易所,但也适用于货币。

输入 输入由几个测试用例组成。每个案例都以 一行包含一个正整数??????,1≤????≤200,该数 货币。

每个测试用例的第二行包含 ????货币代码分开 由一个空格。每个代码由3个大写字母和所有代码组成 在一个测试用例中是不同的。

第三行包含一个整数??????,0≤????≤????⋅(????−1), 可用的汇率数量。以下各项????线条 包含以下格式的一个汇率:第一种货币 代码、空格、第二货币代码、空格、整数 ??????????、冒号 (':') 和整数 ??????????。含义如下:如果您付款 ??????第一个货币的单位,你会得到?????????的单位 第二种货币。你可以假设 1≤????????,????????≤100 并且这两个 货币不同。

最后一个测试用例后面跟着一行 ????=0。

我的方法是在每个节点上做一个 dfs,检查是否有一个乘积大于 1 的循环。

这在O(n^2) 中运行。

有更快的解决方案吗?

【问题讨论】:

    标签: algorithm graph


    【解决方案1】:

    为了澄清,这个问题有两个输入大小的度量; C 是货币数量,R 是可用汇率数量。使用每种货币的 DFS 的“蛮力”解决方案是 O(C² + CR),通常 R 可以达到 O(C²) 本身。

    这个问题可以建模为在图中找到一个负权循环。节点是货币,边是汇率对,对于汇率 r,边权重是 -log(r)。使用负对数意味着当且仅当汇率的乘积大于 1 时,一个周期的权重之和为负。

    通常通过采用标准最短路径算法来找到负权重循环,例如 O(CR) 时间内的Bellman-Ford,或 O(C³) 时间的 Floyd-Warshall。在 R 为 O(C) 或更大的情况下,这些都没有比您的解决方案渐近更好,但可能值得进行基准测试,看看替代方案在实践中是否更快。

    【讨论】:

    • 实际上,我刚刚意识到基于 dfs 的方法将是 n^3 :) 我必须维护给定路径中访问的所有节点的副本 - 这是 O(n)。
    • 每次运行 DFS 都需要 O(C + R) 时间,并且您正在为每个 C 节点执行 DFS,因此 O(C² + CR)。在 R 为 O(C²) 的情况下,这是 O(C³);在这种情况下,贝尔曼力也是 O(C³)。在 DFS 中跟踪循环中的节点序列并不需要渐近更多的时间或空间。
    • 我不确定在这种情况下每次运行 dfs 是否需要 O(C + R) 时间。我对 dfs 的目标是检查,如果我从顶点 u 开始,我可以循环回到 u。对于以 u 为根的每条路径,我必须维护迄今为止在该路径中看到的所有节点的集合。维持这个集合是 O(n)
    • 每次运行 DFS 确实需要 O(C + R) 时间,无论您是否将访问过的节点记录在一个集合中。我不知道你是用 n 来表示货币的数量还是汇率对的数量,但是在 O(C + R) 时间和空间不会改变复杂性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-30
    • 2011-07-06
    • 1970-01-01
    • 2012-11-11
    • 1970-01-01
    相关资源
    最近更新 更多