En Excel, 'comprimen' cadenas a una asignación numérica (aunque no estoy seguro de que la palabra comprimir sea correcta en este caso). Aquí hay un ejemplo que se muestra a continuación:
Si bien esto ayuda a reducir el tamaño general del archivo y la huella de la memoria, ¿cómo hace Excel la clasificación en un campo de cadena? ¿Debería cada cadena pasar por el mapeo de búsqueda? Y si es así, ¿no aumentaría en gran medida el costo de / ralentizar la ordenación en un campo de cadena? trivial). Dos preguntas sobre esto:
- ¿Se utilizan cadenas compartidas dentro de la propia aplicación de Excel, o solo al guardar los datos?
- ¿Cuál sería un algoritmo de ejemplo para ordenar en el campo entonces? Cualquier lenguaje está bien (c, c #, c ++, python).
excel
algorithm
performance
sorting
compression
David542
fuente
fuente
Respuestas:
No puedo encontrar exactamente cómo Excel almacena las celdas con
SharedStringTable
elementos en la memoria en tiempo de ejecución, pero almacenarlas como un índice del elementoSharedStringTable
requiere solo una desreferencia adicional para acceder a ellas, suponiendo que los elementos se almacenen como una matriz. Entonces supongo que así es como se hace. Esa es la forma más simple y la única forma de hacerlo más rápido es tener una representación en tiempo de ejecución deSharedStringTable
elementos ya ordenados. En tal caso, ordenar por un índice es equivalente a ordenar por el valor. Sin embargo, ese enfoque hace que la operación de inserción sea costosa, ya que cuando se inserta una nueva cadena en el centro de la tabla, todos los índices son más grandes de lo que debería incrementarse y el número de celdas en el documento puede ser muy grande, hasta todos células que se refieren aSharedStringTable
.Si las celdas contienen índices iguales que en el archivo, así es como se ordenarían las celdas representadas por
columnValue
vector en función de las cadenas a las que apuntan almacenadas en elsharedStrings
vector (en C ++ ya que usted dijo que no hay diferencia) a un costo de 2 desreferencias adicionales por operación de comparación:No estaba en el OP, pero la
SharedStringTable
operación de búsqueda inversa es lenta y el almacenamiento en caché de elementos en un diccionario ayuda.fuente
Tabla de cadenas compartidas de Microsoft Excel
La tabla de cadenas compartidas es un estándar Open XML, según lo define el estándar ISO - ISO / IEC 29500-1: 2016 (E)
Definición oficial de cadenas compartidas (citado del documento ISO)
Tabla de cadenas compartidas
Los valores de cadena se pueden almacenar directamente dentro de los elementos de celda de la hoja de cálculo; sin embargo, almacenar el mismo valor dentro de múltiples elementos de celda puede resultar en partes de hoja de trabajo muy grandes, posiblemente resultando en una degradación del rendimiento. La tabla de cadenas compartidas es una lista indexada de valores de cadenas, compartida en todo el libro, que permite que las implementaciones almacenen valores solo una vez.
El estándar ISO en cadenas compartidas se puede descargar desde
https://standards.iso.org/ittf/PubliclyAvailableStandards/c071691_ISO_IEC_29500-1_2016.zip
Respuestas a las preguntas sobre este tema.
-
fuente