Rappresentazione compatta di percorsi in un grafico


9

Ho un sottoinsieme dei percorsi semplici in un grafico. La lunghezza dei percorsi è limitata da .d

Qual è il modo più compatto (per quanto riguarda la memoria) che posso rappresentare i percorsi in modo tale che non siano rappresentati altri percorsi oltre a quelli selezionati?

Nota che voglio usare questa rappresentazione in un algoritmo che ripeterà ripetutamente questo sottoinsieme di percorsi e che voglio essere abbastanza veloce, quindi per esempio non posso usare nessun algoritmo di compressione standard.

Una rappresentazione che mi è venuta in mente era rappresentarli come un insieme di alberi. Immagino però che scendere a un numero ottimale di alberi sia NP-difficile? Quali altre rappresentazioni sarebbero buone?


2
2d

GPGPG

Bene, anche l'unione di due semplici percorsi sconnessi può creare un ciclo, quindi calcolare l'MST ti farebbe perdere uno dei percorsi immagino. Ma quanto sopra potrebbe darti alcune idee.
Juho,

2
k

esiste la possibilità di utilizzare gli FSM per rappresentare i percorsi e quindi si possono fare operazioni di base come unioni, intersezioni, sottrazioni, ecc ... e anche l'operazione di "compressione" della minimizzazione degli FSM è ben compresa / ottimale ed efficiente. non l'ho mai visto fare in un documento, ma l'ho proposto su un altro problema un po 'simile ...
vzn

Risposte:


4

Un Trie potrebbe fare il trucco: http://en.wikipedia.org/wiki/Trie

Etichetta ogni bordo del grafico con una lettera. Quindi aggiungi le stringhe che rappresentano i percorsi attraverso il tuo grafico al trie. Per soddisfare il requisito che "non sono rappresentati altri percorsi oltre a quelli selezionati" è possibile lasciare vuoti tutti i vertici del trie ed etichettare i bordi, tranne quando i bordi che conducono dalla radice al vertice rappresentano uno dei percorsi, quindi etichetta il vertice con qualcosa. Un bool, il numero del percorso sotto un certo ordine, ecc.

Una volta creato il tuo trie, ci sono algoritmi per comprimerlo fino a una rappresentazione ottimale (o quasi ottimale). (vedi l'articolo di Wikipedia collegato).


Interessante. Un trie viene tuttavia fornito con un set di specifiche molto più ampio di cui non mi interessa davvero (ricerca rapida, associazione con una chiave, ecc.), Quindi mi chiedo se sia possibile fare qualcosa di meglio ...
Opt

2

Forse dovresti dare un'occhiata a strutture dati sintetiche . Sono strutture di dati che tentano di archiviare informazioni nello spazio vicino al limite inferiore teorico delle informazioni, pur conservando la capacità di eseguire operazioni su di esse.

Ci sono strutture per alberi, dizionari, ecc. Non ricordo che farebbe esattamente quello che vuoi, ma forse una combinazione o modifica di questi ti aiuterebbe.


1

A seconda della complessità e dell'elaborazione pre / post richiesta per il tuo algoritmo, forse l'opzione più semplice è la strada. Potresti rappresentarli banalmente come array e salvarli compressi in un HDF5. Questa libreria è dotata di alcuni algoritmi di compressione veloce, in modo che la lettura e la scrittura di dati compressi possa essere persino più veloce di non compressa.

Ecco alcuni grafici:

Tempo di accesso sequenziale per elemento per un EArray da 15 GB e diverse dimensioni: http://pytables.github.io/_images/seq-chunksize-15GB.png

Velocità di decompressione usando Blosc su tabelle py: inserisci qui la descrizione dell'immagine

E, se sono limitati in lunghezza, è possibile memorizzarli in un tavolo, e quindi probabilmente guadagnare un po 'più di spazio. E quando li recuperi dalla memoria, li hai già in una forma molto conveniente per applicare il tuo algoritmo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.