Donné sont deux tableaux triés a , b de type T de taille n et m . Je recherche un algorithme qui fusionne les deux tableaux dans un nouveau tableau (de taille maximale n + m).
Si vous avez une opération de comparaison bon marché, c'est assez simple. Prenez simplement dans le tableau avec le premier élément le plus bas jusqu'à ce qu'un ou les deux tableaux soient complètement traversés, puis ajoutez les éléments restants. Quelque chose comme ceci /programming/5958169/how-to-merge-two-sorted-arrays-into-a-sorted-array
Cependant, la situation change lorsque la comparaison de deux éléments est beaucoup plus coûteuse que la copie d'un élément du tableau source vers le tableau cible . Par exemple, vous pouvez avoir un tableau de grands nombres entiers de précision arbitraire, ou chaînes, où une comparaison peut être assez coûteuse. Supposons simplement que la création de tableaux et la copie d'éléments sont gratuits, et la seule chose qui coûte est de comparer les éléments.
Dans ce cas, vous souhaitez fusionner les deux tableaux avec un nombre minimum de comparaisons d'éléments . Voici quelques exemples où vous devriez pouvoir faire beaucoup mieux que l'algorithme de fusion simple:
a = [1,2,3,4, ... 1000]
b = [1001,1002,1003,1004, ... 2000]
Ou
a = [1,2,3,4, ... 1000]
b = [0,100,200, ... 1000]
Il y a des cas où l'algorithme de fusion simple sera optimal, comme
a = [1,3,5,7,9,....,999]
b = [2,4,6,8,10,....,1000]
Donc, l'algorithme devrait idéalement se dégrader avec élégance et effectuer un maximum de n + m-1 comparaisons au cas où les tableaux seraient entrelacés, ou du moins ne seraient pas significativement plus mauvais.
Une chose qui devrait très bien fonctionner pour les listes avec une grande différence de taille serait d'utiliser la recherche binaire pour insérer les éléments du plus petit tableau dans le plus grand tableau. Mais cela ne se dégradera pas gracieusement dans le cas où les deux listes sont de la même taille et entrelacées.
La seule chose disponible pour les éléments est une fonction de commande (totale), donc tout schéma qui rend les comparaisons moins chères n'est pas possible.
Des idées?
J'ai trouvé ce morceau à Scala . Je pense qu'il est optimal en ce qui concerne le nombre de comparaisons, mais il est au-delà de ma capacité de le prouver. Au moins, c'est beaucoup plus simple que ce que j'ai trouvé dans la littérature.
Et depuis la publication originale, j'ai écrit un article de blog sur la façon dont cela fonctionne.