J'ai un fichier contenant des nombres binaires ordonnés de à 2 n - 1 :
0000000000
0000000001
0000000010
0000000011
0000000100
...
1111111111
7z n'a pas compressé ce fichier très efficacement (pour n = 20, 22 Mo ont été compressés à 300 Ko).
Existe-t-il des algorithmes capables de reconnaître une structure de données très simple et de compresser le fichier sur plusieurs octets? Je veux aussi savoir quel domaine de la CS ou de la théorie de l'information étudie de tels algorithmes intelligents. "AI" serait trop large, veuillez suggérer des mots clés plus concrets.
La notion de symétrie devrait jouer un rôle fondamental dans la compression des données, mais les requêtes de recherche «symétrie dans la compression des données» et «théorie des groupes dans la compression des données» ne retournent étonnamment presque rien de pertinent.
la source
Réponses:
Cela semble être un cas d'utilisation clair pour la compression delta . Si est connu a priori, cela est trivial: stockez le premier nombre mot pour mot, et pour chaque numéro suivant stockez uniquement la différence avec le précédent. Dans votre cas, cela vous donneran
Contrairement à la proposition «tout ou rien» de DW, la compression delta avec un encodage de longueur peut en fait donner des taux de compression raisonnables pour certains types de contenu simples du monde réel, comme l'audio basse résolution. (Il convient donc à la compression audio de faible qualité, à très faible latence et à faible puissance.)
la source
Bien sûr, il existe bien sûr des algorithmes. Voici mon algorithme:
Sinon, écrivez 1 bit, puis écrivez la compression 7z du fichier.
Ceci est extrêmement efficace pour les fichiers de cette structure particulière.
Le fait est qu'il n'y a pas de repas gratuit dans la compression de données. Vous pourrez peut-être créer un algorithme de compression qui comprime bien un type de fichier, au détriment de la compression d'autres. Mais, si vous savez a priori quelque chose sur la nature des fichiers que vous allez compresser, vous pouvez optimiser votre algorithme pour ce type particulier de fichier.
Le domaine est la "compression des données". Consultez notre balise de compression de données et lisez des manuels sur la compression de données.
la source
Tout ce qui utilise un BWT (transformée de Burrows – Wheeler) devrait être capable de compresser cela assez bien.
Mon test Python rapide:
(Les nombres ici sont 'first_compressor second_compressor time_taken bytes_out')
(BWT tiré d' ici )
Ce n'est pas seulement «quelques octets», mais c'est bien mieux que juste gzip seul. BWT + bz2 descend à 237 octets de 1114111 pour une entrée 16 bits, par exemple.
Hélas, les BWT sont beaucoup trop lents et gourmands en mémoire pour de nombreuses applications. Surtout étant donné qu'il s'agit d'une implémentation naïve en Python - sur ma machine, je manque de RAM avant 2 ** 20.
Avec Pypy, j'ai pu exécuter l'intégralité de l'entrée 2 ** 20, et il la comprime à 2611 octets avec un BWT suivi de bz2. Mais prendre plus de 3 minutes et culminer à plus de 4 Go de RAM utilisés ...
Malheureusement, cette approche est toujours un espace de sortie O (2 ^ n), semble-t-il - au moins à partir de l'ajustement de courbe 1..20.
la source
eval
en faisant:for first in (bwt_c, nothing, lzma, zlib, gzip, bz2):
etfOut = first.compress(inputData)
.4 times block size
mémoire (par exemple ~ 4 Mo pour cela) et à des vitesses de>10 MB/s
(je suis l'auteur d'un tel algorithme de bibliothèque / compression bwt), ce qui est tout à fait utilisable pour de nombreuses applications. Notez que même gzip produit de très bons résultats compressibles. Merci d'avoir partagé je ne suis au courant d'aucune recherche sur l'utilisation de bwt deux fois.L'encodage PNG fait exactement ce que vous voulez. Il fonctionne également sur des données réelles, pas seulement sur des données extrêmement organisées.
En PNG, chaque ligne est codée avec un filtre, dont 4 sont spécifiés. L'un d'eux est "coder ce pixel comme la différence entre sa valeur et la valeur du pixel au-dessus." Après filtrage, les données sont ensuite compressées à l'aide de DEFLATE.
Ce filtrage est un exemple spécifique du Delta Encoding mentionné par leftaroundabout dans sa réponse, sauf qu'au lieu de le suivre avec Run Length Encoding, vous le suivez avec l'algorithme DEFLATE plus puissant. Il atteint le même objectif, seul DEFLATE gérera une plus grande variété d'entrées tout en fournissant les taux de compression souhaitables.
Un autre outil qui est souvent utilisé dans les données scientifiques où le simple filtre + DEFLATE n'est pas aussi efficace que l'encodage RICE. Dans RICE, vous prenez un bloc de valeurs et sortez tous les bits les plus significatifs d'abord, puis tous les seconds bits les plus significatifs, jusqu'aux bits les moins significatifs. Vous compressez ensuite le résultat. Pour vos données qui ne seront pas aussi efficaces que le filtrage de style PNG (car vos données sont parfaites pour le filtrage PNG), mais pour beaucoup de données scientifiques, elles ont tendance à donner de bons résultats. Dans de nombreuses données scientifiques, nous voyons que le bit le plus significatif a tendance à changer lentement, tandis que le moins significatif est presque aléatoire. Cela taquine les données hautement prévisibles des données hautement entropiques.
la source
Tout algorithme pratique recherchant des structures spécifiques serait limité uniquement aux structures codées en dur. Vous pouvez patcher 7z pour reconnaître cette séquence spécifique, mais à quelle fréquence cette structure spécifique va-t-elle se produire dans la vie réelle? Pas assez souvent pour justifier le temps nécessaire pour vérifier les entrées pour cette entrée.
Mis à part les aspects pratiques, on peut concevoir le compresseur parfait comme un algorithme qui tente de construire le programme le plus court qui produit une sortie donnée. Il va sans dire qu’il n’existe aucun moyen pratique de procéder. Même si vous avez essayé une énumération par force brute de tous les programmes possibles et vérifié s'ils produisaient la sortie souhaitée ( pas une idée complètement folle ), vous rencontrerez le problème Halting , ce qui signifie que vous devrez abandonner les essais après un certain nombre des étapes d'exécution, avant de savoir si ce programme ne peut certainement pas produire la sortie souhaitée.
L'arbre de recherche d'une telle approche par force brute croît de façon exponentielle avec la longueur du programme et n'est pas pratique pour tous, sauf pour les programmes les plus simples (quelque chose comme 5-7 instructions).
la source
Les taux de compression dépendent entièrement du décompresseur ciblé. Si le décompresseur ne peut pas décoder les numéros séquentiels de 4 octets de manière plus compacte que 4 octets par numéro, alors vous êtes SOL.
Il y a différentes choses qui permettraient le codage de nombres séquentiels. Par exemple un codage différentiel. Vous prenez n octets à la fois, puis prenez la différence ou le xor des bits, puis compressez le résultat. Cela ajoute 4 options ici pour essayer pour chaque nombre d'octets: identité
a'[i] = a[i]
; différencea'[i] = a[i-1]-a[i]
; différence inversea'[i] = a[i]-a[i-1]
; et le xora'[i] = a[i]^a[i-1]
. Cela signifie ajouter 2 bits pour sélectionner les méthodes et un nombre d'octets pour 3 des 4 options.Cependant, toutes les données ne sont pas une séquence d'enregistrements de longueur fixe. Le codage différentiel n'a pas de sens pour cela (sauf si le compresseur peut prouver empiriquement qu'il fonctionne pour un peu de données).
la source