Sebagai contoh, harga tukaran mata wang asing yang diperolehi ialah:
Baris pertama menunjukkan bahawa setiap 1 yuan boleh ditukar dengan 0.116 paun. Setiap tiga kali ganda (c1, c2, r) sepadan dengan dua tepi berwajaran: c1 -> c2 weighted r dan c2 -> c1 weighted 1/r. Petikan ini sebenarnya memberikan graf terarah:
Adalah diandaikan di sini bahawa triplet yang diberikan tidak akan membawa kepada percanggahan, dan graf yang diarahkan disambungkan (tidak akan ada ketidakfahaman). Graf terarah ini ditulis sebagai matriks bersebelahan berwajaran:
Elemen matriks A[i,j] mewakili berapa banyak unit i mata wang boleh ditukar dengan 1 unit j mata wang. Sifar dalam matriks menunjukkan bahawa kadar pertukaran semasa tidak diketahui.
Pendaraban matriks
Mendarab matriks A boleh mengeluarkan unsur sifar ini secara beransur-ansur. Tetapi penambahan mengira hasil darab titik dalam pendaraban matriks biasa perlu digantikan dengan operasi "dapatkan nombor pertama lebih besar daripada sifar, atau sifar jika tidak". Contohnya: (1,2,3).(0,3,2) = first_positive(1*0, 2*3, 3*2) = 6.
Gunakan "Pendaraban Kadar Pertukaran" untuk mengira kuasa AA^k mewakili jadual kadar pertukaran yang ditukar paling banyak k-1 langkah, dan pengiraan diteruskan sehingga tiada sifar dalam A^k. Jika terdapat n mata wang, sehingga A^(n-1) akan dikira.
A^3:
Perhatikan baris pertama A^3, ia adalah perbandingan harga semua mata wang berbanding RMB. Perbandingan mana-mana dua mata wang adalah hasil bagi perbandingan mereka dengan RMB. Jadi sebenarnya, hanya gunakan baris pertama A untuk mengambil bahagian dalam pengiraan pada permulaan: A[1] * A * ... * A (最多n-1次), setiap kali vektor baris dan matriks didarab sehingga semua elemen baris itu bukan sifar. Kerumitan pengiraan ini ialah O(n³).
Floyd-Warshal
Laraskan perhubungan rekursi dalam algoritma laluan terpendek Floyd-Warshal dan ia juga boleh digunakan untuk penukaran kadar pertukaran dalam soalan ini. Kerumitan Floyd-Warshal ialah Θ(n³). Jadi pendaraban matriks mungkin lebih cepat.
for k from 1 to rows(A)
for i from 1 to rows(A)
for j from 1 to rows(A)
if A[i][j] = 0 then
// 货币 i, j 通过货币 k 折算
A[i][j] <- A[i][k] * A[k][j]
end if
Kedua-dua algoritma perlu menyimpan matriks kadar pertukaran, jadi kerumitan ruang ialah Θ(n²).
Jika tatasusunan tiga kali ganda disediakan, hasilkan penyelesaian optimum untuk mengira kadar pertukaran x->y: Algoritma Laluan Terpendek Graf Berarah
Jika anda menyediakan tatasusunan tiga kali ganda yang berbeza setiap kali, anda hanya perlu mendapatkan satu hasil: algoritma pencarian laluan graf terarah
Idea: Triplet -> Graf terarah ->
Sebagai contoh, harga tukaran mata wang asing yang diperolehi ialah:
Baris pertama menunjukkan bahawa setiap 1 yuan boleh ditukar dengan 0.116 paun. Setiap tiga kali ganda
(c1, c2, r)
sepadan dengan dua tepi berwajaran:c1 -> c2 weighted r
danc2 -> c1 weighted 1/r
. Petikan ini sebenarnya memberikan graf terarah:Adalah diandaikan di sini bahawa triplet yang diberikan tidak akan membawa kepada percanggahan, dan graf yang diarahkan disambungkan (tidak akan ada ketidakfahaman). Graf terarah ini ditulis sebagai matriks bersebelahan berwajaran:
Elemen matriks
A[i,j]
mewakili berapa banyak uniti
mata wang boleh ditukar dengan 1 unitj
mata wang. Sifar dalam matriks menunjukkan bahawa kadar pertukaran semasa tidak diketahui.Pendaraban matriks
Mendarab matriks
A
boleh mengeluarkan unsur sifar ini secara beransur-ansur. Tetapi penambahan mengira hasil darab titik dalam pendaraban matriks biasa perlu digantikan dengan operasi "dapatkan nombor pertama lebih besar daripada sifar, atau sifar jika tidak". Contohnya:(1,2,3).(0,3,2) = first_positive(1*0, 2*3, 3*2) = 6
.Gunakan "Pendaraban Kadar Pertukaran" untuk mengira kuasa
A
A^k
mewakili jadual kadar pertukaran yang ditukar paling banyakk-1
langkah, dan pengiraan diteruskan sehingga tiada sifar dalamA^k
. Jika terdapatn
mata wang, sehinggaA^(n-1)
akan dikira.A^3
:Perhatikan baris pertama
A^3
, ia adalah perbandingan harga semua mata wang berbanding RMB. Perbandingan mana-mana dua mata wang adalah hasil bagi perbandingan mereka dengan RMB. Jadi sebenarnya, hanya gunakan baris pertamaA
untuk mengambil bahagian dalam pengiraan pada permulaan:A[1] * A * ... * A (最多n-1次)
, setiap kali vektor baris dan matriks didarab sehingga semua elemen baris itu bukan sifar. Kerumitan pengiraan ini ialah O(n³).Floyd-Warshal
Laraskan perhubungan rekursi dalam algoritma laluan terpendek Floyd-Warshal dan ia juga boleh digunakan untuk penukaran kadar pertukaran dalam soalan ini. Kerumitan Floyd-Warshal ialah Θ(n³). Jadi pendaraban matriks mungkin lebih cepat.
Kedua-dua algoritma perlu menyimpan matriks kadar pertukaran, jadi kerumitan ruang ialah Θ(n²).
Jika tatasusunan tiga kali ganda disediakan, hasilkan penyelesaian optimum untuk mengira kadar pertukaran x->y: Algoritma Laluan Terpendek Graf Berarah
Jika anda menyediakan tatasusunan tiga kali ganda yang berbeza setiap kali, anda hanya perlu mendapatkan satu hasil: algoritma pencarian laluan graf terarah
Tuple boleh digunakan sebagai kunci dict
Sesetengah daripada algoritma di atas sangat rumit untuk ditulis. Mari kita tulis yang mudah:
Keputusan ujian adalah seperti berikut:
rrreeeApa yang digunakan di sini ialah keunikan nama mata wang Kedua-dua mata wang mestilah unik apabila disambungkan bersama.