Suche nach gemeinsamen Elemente in beiden arrays unterschiedlicher Größe
Ich habe ein problem, finde gemeinsame Elemente in zwei arrays, und das ist von unterschiedlicher Größe.
Nehmen , Array A1
Größe n
- und Array - A2
Größe m
und m != n
So weit, ich habe versucht, zu iterieren von Listen und kopieren von Elementen zu einer anderen Liste. Wenn das element bereits enthält, markieren Sie es, aber ich weiß, es ist keine gute Lösung.
InformationsquelleAutor der Frage Jijoy | 2010-12-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sortieren der arrays. Dann Durchlaufen Sie mit zwei Zeigern, immer vorantreiben der eine zeigt auf den kleineren Wert. Wenn Sie verweisen auf die gleichen Werte, Sie haben einen gemeinsamen Wert. Dies wird O(n+m), wobei n und m sind die Größen der beiden Listen. Es ist wie ein verschmelzen in merge-sortsondern wo Sie produzieren nur Ausgabe, wenn die Werte zu wies zu gleich sind.
Ausgänge
Wenn die Elemente nicht vergleichbar sind, werfen Sie die Elemente von einer Liste in eine hashmap und überprüfen Sie die Elemente in der zweiten Liste gegen die hashmap.
InformationsquelleAutor der Antwort marcog
Wenn Sie wollen, um es effizient würde ich konvertieren Sie das kleinere array in ein hashset und dann Durchlaufen der größeren array und prüfen, ob das aktuelle element enthalten war, in das hashset. Die hash-Funktion ist effizienter im Vergleich zur Sortierung von arrays. Sortieren von arrays ist teuer.
Hier ist mein Beispielcode
Ausgabe:
Gemeinsame Elemente [6, 9, 10]
InformationsquelleAutor der Antwort Jacorb Effect
In APL:
Beispiel:
InformationsquelleAutor der Antwort StackPC
Sieht aus wie nested loops:
Schouldn alles nichts, wenn die arrays haben die gleiche Größe.
Je nach Sprache und framework, das verwendet wird, set-Operationen in handliches kommen könnte.
InformationsquelleAutor der Antwort Eiko
Versuchen heapifying beiden arrays, gefolgt von einem merge zu finden, um die Kreuzung.
Java-Beispiel:
Sehen diese Frage weitere Beispiele für die Zusammenführung.
InformationsquelleAutor der Antwort finnw
Die Komplexität dessen, was ich gebe ist
O(N*M + N)
.Beachten Sie auch, dass es Pseudocode C Und dass es unterschiedliche Werte.
zB.
[1,1,1,2,2,4]
und[1,1,1,2,2,2,5]
zurück[1,2]
Die Komplexität ist
N*M
Ursache desfor
Schleifen+ N
Ursache für die Prüfung, ob es bereits in derArrayCommon[]
(das istn
Größe beiArray2[]
Daten enthält, die doppelte Teil desArray1[]
Vorausgesetzt, N ist die Größe der kleineren Array (N < M).InformationsquelleAutor der Antwort Muggen
In Python, schreiben Sie
set(A1).intersection(A2)
. Dies ist die optimale O(n + m).Gibt es die Zweideutigkeit, die in Ihrer Frage wenn. Was ist das Ergebnis von A1=[0, 0], A2=[0, 0, 0]? Es gibt vernünftige Interpretationen Ihrer Frage, geben Sie 1, 2, 3, oder 6 Ergebnisse in der letzten array - was ist Ihre situation benötigen?
InformationsquelleAutor der Antwort
Ich das problem lösen, indem mit Set-Kreuzung. Es ist sehr elegant. Auch wenn ich nicht analysieren Sie die Zeitkomplexität ist es wohl im angemessenen Bereich.
InformationsquelleAutor der Antwort alan turing
InformationsquelleAutor der Antwort user2476720