Sei eine Sammlung von Zeichenfolgen über dem Alphabet , die insgesamt Symbole enthalten .
Ihre Aufgabe ist es, jede der Zeichenfolgen intern zu sortieren und dann die resultierenden Zeichenfolgen in lexikografischer Reihenfolge zu sortieren. (Ihr Algorithmus muss nicht so funktionieren.)
Beispiel:
Eingabe: 33123 15 1 0 54215 21 12
Ausgabe: 0 1 12 12 12333 12455 15
Ich habe einen Weg gefunden, dies in Zeit und Raum zu tun .
Der Speicherplatz ist größer als die Zeit, da ich ein intelligentes Array verwende, mit dem Sie ein Array mit der Größe erstellen und allen Zellen in Anfangswerte geben können .
Ich habe die Bucket-Sortierung verwendet, um jede Zeichenfolge ( Zeit und Raum) und Wortbäume zu sortieren, um die Sammlung selbst ( Zeit und Raum) zu sortieren . aber meine lösung ist zu kompliziert.
Hat jemand eine bessere Lösung mit Zeit und weniger Platz oder schneller als ?
Die Lösung muss deterministisch sein, damit keine Hash-Maps oder andere statistische Algorithmen verwendet werden
Meine Lösung: Ein Smart Array ist ein Array der Größe das wir in erstellen und "initialisieren" können :
Wir erstellen drei Arrays mit der Größe von ohne eines davon zu initialisieren, und wir behalten auch eine einzelne ganzzahlige Variable namens .
Das erste Array enthält die Daten. Das zweite Array enthält Zeiger auf eine Zelle im dritten Array. Das dritte Array enthält Zeiger auf eine Zelle im zweiten Array. enthält die Anzahl der bisher initialisierten Zellen.
Angenommen, wir möchten den Wert von Zelle festlegen (nehmen wir an, es ist das erste Mal, dass wir dies für diese Zelle tun). Dann gehen wir zu Zelle im ersten Array und setzen sie auf den gewünschten Wert.
Jetzt gehen wir zu Zelle im zweiten Array und setzen sie so, dass sie auf Zelle im dritten Array zeigt. Stellen Sie die Zelle im dritten Array so ein, dass sie auf die Zelle im zweiten Array zeigt. Erhöhen Sie um 1.
Angenommen, wir möchten wissen, ob Zelle Papierkorb ist (das heißt, wir müssen noch etwas darauf einstellen).
Wir würden zu Zelle im zweiten Array gehen und uns die Zellennummer (im dritten Array) ansehen, auf die Zelle (im zweiten Array) zeigt - wir werden es .
Wenn dann ist Papierkorb (weil wir bisher nur Zellen initialisiert haben und keine davon ist).
Wenn ist, schauen wir uns an, auf welche Zelle (im dritten Array) zeigt. Wenn es nicht dann ist Müll. Sonst ist kein Müll
Auf diese Weise können wir bei jedem Schritt feststellen, ob wir diese Zelle initialisiert haben und wenn nicht. Also haben wir ein Array der Größe in -Zeit erstellt und "initialisiert" .
Der Haupttrick besteht nicht darin, das gesamte Array zu Beginn zu initialisieren, sondern einen Weg zu finden, um zu wissen, welche Zellen wir bisher initialisiert haben, und eine Zelle nur dann zu initialisieren, wenn wir sie "betrachten". Im RAM-Modell benötigt Zeit, um ein Array beliebiger Größe zu erstellen, ohne es zu initialisieren.
Ein Wortbaum der Ordnung m ist eine Verallgemeinerung einer TRIE. Jeder Knoten enthält ein Array von Zeigern auf seine Söhne. Die Arraygröße beträgt . Jeder Knoten enthält auch einen Zähler, der angibt, wie viele Sätze von diesem Knoten beschrieben werden.
Da wir jedes Mal, wenn wir ein Wort (eine Menge) hinzufügen, intelligente Arrays verwenden, werden nur Zeit und Raum benötigt.
Time cannot be smaller than space
wahr. You are cheating in some way
folgt nicht aus " Zeit und Raum": Mit , - die räumliche Begrenzung sieht unnötig locker aus.