Idée : Triplet -> Graphique dirigé -> Trouver le chemin de deux nœuds quelconques -> Multiplication matricielle ou Floyd-Warshal.
Par exemple, le prix de change obtenu est :
La première ligne indique que chaque yuan peut être échangé contre 0,116 livre. Chaque triple (c1, c2, r) correspond à deux arêtes pondérées : c1 -> c2 weighted r et c2 -> c1 weighted 1/r. Ces citations donnent en fait un graphique orienté :
On suppose ici que le triplet donné ne conduira pas à des contradictions, et que le graphe orienté est connexe (il n'y aura pas d'incompréhension). Ce graphe orienté s'écrit sous forme de matrice de contiguïté pondérée :
L'élément matriciel A[i,j] représente le nombre d'unités de i devise pouvant être échangées contre 1 unité de j devise. Les zéros dans la matrice signifient que le taux de change actuel est inconnu.
Multiplication matricielle
Multiplier les matrices A permet de supprimer progressivement ces éléments nuls. Mais l'ajout du calcul du produit scalaire dans la multiplication matricielle ordinaire doit être remplacé par l'opération "obtenir le premier nombre supérieur à zéro, ou zéro sinon". Par exemple : (1,2,3).(0,3,2) = first_positive(1*0, 2*3, 3*2) = 6.
Utilisez "Multiplication du taux de change" pour calculer la puissance de A représente le tableau des taux de change converti au plus A^k pas, et le calcul continue jusqu'à ce qu'il n'y ait plus de zéro dans k-1. S'il y a A^k devises, jusqu'à n sera calculé. A^(n-1)
: A^3
Observez la première ligne de
, c'est la comparaison des prix de toutes les devises par rapport au RMB. La comparaison de deux monnaies est le quotient de leur comparaison avec le RMB. Donc en fait, il suffit d'utiliser la première ligne de A^3 pour participer au calcul du début : A, à chaque fois le vecteur ligne et la matrice sont multipliés jusqu'à ce que tous les éléments de la ligne soient non nuls. La complexité de ce calcul est O(n³). A[1] * A * ... * A (最多n-1次)
Floyd-Warshal
Ajustez la relation de récursion dans l'algorithme du chemin le plus court
Floyd-Warshal et elle peut également être utilisée pour la conversion du taux de change dans cette question. La complexité de Floyd-Warshal est Θ(n³). La multiplication matricielle pourrait donc être plus rapide.
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
Les deux algorithmes doivent stocker la matrice du taux de change, donc la complexité spatiale est Θ(n²).
Si un tableau de triplets est fourni, générez une solution optimale pour calculer le taux de change x->y : algorithme de plus court chemin à graphique dirigé
Si vous fournissez un triple tableau différent à chaque fois, vous n'avez besoin d'obtenir qu'un seul résultat : un algorithme de recherche de chemin à graphe orienté
Idée : Triplet -> Graphique dirigé -> Trouver le chemin de deux nœuds quelconques -> Multiplication matricielle ou Floyd-Warshal.
Par exemple, le prix de change obtenu est :
La première ligne indique que chaque yuan peut être échangé contre 0,116 livre. Chaque triple
(c1, c2, r)
correspond à deux arêtes pondérées :c1 -> c2 weighted r
etc2 -> c1 weighted 1/r
. Ces citations donnent en fait un graphique orienté :On suppose ici que le triplet donné ne conduira pas à des contradictions, et que le graphe orienté est connexe (il n'y aura pas d'incompréhension). Ce graphe orienté s'écrit sous forme de matrice de contiguïté pondérée :
L'élément matriciel
A[i,j]
représente le nombre d'unités dei
devise pouvant être échangées contre 1 unité dej
devise. Les zéros dans la matrice signifient que le taux de change actuel est inconnu.Multiplication matricielle
Multiplier les matrices
A
permet de supprimer progressivement ces éléments nuls. Mais l'ajout du calcul du produit scalaire dans la multiplication matricielle ordinaire doit être remplacé par l'opération "obtenir le premier nombre supérieur à zéro, ou zéro sinon". Par exemple :(1,2,3).(0,3,2) = first_positive(1*0, 2*3, 3*2) = 6
.Utilisez "Multiplication du taux de change" pour calculer la puissance de
A
représente le tableau des taux de change converti au plusA^k
pas, et le calcul continue jusqu'à ce qu'il n'y ait plus de zéro dansk-1
. S'il y aA^k
devises, jusqu'àn
sera calculé.A^(n-1)
:
Observez la première ligne deA^3
, c'est la comparaison des prix de toutes les devises par rapport au RMB. La comparaison de deux monnaies est le quotient de leur comparaison avec le RMB. Donc en fait, il suffit d'utiliser la première ligne de
Floyd-WarshalA^3
pour participer au calcul du début :A
, à chaque fois le vecteur ligne et la matrice sont multipliés jusqu'à ce que tous les éléments de la ligne soient non nuls. La complexité de ce calcul est O(n³).A[1] * A * ... * A (最多n-1次)
Floyd-Warshal et elle peut également être utilisée pour la conversion du taux de change dans cette question. La complexité de Floyd-Warshal est Θ(n³). La multiplication matricielle pourrait donc être plus rapide.
Les deux algorithmes doivent stocker la matrice du taux de change, donc la complexité spatiale est Θ(n²).Si un tableau de triplets est fourni, générez une solution optimale pour calculer le taux de change x->y : algorithme de plus court chemin à graphique dirigé
Si vous fournissez un triple tableau différent à chaque fois, vous n'avez besoin d'obtenir qu'un seul résultat : un algorithme de recherche de chemin à graphe orienté
Les tuples peuvent être utilisés comme clés de dict
Certains des algorithmes ci-dessus sont très compliqués à écrire. Écrivons-en un simple :
Les résultats des tests sont les suivants :
rrreeeCe qui est utilisé ici, c'est le caractère unique du nom de la devise. Les deux devises doivent être uniques lorsqu'elles sont associées.