Representación compacta de caminos en un gráfico


9

Tengo un subconjunto de las rutas simples en un gráfico. La longitud de los caminos está limitada por .d

¿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?


2
Al "iterar a través de este subconjunto", ¿qué información sobre cada ruta necesita? ¿Longitud? Nodos visitados? Intersecciones con otros caminos? ... Puede haber muchos, por lo que debe estar preparado para "no realmente rápido" si necesita almacenar rutas completas. 2d
Raphael

GPGPG

Bueno, incluso la unión de dos caminos simples separados por el borde puede crear un ciclo, por lo que calcular el MST te haría perder uno de los caminos, supongo. Pero lo anterior podría darle algunas ideas.
Juho

2
Es posible que desee consultar el documento de Eppstein sobre caminos más cortos y la literatura relacionada. También se ocupan de representaciones compactas. k
Juho

existe alguna posibilidad de utilizar FSM para representar rutas y luego se pueden realizar operaciones básicas como uniones, intersecciones, sustracciones, etc. y también la operación de "compresión" de minimizar los FSM es bien entendida / óptima y eficiente. no he visto esto en un documento, pero lo propuso en otro problema algo similar ...
vzn

Respuestas:


4

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).


Interesante. Sin embargo, un trie viene con un conjunto de especificaciones mucho más grande que realmente no me importa (búsqueda rápida, asociación con una clave, etc.), así que me pregunto si algo mejor es posible ...
Optar el

2

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.


1

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: http://pytables.github.io/_images/seq-chunksize-15GB.png

Velocidad de descompresión usando Blosc en PyTables: ingrese la descripción de la imagen aquí

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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.