Esta es una pregunta de la entrevista. ¿Qué estructura de datos usarías para almacenar el texto en un editor de texto?Estructura de datos para el editor de texto
Respuesta
En el viejo ZX-Spectrum uno (o más, no sé) text exditor usó una estructura muy simple.
Había un gran búfer, que ocupaba toda la memoria RAM libre. El texto se dividió en dos partes con el cursor. Parte anterior al cursor, se colocó al principio del búfer y el resto al final del búfer. A medida que se escribe el texto, los datos simplemente se agregan al final de la primera parte, y cuando se mueve el cursor, el texto se copia y retrocede. diseño
Buffer:
Hello, World!
^------Cursor here
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|H|e|l|l|o|,| |W| <free> |o|r|l|d|!|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ^ ^ |
begin cur1 cur2 end
eso es, cómo se hizo algunas operaciones de edición:
Type a char: buffer[cur1++] = character
Backspace: cur1--
Cursor left: buffer[--cur2] = buffer[--cur1]
Cursor right: buffer[cur1++] = buffer[cur2++]
búfer en acción:
Hello, W..............orld!
Press right ^ ^
Hello, Wo..............rld!
Press backspace ^ ^
Hello, W...............rld!
Press 0 ^ ^
Hello, W0..............rld!
^ ^
Para referencia: Esto se llama "buffer gab". La mayoría de las implementaciones no mueven el búfer cuando mueves el cursor. Simplemente lo hacen en operaciones de inserción/eliminación. –
@ Aaron Digulla: Gracias, buena adición. Ambas implementaciones tienen sus razones. – Vovanium
Hay un error tipográfico allí: se llama ** gap buffer ** Y aquí está [más información de Wikipedia] (http://en.wikipedia.org/wiki/Gap_buffer) –
Usted puede encontrar este interesante, incluso si no responde exactamente a su pregunta:
Most efficient data structure to add styles to text
Estoy esperando que la discusión va a ir a lugares fascinantes :-)
Una cuerda es esencialmente un árbol binario cuyas hojas son matrices de caracteres. Un nodo en el árbol tiene un hijo izquierdo y un hijo derecho: el niño izquierdo es la primera parte de la cadena, mientras que el niño derecho es la parte final de la cadena. La concatenación de dos cables simplemente implica la creación de un nuevo nodo de árbol con ambas cuerdas como elementos secundarios. Para garantizar la indexación del tiempo logarítmico y las operaciones de subcadena, es posible que la cuerda resultante deba equilibrarse. Varias estrategias de equilibrio son posibles.
Las ventajas principales de los cables en comparación con el almacenamiento de cadenas como matrices de caracteres es que permiten una concatenación mucho más rápida que las cadenas ordinarias, y no requieren un gran espacio contiguo de memoria para almacenar una cadena grande. Las principales desventajas son un mayor uso general del espacio y una indexación más lenta, que se vuelven más graves a medida que la estructura del árbol se hace más grande y más profunda. Sin embargo, muchas aplicaciones prácticas de indexación implican solo una iteración sobre la cadena, que permanece rápida siempre que los nodos de hoja sean lo suficientemente grandes como para beneficiarse de los efectos de caché.
+1 por decirme que la estructura que reinventé (sic), describí y sugerí en una de mis publicaciones se llama oficialmente :-) – thkala
@thkala: paga investigar primero, nada nuevo bajo el sol ;-) –
Además de la concatenación, las cuerdas suelen ser relativamente buenas (en comparación con el almacenamiento completamente contiguo) para muchas acciones de eliminación, inserción y sustitución, especialmente cerca del inicio del documento o donde hacer crecer el almacenamiento contiguo requeriría un movimiento en la memoria. –
Sé que es demasiado tarde para una respuesta, pero encontré el libro The Craft of Text Editing realmente útil. Contiene la descripción de varios modelos de búfer con sus pros y sus contras. Lamentablemente, no menciona la estructura de datos de Ropes.
Como @Vovanium ya mencionó la teoría básica de cómo se puede utilizar el búfer de huecos, he implementado una versión de C/C++.
Código:
#include <stdio.h>
#define SZ 1000
char leftArray[SZ], rightArray[SZ];
int leftCount, rightCount;
int cursorPos;
/*
* Private APIs
*/
void printArray(){
for(register int i = 0; i < leftCount; i++){
printf("%c", leftArray[i]);
}
for(register int i = rightCount - 1; i >= 0; i--){
printf("%c", rightArray[i]);
}
printf("\n");
}
void adjust(int pos){
while(leftCount > pos){
rightArray[rightCount++] = leftArray[--leftCount];
}
while(leftCount < pos){
leftArray[leftCount++] = rightArray[--rightCount];
}
}
/*
* Public APIs for Text Editor
*/
void init(){
cursorPos = leftCount = rightCount = 0;
}
void addWord(char word[], int len){
adjust(cursorPos);
for(register int i = 0; i < len; i++){
leftArray[leftCount++] = word[i];
}
leftArray[leftCount] = 0;
}
void addBackSpace(){
adjust(cursorPos);
leftCount--;
}
void moveCurson(int newPosition){
cursorPos = newPosition;
}
void subString(int pos, int length, char result[]){
adjust(cursorPos);
int k = 0;
int l = 0;
while(k + pos < leftCount && k < length){
result[k] = leftArray[pos + k];
k++;
}
length -= k;
while(l < length){
result[k++] = rightArray[rightCount - 1 - l];
l++;
}
}
- 1. Cremallera estructura de datos para editor de modelo gráfico
- 2. Editor de texto para el ensamblaje
- 3. ¿Cuál es la mejor estructura de datos adecuada para implementar editor como bloc de notas?
- 4. ¿Cuál es la mejor estructura de datos para autocompletar texto?
- 5. Recomendaciones para el editor de texto de Windows para R
- 6. ¿Hay un "Editor de estructura de árbol" para Lisp?
- 7. Estructura de datos para datos espaciales
- 8. ¿Cuál es el mejor editor de texto enriquecido para jQuery?
- 9. Feeds y podcasts para el editor de texto vim
- 10. La estructura de datos de cuerda
- 11. Estructura de datos utilizada para la estructura de directorios?
- 12. Editor simple para bases de datos BSON
- 13. Teoría del editor de texto
- 14. Estructura de datos para niveles en juegos
- 15. Estructura de datos para almacenar Rangos
- 16. Estructura de datos para dados cargados?
- 17. Estructura de la base de datos para estructura de datos de árbol
- 18. Estructura de datos espaciales para juegos
- 19. Estructura de datos bidireccionales para esta situación
- 20. Estructura de datos para un mundo aleatorio
- 21. ¿Estructura de datos eficiente para las etiquetas?
- 22. Estructura de datos eficiente para la inserción
- 23. Estructura de datos para representar un laberinto
- 24. Estructura de datos para almacenar matrices dispersas
- 25. Estructura de datos para almacenar eventos recurrentes?
- 26. Estructura de datos para elegir elementos aleatorios?
- 27. ¿Estructura de datos para almacenar una gran cantidad de datos?
- 28. estructura de datos para finalización automática
- 29. Editor de texto con secuencias de comandos ... para Linux
- 30. análisis de texto para crear una estructura de datos de árbol
Por favor, véase: [teoría editor de texto] (http: // stackoverflow.com/questions/3169440/text-editor-theory/3169491) –