84669 人が学習中
152542 人が学習中
20005 人が学習中
5487 人が学習中
7821 人が学習中
359900 人が学習中
3350 人が学習中
180660 人が学習中
48569 人が学習中
18603 人が学習中
40936 人が学習中
1549 人が学習中
1183 人が学習中
32909 人が学習中
碰到了一个关于元组的算法问题
请大家帮忙看看,能不能给个答案,或者解决思路也行.
谢谢!
三元组(a,b,c)标识a币种到b币种的汇率为c,反向亦成立。 输入一堆这样的三元组,再指定两个币种x y,问x->y的汇率是多少? 请编程实现,并给出时间、空间复杂度。 注意:x->y的汇率是唯一的。
光阴似箭催人老,日月如移越少年。
アイデア: トリプレット -> 有向グラフ -> 行列乗算またはフロイド・ウォーシャル。
たとえば、取得される外国為替価格は次のとおりです:
最初の行は、1 元ごとに 0.116 ポンドに交換できることを示しています。各トリプル (c1, c2, r) は、次の 2 つの重み付きエッジに対応します。 /コード>。これらの引用符は実際に有向グラフを与えます: (c1, c2, r)对应两条带权重的边:c1 -> c2 weighted r和c2 -> c1 weighted 1/r。这些牌价实际上给出一个有向图:
(c1, c2, r)
c1 -> c2 weighted r
c2 -> c1 weighted 1/r
这里假设给出的三元组不会导出矛盾,且有向图是联通的(不会有折算不到的情况)。这个有向图写成带权重的邻接矩阵就是:
矩阵元素A[i,j]表示1单位i币种可以兑换多少单位的j币种。矩阵中的零代表目前汇率未知。
A[i,j]
i
j
把矩阵A连乘可以逐步去除这些零元素。但是要把普通矩阵相乘中计算点积的加法替换成“取第一个大于零的数,若没有则为零”的操作。例如:(1,2,3).(0,3,2) = first_positive(1*0, 2*3, 3*2) = 6。
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^k
k-1
n
A^(n-1)
A^3:
A^3
观察A^3的第一行,它是所有货币对人民币的比价。任两种货币的比价就是把它们对人民币的比价的商。所以其实一开始用A的第一行参加计算就好:A[1] * A * ... * A (最多n-1次)
A[1] * A * ... * A (最多n-1次)
ここでは、与えられたトリプレットは矛盾を生じず、有向グラフはつながっている(変換漏れはない)と仮定します。この有向グラフは、重み付き隣接行列として記述されます。
A[1] * A * ... * A (n-1 回まで)
トリプルの配列が提供された場合、x->y 為替レートを計算するための最適解を生成します: 有向グラフ最短経路アルゴリズム
毎回異なるトリプル配列を指定した場合、取得する必要がある結果は 1 つだけです: 有向グラフ経路探索アルゴリズム
タプルは辞書のキーとして使用できます
上記のアルゴリズムの一部は作成が非常に複雑です。簡単なアルゴリズムを書いてみましょう。 リーリー
リーリー
アイデア: トリプレット -> 有向グラフ -> 行列乗算またはフロイド・ウォーシャル。
たとえば、取得される外国為替価格は次のとおりです:
最初の行は、1 元ごとに 0.116 ポンドに交換できることを示しています。各トリプル
(c1, c2, r)
は、次の 2 つの重み付きエッジに対応します。 /コード>。これらの引用符は実際に有向グラフを与えます:(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次)
ここでは、与えられたトリプレットは矛盾を生じず、有向グラフはつながっている(変換漏れはない)と仮定します。この有向グラフは、重み付き隣接行列として記述されます。
A[i,j]
は、i
通貨 1 単位と交換できる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
の最初の行に注目してください。これは、人民元に対するすべての通貨の価格比較です。 2 つの通貨の比較は、人民元との比較の商となります。したがって、実際には、A
の最初の行を使用して計算に参加するだけです:A[1] * A * ... * A (n-1 回まで)
、毎回 行ベクトルと行列の乗算は、行のすべての要素がゼロ以外になるまで実行されます。この計算の複雑さは O(n³) です。 🎜 🎜フロイド・ウォーシャル🎜 🎜最短経路アルゴリズム🎜Floyd-Warshal🎜で再帰関係を調整します。これは、この質問の為替レート変換にも使用できます。 🎜フロイド-ウォーシャル🎜の複雑さはΘ(n³)です。したがって、行列の乗算は高速になる可能性があります。 🎜 リーリー 🎜どちらのアルゴリズムも為替レート行列を保存する必要があるため、空間複雑度は Θ(n²) です。 🎜トリプルの配列が提供された場合、x->y 為替レートを計算するための最適解を生成します: 有向グラフ最短経路アルゴリズム
毎回異なるトリプル配列を指定した場合、取得する必要がある結果は 1 つだけです: 有向グラフ経路探索アルゴリズム
タプルは辞書のキーとして使用できます
リーリー上記のアルゴリズムの一部は作成が非常に複雑です。簡単なアルゴリズムを書いてみましょう。 リーリー
テスト結果は次のとおりです:リーリー
ここで使用されるのは通貨名の一意性です。結合される 2 つの通貨は一意である必要があります。