2016-05-06 3 views
1

Ich würde gerne wissen, was ist der zeitaufwendigste Algorithmus dafür.Algorithmus zu überprüfen, ob Zahlen in 2 Arrays zu einer geben Nummer

Bei 2-Arrays, a und b, überprüfen Sie, ob alle 2 Mitglieder - ein von a und ein von b bis zu einer bestimmten Anzahl h hinzuzufügen.

Was ist Ihrer Meinung nach der schnellste Algorithmus für dieses Problem? Ich wiederhole einfach beide Arrays und versuche die Lösung zu finden, die sehr teuer ist. Es ist O(mn), denke ich, wo m und n sind die Längen der Arrays a bzw. b. Es ist auch nicht notwendig, dass beide Arrays die gleiche Länge haben. Kennst du einen Algorithmus, der schneller ist? Beachten Sie für die Größe, dass die maximale Länge beider Arrays ungefähr 100000 beträgt.

Vielen Dank.

P.S. Diese Frage ist kein Duplikat, da es darum geht, die Ganzzahlen in zwei verschiedenen Arrays zu finden, nicht in einem.

+2

Mögliches Duplikat von [Finde ein Paar Elemente aus einem Array, dessen Summe einer gegebenen Zahl entspricht] (http://stackoverflow.com/questions/4720271/find-a-pair-of-elements-from-an-array -welche-Summe-entspricht-einer-gegebenen-Nummer) –

+0

@nm Bei dieser Frage geht es darum, sie aus einem einzigen Array zu finden. In dieser Frage wurden zwei Arrays angegeben. Sie sind sehr unterschiedliche Fälle. – TheRandomGuy

+1

Nein, es ist im Grunde das Gleiche. Gehe durch das erste Array und lege jedes 'array1 [i]' in eine Hashtabelle. Gehe dann durch das zweite Array und schaue 'h - array2 [i]' in der Hashtabelle nach; Wenn es existiert, gib 'wahr' zurück. – svinja

Antwort

0

könnten Sie ungerade verwenden/sogar auf etwa Ihre Zeit halbieren:

Split a und b in 2 Reihen je, was zu aeven, AODD, beven, Bodd. Wenn n gerade ist, vergleiche (aeven + beven) und (aodd + bodd). Wenn n ungerade ist, vergleiche (aeven + bodd) und (aodd + beven).

Also, wenn | a | = 20, und | b | = 20 würden Sie 400 Tests haben. Wenn wir ungefähr die gleiche Anzahl von ungeraden und even in jedem Array annehmen, | aeven | (und andere Sub-Arrays) wird ca. 10, so dass Sie 10 * 10 + 10 * 10 Tests oder ca. 200 haben.

Plus natürlich, bestellen Sie die Arrays und den Test für jeden Wert im ersten Array zu stoppen, wenn die Summe ist größer als n.

2

Als heuristische Verbesserung können die Arrays vorher sortiert werden. Wenn die n nicht negativ ist, sortieren Sie die Arrays A und B in nicht aufsteigender Reihenfolge. Angenommen, die äußere Schleife iteriert das erste Array in dieser sortierten Reihenfolge und die innere Schleife iteriert das zweite Array in dieser sortierten Reihenfolge, wobei die Summanden a bzw. b berücksichtigt werden. Die Iteration der inneren Schleife kann beendet werden, sobald kleiner als n ist.

Ebenso, wenn n negativ ist, können die Arrays in nicht abnehmender Reihenfolge sortiert werden; die innere Schleife kann beendet werden, sobald a+b größer als n ist.

Dies reduziert jedoch nicht die Zeitkomplexität im ungünstigsten Fall, da im ungünstigsten Fall immer noch jedes Zahlenpaar im Eingang überprüft wird.

+1

(Wenn ein Array sortiert ist, könnten Sie mit einer Binärsuche nach (dem Unterschied, der sich daraus ergibt) jedes Element des anderen Arrays überprüfen.) – greybeard

+0

@greybeard In der Tat scheint die Laufzeit auf 'O (n log n) '. – Codor

+3

Wenn beide Arrays sortiert sind, können Sie sie einfach in entgegengesetzte Richtungen scannen. –

3

Sie können eines der beiden Arrays sortieren, z. B. das Array b, und dann das Array a durchlaufen. Verwenden Sie für jedes Element in a die binäre Suche, um ein Element in b zu finden, das "übereinstimmt", d. H. Addiert bis h. Dann ist die Komplexität O(n log n) für die Sortierung plus für die Iteration und binäre Suche.

+0

Sehr nette Antwort; in der Tat sollte das _larger_ eines der Arrays in der inneren Schleife über die binäre Suche sortiert und iteriert werden, da die Auswirkung auf die Laufzeit größer ist. – Codor

Verwandte Themen