une variante à l'algo proposé dans ton lien est la suivante:
(ca reste pas très malin non plus)
on considère ta matrice M comme une matrice d'adjacence.
Idem on considère les noeuds.
on considère la matrice A, dont les éléments sont de type Block
Block contient
- liste de chemins
un chemin étant un tableau de noeuds (tous différents)
Block définit pour
- l'addition:
result = Block(b1.listeChemins.concat(b2)) // et on elimine deux chemins identiques
- la multiplication:
1 2 3 4 5 6 7
| result = Block([].concatIf(b1.listeChemin, b2.listeChemin, function(cheminb1, cheminb2){
si aucun des noeuds de cheminb1 sont dans cheminb2
si aucun des noeuds de cheminb2 sont dans cheminb1
si pour tous les noeuds de cheminb1 il existe une liaison avec chacun des noeuds de cheminb2
si idem de cheminb2 vers cheminb1
return true
}) |
- la nullité (ya un nom mais j'ai oublié xD)
qqsoit n, result = Block de taille n * Block de taille 0 donne un Block de taille 0 (on considère Block de taille 0 comme l'élément absorbant 0)
- la taille:
taille dun des chemins de listeChemins
la taille d'un chemin étant le nombre de noeuds _distincts_ dans le chemin.
ainsi un block de taille k * un block de taille n va donner un block de taille k+n
L'idée est donc d'exponentiatier (...) la matrice du genre
T = A*A //A^2
T = T*T //A^4
T = T*T //A^8
T = T*T //A^16 etc
jusqu'à ce que T soit vide, puis après on trouve k, tq A^k non nulle et A^(k+1) nulle.
k définissant alors notre plus grand chemin tel que tous les noeuds sont en relation
l'idée sous jacente, c'est que dans un block, on considère que tous les noeuds d'un chemin sont en relation. donc on s'épargne ces tests.
evidemment, on explose avec le stockage des données, mais comme t'as l'air d'avoir des tera à disposition...
Partager