[Archiv!] Reine Mathematik, Physik, Chemie usw.: Gehirntrainingsprobleme, die in keiner Weise mit dem Handel zusammenhängen - Seite 584

 
alsu:

In einem Durchgang:

Erstellen Sie eine leere Kopie eines Arrays der gleichen Größe, initialisieren Sie es mit Twos.

Beginnen Sie am Anfang des Feldes. Begegnung 1 - von Anfang an in die Kopie schreiben, Begegnung 3 - von Ende an in die Kopie schreiben.


Und die Initialisierung durch Zweiergruppen (im Durchschnitt 66 % nutzlos) ist kein Pass?
Außerdem müssen Sie gleichzeitig drei Zeiger überwachen!
 
GaryKa:

Ich werde Ihnen eine kleine Aufgabe geben.

Natürlich ist es ein Hack, aber bei Vorstellungsgesprächen wirkt es wie eine Apotheose des Wissens über die Sortierung von Arrays ))


Die Aufgabe für das Sortieren ist also

Es gibt eine Reihe von N Zellen, in denen die Einsen, Zweier und Dreier in zufälliger Reihenfolge angeordnet sind.

Erstellen Sie den besten Sortieralgorithmus.


Zählen Sie in einem Durchgang, füllen Sie das Feld im zweiten Durchgang aus.
 
alsu:

In einem Durchgang:

Erstellen Sie eine leere Kopie eines Arrays der gleichen Größe, initialisieren Sie es mit Twos.

Beginnen Sie am Anfang des Feldes. Wird 1 angetroffen, wird die Kopie von Anfang an geschrieben; wird 3 angetroffen, wird die Kopie von Ende an geschrieben.

Ohne Kopie (oder Sie werden sagen, dass das Ausfüllen der Kopie ein separater Pass ist).

n=0, m=0

Beginnen Sie am Anfang des Arrays. Wenn wir 1 treffen - ändern wir es mit dem n-ten Element vom Anfang, ungleich 1 (durch die Konstruktion wird es immer 2 sein), n++; wenn wir 3 treffen - ändern wir es mit dem m-ten Element vom Ende, ungleich 3, m++, und wenn wir 1 treffen, folgen wir den Schritten des ersten Teils.

 
alsu:

Ohne Kopie (oder Sie werden sagen, dass das Ausfüllen der Kopie ein separater Pass ist)

n=0, m=0

Wir gehen vom Anfang des Feldes aus. Wenn wir 1 treffen, ändern wir es mit dem n-ten Element vom Anfang ungleich 1 (durch die Konstruktion wird es immer 2 sein), n++; wenn wir 3 treffen, ändern wir es mit dem m-ten Element vom Ende ungleich 3, m++, und wenn wir 1 treffen, verfahren wir wie im ersten Teil beschrieben.


durchschnittlich einen halben Durchgang, plus die gleiche Zeit für den Austausch
 
alsu:

Ohne Kopie (oder Sie werden sagen, dass das Ausfüllen der Kopie ein separater Pass ist)

n=0, m=0

Wir gehen vom Anfang des Feldes aus. Wenn wir auf 1 treffen, ändern wir es mit dem n-ten Element vom Anfang ungleich 1 (durch die Konstruktion wird es immer 2 sein), n++; wenn wir auf 3 treffen, ändern wir es mit dem m-ten Element vom Ende ungleich 3, m++, und wenn wir auf 1 treffen, verfahren wir wie im ersten Teil beschrieben.



Das ist ein guter Weg.
 
alsu:
Eine Verringerung der Anzahl der Durchgänge führt nicht immer zu einer Erhöhung der Geschwindigkeit.
 
Das Austauschen von zwei Elementen eines Arrays umfasst 3 Operationen. Es ist unwahrscheinlich, dass es schneller geht.
 
TheXpert:
Eine Verringerung der Anzahl der Durchgänge führt nicht immer zu einer Erhöhung der Geschwindigkeit.
Nun, das Optimalitätskriterium ist nicht festgelegt...
 
Lassen Sie mich eine Frage stellen:
A+B=...
 
alsu:

Ohne Kopie (oder Sie werden sagen, dass das Ausfüllen der Kopie ein separater Pass ist)

n=0, m=0

Wir gehen vom Anfang des Feldes aus. Wenn wir auf 1 treffen, ändern wir es mit dem n-ten Element vom Anfang ungleich 1 (durch die Konstruktion wird es immer 2 sein), n++; wenn wir auf 3 treffen, ändern wir es mit dem m-ten Element vom Ende ungleich 3, m++, und wenn wir auf 1 treffen, verfahren wir wie im ersten Teil beschrieben.



Eine gute Idee.