Der vorgenannte Ansatz erfordert, dass jede Zelle eine Zahl halten kann, die groß genug ist, um die Anzahl der Neuinitialisierungen des Arrays zu halten, was eine erhebliche Raumstrafe darstellt. Wenn ein Slot in der Lage ist, mindestens einen Wert zu speichern, der niemals legitim geschrieben werden kann, kann vermieden werden, dass eine andere (nicht konstante) Platzstrafe auf Kosten der Hinzufügung einer O(Wlg(N))
Zeitstrafe auftritt, wobei W
die Anzahl der zwischengeschriebenen unterschiedlichen Array-Slots angegeben wird Löschvorgänge und N
ist die Größe des Arrays. Angenommen, man speichert Ganzzahlen von -2.147.483.647 bis 2.147.483.647 (aber niemals -2.147.483.648) und möchte, dass leere Array-Elemente als Null gelesen werden. Füllen Sie zunächst das Array mit -2.147.483.648 (nennen Sie diesen WertB
). Geben Sie beim Lesen eines Array-Steckplatzes für die Anwendung den Wert B
Null an. Vor dem Array Schlitz Schreiben I
, zu prüfen , ob er gehalten , B
und wenn ja , und I
größer als eins ist , eine Null speichern Schlitz I/4
nach einem ähnlichen Kontroll für diesen Ort durchführt (und, wenn es gehalten B
, I/16
usw.).
Beginnen Sie zum Löschen des Arrays mit I
0 oder 1, je nach Array-Basis (der beschriebene Algorithmus funktioniert auch für beide). Wiederholen Sie dann den folgenden Vorgang: Wenn item gleich I
ist B
, erhöhen Sie I
und dividieren Sie durch vier, wenn dies ein Vielfaches von vier ergibt (beenden Sie, wenn die Division einen Wert von 1 ergibt); Ist dies I
nicht der Fall B
, speichern Sie B
es und multiplizieren Sie es I
mit vier ( I
beginnt es bei Null, wird es mit vier multipliziert, I
wird es jedoch inkrementiert , da Punkt 0 leer sein wird).
Man beachte, dass man die Konstante "vier" oben durch andere Zahlen ersetzen könnte, wobei größere Werte im Allgemeinen weniger Arbeitsmarkierungen erfordern, aber kleinere Werte im Allgemeinen weniger Arbeitslöschung erfordern; Da markierte Array-Slots gelöscht werden müssen, ist ein Wert von drei oder vier mit ziemlicher Sicherheit optimal. da der Wert vier sicherlich nahezu optimal ist, besser als zwei oder acht ist und bequemer als jede andere Zahl, scheint es die vernünftigste Wahl zu sein.