Cela m'a été demandé lors d'une interview et voici la solution que j'ai apportée:
public static int[] merge(int[] a, int[] b) {
int[] answer = new int[a.length + b.length];
int i = 0, j = 0, k = 0;
while (i < a.length && j < b.length)
{
if (a[i] < b[j])
{
answer[k] = a[i];
i++;
}
else
{
answer[k] = b[j];
j++;
}
k++;
}
while (i < a.length)
{
answer[k] = a[i];
i++;
k++;
}
while (j < b.length)
{
answer[k] = b[j];
j++;
k++;
}
return answer;
}
Existe-t-il un moyen plus efficace de le faire?
Edit: méthodes de longueur corrigées.
while (i < a.length && j < b.length) answer[k++] = a[i] < b[j] ? a[i++] : b[j++];
Spécification du langage Java: Opérateur conditionnel? : .Réponses:
Une amélioration mineure, mais après la boucle principale, vous pouvez utiliser
System.arraycopy
pour copier la queue de l'un ou l'autre des tableaux d'entrée lorsque vous arrivez à la fin de l'autre. Cela ne changera pas leO(n)
caractéristiques de performance de votre solution.la source
Est un peu plus compact mais exactement le même!
la source
Je suis surpris que personne n'ait mentionné cette implémentation beaucoup plus cool, efficace et compacte:
Points d'intérêts
System.arraycopy
gagneraient parce qu'en interne, il peut le faire avec une seule instruction d'assemblage x86.a[i] >= b[j]
au lieu dea[i] > b[j]
. Cela garantit la «stabilité» qui est définie comme lorsque les éléments de a et b sont égaux, nous voulons des éléments de a avant b.la source
j < 0
,b
est déjà épuisé, nous continuons donc à ajouter lesa
éléments restants auanswer
tableauToutes les améliorations qui pourraient être apportées seraient des micro-optimisations, l'algorithme global est correct.
la source
System.arrayCopy()
est stupidement rapide car il utilise desmemcpy
appels optimisés pour le processeur . Il est donc possible d'améliorer les performances en copiant des morceaux. Il est également possible de rechercher binaire les limites.Cette solution est également très similaire à d'autres articles, sauf qu'elle utilise System.arrayCopy pour copier les éléments restants du tableau.
la source
Voici la fonction mise à jour. Il supprime les doublons, j'espère que quelqu'un trouvera cela utilisable:
la source
Cela peut être fait en 4 déclarations comme ci-dessous
la source
sort
fonction ne peut pas s'utiliser comme méthode de tri. Ce serait une régression infinie au lieu d'une récursivité. L'autre prémisse est également que merge_array est la fonction qui implémente le tri. Cette réponse est donc inutilisable dans le contexte le plus probable.J'ai dû l'écrire en javascript, le voici:
la source
Les collections Apache prennent en charge la méthode collate depuis la version 4; vous pouvez le faire en utilisant la
collate
méthode dans:Voici une citation de javadoc:
Ne réinventez pas la roue! Référence du document: http://commons.apache.org/proper/commons-collections/apidocs/org/apache/commons/collections4/CollectionUtils.html
la source
GallopSearch Merge: O (log (n) * log (i)) plutôt que O (n)
Je suis allé de l'avant et j'ai mis en œuvre la suggestion de barbe grise dans les commentaires. Surtout parce que j'avais besoin d'une version critique très efficace de ce code.
Cela devrait être le moyen le plus efficace de le faire, avec une complexité temporelle de O (log (n) * log (i)) plutôt que O (n). Et dans le pire des cas, la complexité temporelle de O (n). Si vos tableaux sont groupés et ont de longues chaînes de valeurs ensemble, cela éclipsera toute autre façon de le faire, sinon ce sera juste mieux qu'eux.
Il a deux valeurs de lecture aux extrémités du tableau de fusion et la valeur d'écriture dans le tableau de résultats. Après avoir découvert quelle est la valeur finale la moins élevée, il effectue une recherche galopante dans ce tableau. 1, 2, 4, 8, 16, 32, etc. Lorsqu'il trouve la plage où la valeur lue de l'autre tableau est plus grande. Il recherche binaire dans cette plage (coupe la plage de moitié, recherche la moitié correcte, répète jusqu'à une valeur unique). Ensuite, le tableau copie ces valeurs dans la position d'écriture. En gardant à l'esprit que la copie est, par nécessité, déplacée de telle sorte qu'elle ne puisse pas écraser les mêmes valeurs de l'un ou l'autre des tableaux de lecture (ce qui signifie que le tableau d'écriture et le tableau de lecture peuvent être identiques). Il effectue ensuite la même opération pour l'autre tableau qui est maintenant connu pour être inférieur à la nouvelle valeur de lecture de l'autre tableau.
Cela devrait être le moyen le plus efficace de le faire.
Certaines réponses avaient une capacité de suppression en double. Cela nécessitera un algorithme O (n) car vous devez en fait comparer chaque élément. Voici donc une solution autonome pour cela, à appliquer après coup. Vous ne pouvez pas galoper à travers plusieurs entrées si vous avez besoin de les regarder toutes, bien que vous puissiez galoper à travers les doublons, si vous en aviez beaucoup.
Mise à jour: réponse précédente, code pas horrible mais clairement inférieur à ce qui précède.
Encore une hyper-optimisation inutile. Il appelle non seulement arraycopy pour les bits de fin, mais aussi pour le début. Traitement de tout non-chevauchement introductif dans O (log (n)) par une recherche binaire dans les données. O (log (n) + n) est O (n) et dans certains cas, l'effet sera assez prononcé, en particulier dans les cas où il n'y a pas du tout de chevauchement entre les tableaux de fusion.
la source
That is totally what the implemented Arrays.sort does
( Cela : de la première révision de votre réponse - ou - de mon commentaire du 19 février?) - ne peut pas trouver non plus dans le JDK 8 de Sunsoft: de quelle implémentation deArrays.sort
parlez-vous?Voici une forme abrégée écrite en javascript:
la source
la source
a[mid+1 .. hi]
àaux
des?Je pense que l'introduction de la liste à sauter pour le plus grand tableau trié peut réduire le nombre de comparaisons et peut accélérer le processus de copie dans le troisième tableau. Cela peut être utile si le tableau est trop grand.
la source
la source
la source
for (int i, j, k = i = j = 0 ; k < c.length ; ) c[k++] = b.length <= j || i < a.length && a[i] < b[j] ? a[i++] : b[j++];
. En quoi diffère-t-elle de la réponse d' Andrew en 2014 ?L'algorithme pourrait être amélioré de plusieurs manières. Par exemple, il est raisonnable de vérifier si
a[m-1]<b[0]
oub[n-1]<a[0]
. Dans aucun de ces cas, il n'est pas nécessaire de faire plus de comparaisons. L'algorithme pourrait simplement copier les tableaux source dans le résultat dans le bon ordre.Des améliorations plus compliquées peuvent inclure la recherche de pièces entrelacées et l'exécution d'un algorithme de fusion pour elles uniquement. Cela pourrait gagner beaucoup de temps, lorsque la taille des tableaux fusionnés diffère plusieurs fois.
la source
Ce problème est lié à l'algorithme de tri de fusion, dans lequel deux sous-tableaux triés sont combinés en un seul sous-tableau trié. Le CLRS livre donne un exemple de l'algorithme et élimine le besoin de vérifier si la fin a été atteinte en ajoutant une valeur sentinelle (quelque chose qui compare et "plus grande que toute autre valeur") à la fin de chaque tableau.
J'ai écrit ceci en Python, mais cela devrait aussi bien se traduire en Java:
la source
Vous pouvez utiliser 2 threads pour remplir le tableau résultant, un de l'avant, un de l'arrière.
Cela peut fonctionner sans aucune synchronisation dans le cas des nombres, par exemple si chaque thread insère la moitié des valeurs.
la source
la source
la source
la source
Mon langage de programmation préféré est JavaScript
la source
Peut-être utiliser System.arraycopy
la source
La sortie est:
1, 2, 3, 4, 5, 6, 8, 9, 10, 100, 999, 1001,
la source
arr2
nonind2
, maistemp
.Vous pouvez utiliser des opérateurs ternaires pour rendre le code un peu plus compact
la source
Juste un petit différent de la solution originale
la source
Pour limiter deux tableaux triés en complexité de temps O (m + n), utilisez l'approche ci-dessous avec une seule boucle. m et n sont la longueur du premier tableau et du second tableau.
la source
la source
Puisque la question ne prend pas de langage spécifique. Voici la solution en Python. En supposant que les tableaux sont déjà triés.
Approche 1 - Utilisation de tableaux numpy: importer numpy
Approche 2 - En utilisant la liste, en supposant que les listes sont triées.
la source
Since the question doesn't assume any specific language
à partir de 2011/5/11/19: 43, il est tagué java ..sort()
c'estO(n log n)
au mieuxVoici mon implémentation java qui supprime les doublons.
la source