Comment croiser deux tableaux entiers triés sans doublons?

C'est une question d'entrevue que j'utilise comme un exercice de programmation.

D'entrée: Deux triés entier matrices A et B dans l'ordre croissant et de différentes tailles N et M, respectivement

De sortie: triés tableau d'entiers C dans l'ordre croissant, qui contient des éléments qui apparaissent à la fois dans A et B

Contraintes: Pas les doublons sont autorisés dans C

Exemple: Pour l'entrée A = {3,6,8,9} et B = {4,5,6,9,10,11}, la sortie doit être C = {6,9}

Merci pour vos réponses à tous! Pour résumer, il existe deux principales approches à ce problème:

Ma solution originale était de garder les deux pointeurs, l'un pour chaque tableau, et la numérisation des matrices de gauche à droite de façon interchangeable, tout en reprenant les éléments qui correspondent. Ainsi, lorsque nous l'élément courant d'un tableau est plus grand que le second tableau, nous gardons l'incrémentation du pointeur de la deuxième rangée jusqu'à nous, l'actuel premier élément de tableau ou le viaduc (trouver un plus). Je garde tous appariés dans un tableau séparé, qui est retourné une fois que nous arrivons à la fin d'une des entrées des tableaux.

Une autre façon que nous pourrions faire, c'est de scanner l'un des tableaux de façon linéaire, en utilisant binaire de recherche pour trouver une correspondance dans le second tableau. Cela voudrait dire O(N*log(M)), si l'on analyse Un et pour chacun de ses de N éléments binaires de recherche sur B (O(log(M)) de temps).

J'ai mis en place les deux approches et mené une expérience pour voir comment les deux se comparer (plus de détails sur ce qui peut être trouvé ici). La méthode de Recherche Binaire semble gagner lorsque M est d'environ 70 fois plus grand que N, lorsque N est 1 millions d'éléments.

source d'informationauteur Artur Galiullin | 2012-02-10