Algorithme de fusion
Les algorithmes de fusion de sont une famille des algorithmes qui fonctionnent séquentiellement au-dessus des listes de assorties par multiple, produisant typiquement les listes plus assorties comme rendement. C'est bien adapté pour des machines avec des systèmes d'entraînement de bande magnétique de que l'utilisation de a diminué en raison des mémoires à accès sélectif de grand , et beaucoup d'applications des algorithmes de fusion ont des solutions de rechange plus rapides quand vous avez une mémoire à accès sélectif qui contient toutes vos données.
L'algorithme général de fusion a un réglé par des indicateurs p0.n de qui indiquent des positions dans un ensemble de listes L0. Au commencement ils indiquent le premier article dans chaque liste. L'algorithme est comme suit : Tandis que n'importe lequel de p0.n indique toujours des données à l'intérieur de L0.n au lieu de après l'extrémité : faire quelque chose avec le point des données élémentaires p0.n à dans leur fusion de la fonction (a, b) résultat de la liste la variété international i, j de la variété : = 0 tandis que (d'I < de longueur (a)) et (j < longueur (b)) si a < b ajouter a pour résulter i : = I + 1 d'autre ajouter b pour résulter j : = j + 1 tandis que i < longueur (a) ajouter a pour résulter i : = I + 1 tandis que j < longueur (b) ajouter b pour résulter j : = j + 1 résultat de retour du La fusion classique (celle utilisée dans sorte de fusion ) produit la donnée élémentaire avec la plus basse clef à chaque étape ; donné quelques listes assorties, elle produit une liste assortie contenant tous les éléments dans les listes l'unes des d'entrée, et elle fait ainsi à temps proportionnel à la somme des longueurs des listes d'entrée. STL de s de C++ le 'a le Pseudo-code
Une exécution non récurrente simple de pseudo-code de fusion avec deux listes pourrait être écrite comme suit : Analyse
Les algorithmes de fusion fonctionnent généralement à temps proportionnel à la somme des longueurs des listes ; fusionner les algorithmes qui actionnent dessus un grand nombre de listes immédiatement multiplieront la somme des longueurs des listes avant que pour figurer dehors qui des points d'indicateurs au plus bas article, qui peut être accompli avec un tas - la file d'attente à priorité déterminée basée de dans le O (lg  ; temps du n ), pour O (  de m ; lg  ; temps du n ) (où le n est le nombre de listes étant fusionnées, le m est la somme des longueurs des listes, et l'atterrisseur de est base  de la notation de ; 2). En fusionnant deux listes de m de longueur, il y a une limite inférieure 2 de   du m ; &minus ;   ; les comparaisons 1 ont exigé dans le pire des cas. Utilisations
La fusion peut également être employée pour une série d'autres choses :
donné un ensemble de balances courantes et un ensemble de transactions, tous les deux assortis par numéro de compte, produisent l'ensemble de nouveaux équilibres de compte après que les transactions soient appliquées ; ceci exige avancer toujours le " ; nouveau transactions" ; indicateur de préférence au " ; number" de compte ; indicateur quand les deux ont des clefs égales, et ajouter tous les nombres sur l'une ou l'autre bande avec le même numéro de compte pour produire le nouvel équilibre.
produire une liste assortie des disques avec des clefs actuelles dans toutes les listes (equijoin) ; ceci exige produire un disque toutes les fois que les clefs de tout le p0.
pareillement pour trouver le plus grand nombre sur une bande plus petit que chaque nombre sur une autre bande (par exemple pour figurer dehors quelle tranche d'imposition d'imposition chaque personne est dedans).
pareillement pour des différences réglées de calcul : tous les disques dans une liste sans les disques correspondants dans des autres.
opérations d'insertion/mise à jour dans des moteurs de recherche de pour produire un index inversé
le fusionnement joue un rôle central dans le technique de la programmation fonctionnelle de s de Dijkstra 'pour produire des nombres de militaire de carrière de Exemple très simple du SML
fusion d'amusement (a, b) = si a@b de b=nil d'orelse d'a=nil puis autrement si hd (a)
C
fusion vide (flotteur v, début d'international, international mi, extrémité d'international) { international i, j, k ; tmp de float* = malloc (sizeof (flotteur) * (extrémité - début + 1)) ; i = début ; j = mi ; k = 0 ; tandis que ((I < mi) && (extrémité de <= de j)) { si (<= de v v) { tmp = v ; si (== de v v) j++ ; i++ ; } autrement tmp = v ; } tandis que (I < mi) tmp = v ; tandis que (extrémité de <= de j) tmp = v ; pour (I = 0 ; i < (extrémité - début + 1) ; i++) v = tmp ; libérer (tmp) ; }
le std de fonction : : merge qui fusionne deux a assorti les gammes des iterators, et le std de fonction : : inplace_merge qui fusionne le assorti consécutif sur place de deux gammes. En outre, le std : : la classe de list (liste chaînée) a sa propre méthode de merge qui fusionne une autre liste dans elle-même. Le type des éléments fusionnés doit soutenir < opérateur, ou vous devez lui fournir un comparateur fait sur commande.
Random links: Milford, Nébraska | Middlesex, New York | Mésophile | Samba (danse brésilienne) | Wattlebird | Algoritmo_de_la_fusión