Diese Frage und diese Frage haben mich ein wenig zum Nachdenken gebracht. Um ein Array der Länge mit eindeutigen Elementen in sortieren , müssen wir in der Lage sein, die Anzahl der Werte im Array zu speichern. Es gibt einige Vorschläge, aber ich suche nach einer Möglichkeit, dies im schlimmsten Fall der linearen Zeit zu tun. Genauer:
Bestimmen Sie bei einer Liste von n Elementen mit k verschiedenen Elementen eine Liste der Tupel U = \ {(x_i, c_i) \} ^ k aller eindeutigen Elemente x_i \ in A, so dass c_i die Anzahl der Elemente x_i in A ist .
Hier sind einige (fehlgeschlagene) Ideen, die ich hatte und die vorgeschlagen wurden:
- Ausgewogener binärer Suchbaum - Damit wird , um in den Baum einzufügen und die Werte zu erhöhen. Nach dem Einfügen konnten wir in eine Baumdurchquerung durchführen . Somit ergibt sich eine Gesamtzeit von die zu langsam ist.
- Hash Map - Damit können wir erwartete Einfügungen und damit erwartete Zeit erhalten. Dies ist jedoch immer noch nicht der schlimmste Fall von .
- Der leere Raum Mapping - Finden Sie die minimale und maximale Element in . Weisen Sie genügend Speicher zu ( initialisieren Sie ihn jedoch nicht ), um diesen Bereich abzudecken. Verwenden Sie diesen Speicher grundsätzlich als Hash-Map und fügen Sie einen zufälligen Hash hinzu, damit wir nicht versuchen, auf beschädigten Speicher zuzugreifen. Diese Strategie wirft Probleme auf. (1) Es ist probabilistisch mit sehr, sehr geringer Ausfallwahrscheinlichkeit, aber immer noch nicht garantiert. Die Verwendung eines solchen Speichers beschränkt uns auf Gleitkomma- oder Ganzzahlbeschränkungen.
- Assoziative Arrays - Es gibt viele andere assoziative Arrays, die verwendet werden können, ähnlich wie Hash-Maps und BSTs, aber ich finde keine, die diesen Einschränkungen entsprechen.
Vielleicht fehlt mir eine offensichtliche Methode, aber ich denke auch, dass dies möglicherweise nicht möglich sein könnte. Was sind deine Gedanken?