Besoin d'une bonne vue d'ensemble des algorithmes de structure de données succincte


14

(déjà demandé sur le site principal , mais aussi ici pour une meilleure couverture, désolé)

Depuis que je connaissais les structures de données succinctes, j'ai désespérément besoin d'une bonne vue d'ensemble des développements les plus récents dans ce domaine.

J'ai googlé et lu beaucoup d'articles que je pouvais voir en haut des résultats de Google sur les demandes du haut de ma tête. Je soupçonne encore d'avoir raté quelque chose d'important ici.

Voici des sujets qui m'intéressent particulièrement:

  1. Encodage succinct des arbres binaires avec des opérations efficaces pour obtenir le parent, l'enfant gauche / droit, le nombre d'éléments dans un sous-arbre.

    La question principale ici est la suivante: toutes les approches que je connais supposent que les nœuds d'arbre sont énumérés en premier ordre (comme dans le travail de pionnier dans ce domaine Jacobson, G. J (1988). Structures de données statiques succinctes), ce qui ne semble approprié pour ma tâche. Je traite d'énormes arbres binaires donnés dans la disposition en profondeur d'abord et les indices de nœud en profondeur d'abord sont des clés pour d'autres propriétés de nœud, donc changer la disposition de l'arbre a un coût pour moi que j'aimerais minimiser. D'où l'intérêt d'obtenir des références à des travaux en considérant d'autres dispositions d'arborescence que BF.

  2. Grands tableaux d'éléments de longueur variable dans la mémoire externe. Les tableaux sont immuables: je n'ai pas besoin d'ajouter / supprimer / modifier les éléments. La seule exigence est un temps d'accès à l'élément O (1) et un surdébit aussi faible que possible, une approche de décalage et de taille meilleure que simple. Voici quelques statistiques que j'ai recueillies sur les données typiques de ma tâche:

    nombre typique d'articles - des centaines de millions, jusqu'à des dizaines de milliards;

    environ 30% des éléments ont une longueur ne dépassant pas 1 bit ;

    Les éléments de 40% à 60% ont une longueur inférieure à 8 bits;

    seuls quelques pourcentages d'articles ont une longueur comprise entre 32 et 255 bits (255 bits est la limite)

    longueur moyenne des éléments ~ 4 bits +/- 1 bit.

    toute autre distribution de longueurs d'articles est théoriquement possible mais tous les cas pratiquement intéressants ont des statistiques proches de celles décrites ci-dessus.

Liens vers des articles de toute complexité, des didacticiels de toute obscurité, des bibliothèques C / C ++ plus ou moins documentées, - tout ce qui vous a été utile dans des tâches similaires ou ce qui ressemble à cela selon votre supposition éclairée - toutes ces choses sont appréciées.

Mise à jour : j'ai oublié d'ajouter à la question 1: les arbres binaires auxquels je fais face sont immuables. Je n'ai aucune exigence pour les modifier, tout ce dont j'ai besoin est de les traverser de différentes manières, en passant toujours du nœud aux enfants ou au parent, de sorte que le coût moyen de ces opérations était de O (1).

De plus, un arbre typique a des milliards de nœuds et ne doit pas être entièrement stocké dans la RAM.

Réponses:


12

Je suppose que vous êtes intéressé par des structures de données de mémoire externe succinctes qui sont efficaces dans la pratique. Dans ce cas, vous pouvez probablement obtenir ce que vous voulez avec quelques techniques de base et un peu d'ingénierie.

Pour les arbres, je commencerais par lire Arroyuelo et al.: Succinct Trees in Practice . L'article traite des arbres dans la mémoire principale, mais la plupart des techniques peuvent être utilisées dans la mémoire externe avec des choix similaires à ceux ci-dessous.

γδBB

nSnS[je]=1jejrunenk(j)

Si vous souhaitez conserver un indice de classement faible, vous devez rendre la taille du bloc assez grande (probablement des kilo-octets ou des dizaines de kilo-octets), ce qui rend la solution de base ci-dessus gourmande en CPU. Cela peut être résolu en ajoutant un peu de surcharge aux blocs stockés sur le disque. Fondamentalement, vous appliquez la même solution de manière récursive, de sorte que chaque bloc de disque stocke un certain nombre de petits blocs ainsi qu'un autre index de classement. Lorsque vous avez récupéré le bloc de disque correct, vous utilisez l'index de classement qu'il contient pour trouver le petit bloc approprié à décoder, au lieu de décoder le bloc entier. Avec cet index secondaire, les accès aléatoires deviennent probablement liés aux E / S même avec les disques SSD les plus rapides disponibles.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.