Existem algoritmos para reordenar dados para otimizar a compactação? Entendo que isso seja específico dos dados e do algoritmo de compactação, mas existe uma palavra para este tópico? Onde posso encontrar pesquisas nessa área?
Especificamente, tenho uma lista json de 1,5 milhão de strings e quero reordená-las para que a compactação gzip (para HTTP) seja otimizada. Classificar as strings funciona muito bem, mas eu realmente não sei se isso é ótimo.
optimization
permutations
Jayen
fonte
fonte
Respostas:
Esta é uma adição à resposta do Navin Goyal.
Como um arquivo JSON pode ser considerado como uma estrutura de dados em árvore, é possível usar a transformação XBW para árvores, que é uma extensão da transformação Burrows-Wheeler para cadeias.
fonte
A conversão Burrows - Wheeler é um algoritmo de compactação conhecido que funciona reordenando os caracteres na sequência a ser compactada.
fonte
Para melhorar a compactação gzip, você deseja que as seqüências "semelhantes" sejam fechadas na lista. Existem várias maneiras de definir essa semelhança; deixe-me descrever um razoável que funcione bem na prática. Lembre-se de que o tamanho do bloco do gzip é de 64K. Assim, seus dados serão divididos em blocos de 64K bytes e cada bloco será compactado independentemente. Para otimizar a compactação, seria necessário minimizar o número de k-mers distintos (substrings de tamanho k) em cada bloco. A motivação é que todos esses substrings sejam substituídos por um identificador.
Embora o problema acima seja difícil em teoria (é uma variante do particionamento de hipergráficos), existem algoritmos práticos rápidos. Eu recomendaria o cluster do tipo LSH que pode ser implementado com uma única passagem nos seus dados. Observe que a classificação (alfabética) é outra maneira de "agrupar" cadeias semelhantes. No entanto, algoritmos de clustering especializados podem ter um desempenho melhor.
Uma alternativa é usar o zstd , que é (i) mais rápido, (ii) obtém taxas de compressão mais altas e (iii) não possui limitações no tamanho do bloco (e, assim, compacta as seqüências igualmente bem, independentemente da ordem de entrada).
fonte
Eu vi um algoritmo há algum tempo atrás, que talvez possa ser útil. Ele usa um algoritmo de distância de edição para calcular a distância entre cada palavra. Assim, ele cria um gráfico em que cada peso da aresta é essa distância. Por fim, ele recebe uma ordem escolhendo um caminho com a menor soma de pesos. Talvez possa melhorar o gzip.
fonte