J'ai une énorme liste de séquences multi-octets (appelons les mots) que j'ai besoin de stocker dans un fichier et que je dois pouvoir rechercher rapidement. D'énormes moyens: Environ 2 millions de ceux-ci, chacun 10-20 octets de longueur.Compression et recherche d'une énorme liste de mots
En outre, chaque mot doit avoir une valeur d'étiquette associée, afin que je puisse utiliser pour référencer plus de données (externe) pour chaque élément (par conséquent, le dictionnaire d'un correcteur orthographique ne fonctionne pas ici que seulement fournit une hit-test). Si c'était juste en mémoire, et si la mémoire était abondante, je pourrais simplement stocker tous les mots dans une carte hachée (alias dictionnaire, alias paires clé-valeur), ou dans une liste triée pour une recherche binaire.
Cependant, je voudrais compresser les données fortement, et préférerais également ne pas devoir lire les données dans la mémoire mais chercher plutôt à l'intérieur du dossier. Comme les mots sont principalement basés sur le langage anglais, il y a une certaine probabilité que certains "sillables" dans les mots se produisent plus souvent que d'autres - ce qui est probablement utile pour un algorithme efficace. Est-ce que quelqu'un peut me diriger vers une technique ou un algorithme efficace pour cela?
Ou même des exemples de code?
Mise à jour
Je figure que DAWG ou quoi que ce soit des routes similaires le chemin dans suffixes communs de cette façon ne fonctionnera pas pour moi, parce que je ne serai pas capable de marquer chaque chemin de mot complet avec une personne valeur. Si je devais détecter des suffixes communs, je devrais les mettre dans leur propre dictionnaire (table de recherche) de sorte qu'un nœud puisse les référencer, mais le nœud garderait son propre nœud de fin pour stocker la valeur de balise de ce chemin.
En fait, c'est probablement la voie à suivre:
Au lieu de construire les nœuds d'arbres pour de simples caractères seulement, je pourrais essayer de trouver des séquences de caractères souvent utilisés, et faire un noeud pour ceux aussi bien. De cette façon, les nœuds uniques peuvent couvrir plusieurs caractères, ce qui peut conduire à une meilleure compression. Maintenant, si c'est viable, comment pourrais-je trouver des sous-séquences souvent utilisées dans toutes mes phrases? Avec environ 2 millions de phrases composées généralement de 1-3 mots, il sera difficile d'exécuter toutes les permutations de toutes les sous-chaînes possibles ...
20 octets * 2 millions = 40Mb. C'est minuscule par rapport à la quantité typique de mémoire dans un ordinateur. Si vous les stockez dans un tableau trié, vous utiliserez la recherche binaire pour la recherche, et vous aurez à peine besoin de mémoire supplémentaire. – jkff
Oui, 40mb c'est pas beaucoup. Et si c'est la vitesse qui vous préoccupe, gardez les données en mémoire aussi claires que possible. – ruslik
Comme écrit ci-dessous, les 40 Mo doivent venir avec l'application, et j'aime garder la taille de téléchargement de l'application beaucoup plus petite. De plus, ce n'est pas la seule partie. Il y a une plus grande partie d'un autre ensemble de "mots", qui n'a pas besoin d'être interrogeable mais qui peut être compressé, car cela représentera environ 1GB dans les chaînes brutes. Une fois que j'ai trouvé un algo approprié pour ce qui précède, j'espère pouvoir l'utiliser sur cet autre, plus grand, aussi. –