Tengo un subconjunto de las rutas simples en un gráfico. La longitud de los caminos está limitada por .
¿Cuál es la forma más compacta (en cuanto a memoria) de representar las rutas de modo que no se representen otras rutas aparte de las seleccionadas?
Tenga en cuenta que quiero usar esta representación en un algoritmo que iterará a través de este subconjunto de rutas una y otra vez y que quiero ser bastante rápido, por lo que, por ejemplo, no puedo usar ningún algoritmo de compresión estándar.
Una representación que vino a mi mente fue representarlos como un conjunto de árboles. Sin embargo, supongo que llegar a un número óptimo de árboles es NP-difícil? ¿Qué otras representaciones serían buenas?
graphs
data-structures
Optar
fuente
fuente
Respuestas:
Un Trie podría hacer el truco: http://en.wikipedia.org/wiki/Trie
Rotula cada borde de tu gráfico con una letra. Luego agregue las cadenas que representan las rutas a través de su gráfico al trie. Para cumplir con el requisito de que "no se representan otros caminos aparte de los seleccionados", puede dejar en blanco todos los vértices del trie y etiquetar los bordes, excepto cuando los bordes que van desde la raíz hasta el vértice representan uno de sus caminos, luego rotula el vértice con algo. Un bool, el número de la ruta bajo algunos pedidos, etc.
Una vez que haya construido su trie, hay algoritmos para comprimirlo a una representación óptima (o casi óptima). (vea el artículo de Wikipedia vinculado).
fuente
Quizás debería echar un vistazo a las estructuras de datos sucintas . Son estructuras de datos que intentan almacenar información en un espacio cercano al límite inferior teórico de la información mientras conservan la capacidad de realizar operaciones en ellos.
Existen tales estructuras para árboles, diccionarios, etc. No recuerdo ninguna que haga exactamente lo que desea, pero tal vez alguna combinación o modificación de ellas lo ayudaría.
fuente
Dependiendo de la complejidad y del procesamiento previo / posterior requerido para su algoritmo, quizás la opción más simple sea la forma. Puede representarlos trivialmente como matrices y guardarlos comprimidos en un HDF5. Esta biblioteca está equipada con algunos algoritmos de compresión rápida, por lo que leer y escribir datos comprimidos puede ser incluso más rápido que sin comprimir.
Aquí hay algunas parcelas:
Tiempo de acceso secuencial por elemento para un EArray de 15 GB y diferentes tamaños de fragmentos:
Velocidad de descompresión usando Blosc en PyTables:
Y, si están limitados en longitud, podría almacenarlos en una mesa y, por lo tanto, probablemente ganar un poco más de espacio. Y al recuperarlos de la memoria, ya los tiene en una forma muy conveniente para aplicar su algoritmo.
fuente