2009-12-18 8 views
1

Nous avons un grand ensemble d'objets qui incluent des propriétés de composition et de nom, deux valeurs de chaîne contenant des valeurs avec beaucoup de duplication, ce qui serait une structure de données appropriée pour stocker les chaînes qui peuvent être recherchées et petites ?Stockage de chaînes statiques consultable

Les données incluent de nombreux produits chimiques et noms de produits qui sont en double ou qui ne diffèrent que légèrement. Je voudrais être en mesure de stocker le contenu de la chaîne des objets dans un format compressé qui peut également être recherché.

J'ai expérimenté avec Tries pour créer un index de recherche rapide sur les noms, mais cela s'ajoute actuellement au stockage de chaque donnée de chaîne d'objets.

Ces données sont statiques et distribuées en tant que fichier binaire distinct avec l'application.

+0

Avez-vous envisagé de l'implémenter dans une base de données? –

+0

@CC Les données proviennent d'une DB mais pour la performance, les données étant statiques, nous l'installons sur le client, un DB en mémoire peut-être une solution mais il faudrait être .net (vraiment C#) pour passer le bureaucratie interne –

Répondre

1

J'ai déjà eu some success avec un mélange de compression LZW avec une grande table, puis interner à 32 bits d'identifiants. Pour un corpus assez similaire, le LZW peut compresser en moins de 32 bits, donc il y a un drapeau sur l'identifiant de sorte qu'il est traité comme un modèle de bits compressé plutôt qu'une clé dans une table de hachage. Comme LZW est basé sur un préfixe, vous pouvez le rechercher d'une manière un peu similaire à un trie, mais c'est un peu plus compliqué; Il est plus facile d'effectuer un test en fonction de la présence ou non d'un motif de bit dans l'arborescence, et si tel est le cas, développez la chaîne et utilisez la comparaison de chaînes conventionnelle.

+0

À votre santé Pete, pourriez-vous développer un peu ce que vous voulez dire ici, en particulier la recherche? comment pourrais-je inclure la recherche rapide comme le trie? –

+0

Si vous compressez à nouveau les chaînes après la finalisation de la table LZW, la forme compressée se comportera de la même manière qu'une trie-toutes les chaînes commençant dans 'abc' lorsqu'elles seront compressées avec le code compressé pour ' abc 'ou un code dérivé de cela. Le code LZW ne se soucie pas de savoir quelles sont les racines qui correspondent à quelles valeurs, donc vous pouvez organiser les racines dans l'ordre lexical, de sorte que toutes ces chaînes sont dans une plage. Ce n'est pas aussi efficace qu'un trie, car il nécessite que les chaînes soient triées, mais cela ne nécessite pas que les chaînes soient décompressées pour faire une recherche de racine. –

Questions connexes