Gegeben eine Zahl n und ein Array mit der Größe m wobei m < n. Vorausgesetzt, dass jede Zahl im Array zwischen 0 und n-1 (inklusive) liegt, möchte ich so effizient wie möglich die Liste der n-m Zahlen von 0 bis n-1 erhalten, die nicht im Array sind.Liste der verbleibenden Nummern generieren
Das ist, wie ich es tue (in Pseudo-Code), aber es fühlt sich eher ineffizient und ich frage mich, ob es einen besseren Weg:
int[] remaining (int[] assigned) {
Set<int> s
int[n-m] remaining
add each int in assigned to s
for(i = 0 to n-1)
if(not s.contains(i)) remaining.add(i);
}
Dies ist keine bestimmte Sprache Computer, aber es sollte sei illusorisch. Wir gehen davon aus, dass der Zugriff auf ein Array natürlich O (1) ist und das Hinzufügen/Überprüfen eines Satzes ist O (log (n)), wie es ein AVL-Satz wäre. Ich versuche also, dies in linearer Zeit zu erreichen, anstatt in O (n · logn), wie es jetzt ist, aber wenn das ursprüngliche Array nicht sortiert ist, weiß ich nicht, wie ich es anstellen soll oder ob es überhaupt möglich ist .
Wenn Sie den Speicher leisten können, könnte eine Reihe von Bits der Größe n verwendet werden, um das Problem in linearer Zeit zu lösen. (Der Algorithmus ist offensichtlich.) – ooga
Ich folge nicht ganz dem, was der offensichtliche Algorithmus ist. Könnten Sie bitte erklären? EDIT: Oh, warte mal, du meinst Boolean? – Setzer22
Oh, Entschuldigung! Ich dachte, dass Sie das Bit-Array auf alle Nullen initiieren würden, gehen Sie durch Ihre Liste von Zahlen, setzen Sie das entsprechende Bit auf 1, und gehen Sie dann durch das Bit-Array und die Positionen aller Bits, die immer noch Null sind. – ooga