Réalisez qu'en utilisant un ensemble intégré, vous allez avoir une compression au niveau du chemin basée sur la nature de vos données. Bien sûr, cela dépend de l'implémentation du conteneur. Regardez quelques informations sur les radix, les arbres de recherche numérique, les arbres rouge-noir, etc. Vous verrez que vous n'avez pas besoin de stocker chaque chaîne, mais plutôt les motifs. Par exemple, simplifions votre problème: nous avons seulement 3 caractères qui peuvent apparaître au maximum 2 fois chacun, et chaque chaîne a 6 caractères. Trois chaînes possibles sont les suivantes:
AABBCC, aabcbc et AACBCB
Avec ces exemples, nous pourrions sortir avec l'aide d'un maximum de 6 + 3 + 4 = 13 noeuds au lieu d'un 18 noeuds. pas important, mais je ne sais pas ce que vous faites non plus. Comme avec tout type de compression, plus vos modèles de préfixes sont réutilisés, plus vous avez de compression.
Édition: Les numéros 13 et 18 proviennent de la compression au niveau du chemin. Par exemple, dans C (pour argument/discussion), si j'implémente ma classe de stockage de chaînes comme un wrapper autour d'un tableau, j'aurais probablement un tableau de pointeurs de caractères avec chaque pointeur référençant un point en mémoire contenant un motif. Dans l'exemple que j'ai donné ci-dessus, cela prendrait 18 caractères (6 * 3 = 18). Si l'on ajoute la taille du tableau (disons que sizeof (char *) vaut 4, notre tableau prendrait 3 * 4 octets de stockage = 12 + 18 ou 30 octets au total pour stocker nos patterns.)
Si je suis plutôt en stockant les motifs dans une sorte d'arbre de recherche numérique, je fais un petit compromis: les nœuds de mon arbre vont être plus gros que 1 octet chacun (1 octet pour le caractère dans le nœud, 4 octets pour le pointeur "suivant" chaque noeud, 5 octets chacun) Le premier motif que nous stockons est AABBCC, c'est-à-dire 6 noeuds dans l'arbre, ensuite AABCBC, nous réutilisons le chemin AAB du premier arbre et n'avons besoin que de 3 noeuds supplémentaires pour CBC. est AACBCB Nous réutilisons AA, et avons besoin de 4 nouveaux nœuds pour CBCB.C'est un total de 13 nœuds * 5 octets = 65 octets de stockage. Cependant, si vous avez beaucoup de motifs longs et répétitifs dans le préfixe de vos données, alors vous verrez une compression de niveau de chemin de préfixe.
Si ce n'est pas le cas pour vous, je me pencherais sur la compression Huffman ou LZW. Cela vous obligera à construire un dictionnaire de modèles qui ont des nombres entiers liés à eux. Lorsque vous compressez, vous créez le dictionnaire et créez des ID entiers pour chaque motif de votre texte. Vous remplacez ensuite les motifs dans votre texte avec les ID entiers. Lorsque vous décompressez, vous faites le contraire. Je n'ai pas le temps de décrire ces algorithmes plus en détail, vous devrez donc les consulter.
C'est un compromis entre simplicité et temps. Si vos données le permettent, prenez la méthode la plus courte et utilisez simplement le conteneur intégré. Sinon, vous aurez besoin de quelque chose de plus adapté à vos données.
Attendez, qu'entendez-vous par "taille de l'univers"? Ne me dites pas que c'est le nombre de chaînes que vous prévoyez d'avoir –
C'est l'espace de solution. Le nombre total de chaînes possibles (dont beaucoup sont des doublons). Je ne vais pas tous les hacher, et je ne veux pas. Peut-être aurais-je dû formuler ma question plus attentivement. Je vais mettre à jour l'OP. – dfetter88