Jemand, den ich kenne, plant in naher Zukunft die Implementierung eines Texteditors, was mich dazu veranlasste, darüber nachzudenken, welche Art von Datenstrukturen für einen Texteditor schnell sind. Die am häufigsten verwendeten Strukturen sind offenbar Seile oder Spaltpuffer .
Van-Emde-Boas-Bäume gehören zu den Warteschlangen mit der schnellsten Priorität, wenn Sie sich nicht um eine Obergrenze für die Anzahl der darin enthaltenen Elemente und einen hohen Initialisierungsaufwand kümmern. Meine Frage ist, ob es eine Datenstruktur gibt, die genauso schnell ist wie der Van-Emde-Boas-Baum, aber Texteditor-Operationen unterstützt.
Wir müssen nur bis zu Zeichen in unserer Datenstruktur unterstützen (wenn also log m = 32 ist , dann unterstützen wir ASCII-Zeichen im Wert von bis zu 4 GB). Wir dürfen √ Zeit zum Initialisieren einer neuen Datenstruktur. Wir möchten folgende Operationen unterstützen:
- Fügen Sie ein Zeichen an der Position in O ( log log m ) ein (und erhöhen Sie dadurch die Position jedes nachfolgenden Zeichens um 1).
- Löschen Sie ein Zeichen an Position in O ( log log m ) .
- Geben Sie das Zeichen an Position in O zurück ( log log m ) .
Also, Einfügen (0, 'a') gefolgt von Einfügen (0, 'b') ergibt "ba".
Noch besser wäre dies:
- Geben Sie einen Zeiger auf einen Index in O zurück ( log log m ) .
- Geben Sie bei einem 'Zeiger' das Zeichen an dieser Position in .
- Entfernen Sie mit einem 'Zeiger' das Zeichen an dieser Position in .
- Fügen Sie bei einem 'Zeiger' an dieser Position in ein Zeichen hinzu und setzen Sie einen Zeiger an die folgende Position zurück.
- (optional) Geben Sie bei einem 'Zeiger' einen 'Zeiger' zum nächsten / vorherigen Zeichen in .
quelle