No Excel, eles 'compactam' seqüências de caracteres em um mapeamento numérico (embora não tenha certeza de que a palavra compactar esteja correta neste caso). Aqui está um exemplo mostrado abaixo:
Embora isso ajude a reduzir o tamanho total do arquivo e o espaço ocupado pela memória, como o Excel faz a classificação em um campo de seqüência de caracteres? Cada cadeia de caracteres precisaria passar pelo mapeamento de pesquisa: e, nesse caso, isso não aumentaria muito o custo de desacelerar a classificação em um campo de string (e se houvesse valores de 1 milhão, as pesquisas de chave de 1 milhão não seriam trivial). Duas perguntas sobre isso:
- As seqüências compartilhadas são usadas no próprio aplicativo Excel ou apenas ao salvar os dados?
- Qual seria um exemplo de algoritmo para classificar no campo? Qualquer linguagem é adequada (c, c #, c ++, python).
excel
algorithm
performance
sorting
compression
David542
fonte
fonte
Respostas:
Não consigo encontrar exatamente como o Excel armazena células com
SharedStringTable
elementos na memória em tempo de execução, mas armazená-las como um índice do itemSharedStringTable
requer apenas uma desreferência extra para acessá-las, supondo que os elementos sejam armazenados como uma matriz. Então, meu palpite é que é assim que é feito. Essa é a maneira mais simples e a única maneira de torná-la mais rápida é ter uma representação em tempo de execuçãoSharedStringTable
já classificada por elementos. Nesse caso, classificar por um índice é equivalente a classificar pelo valor. Essa abordagem, no entanto, torna a operação de inserção dispendiosa, como quando uma nova string é inserida no meio da tabela, todos os índices maiores do que deveriam ser incrementados e o número de células desse documento no documento pode ser muito grande, até todos os índices. células referentes aSharedStringTable
.Se as células contiverem índices iguais aos do arquivo, veja como ordenar as células representadas pelo
columnValue
vetor com base nas cadeias que elas apontam para armazenadas nosharedStrings
vetor (em C ++, pois você disse que não há diferença) a um custo de 2 desreferências extras por operação de comparação:Não estava no OP, mas a
SharedStringTable
operação de pesquisa inversa é lenta e o armazenamento em cache de elementos em um dicionário ajuda.fonte
Tabela de cadeias compartilhadas do Microsoft Excel
A tabela de cadeias compartilhadas é e o padrão Open XML, conforme definido pelo padrão ISO - ISO / IEC 29500-1: 2016 (E)
Definição oficial de strings compartilhadas (citadas no documento ISO)
Tabela de cadeias compartilhadas
Os valores de sequência podem ser armazenados diretamente dentro dos elementos das células da planilha; no entanto, armazenar o mesmo valor dentro de vários elementos de célula pode resultar em partes da planilha muito grandes, possivelmente resultando em degradação do desempenho. A Tabela de cadeias compartilhadas é uma lista indexada de valores de cadeias, compartilhada na pasta de trabalho, que permite que as implementações armazenem valores apenas uma vez.
O padrão ISO em Shared Strings pode ser baixado em
https://standards.iso.org/ittf/PubliclyAvailableStandards/c071691_ISO_IEC_29500-1_2016.zip
Respostas às perguntas sobre este tópico
-
fonte