Struttura dei dati per la memorizzazione dei bordi di un grafico


8

Attualmente sto lavorando alla mia tesi di master e si tratta di raggruppare graficamente. Sto lavorando con un'idea usando le formiche per risolvere il problema. Attualmente sto lavorando all'implementazione e mi chiedo esattamente quanto bene rappresenti i bordi del grafico.

Ogni fronte è aumentato con determinate informazioni come il suo valore di feromone e il numero di volte che una formica ha visitato quel bordo. Lavorerò con grafici non indirizzati, che possono essere piuttosto grandi (oltre un milione di vertici) e mi chiedevo quale sia il modo più efficiente per me di memorizzare i bordi e cercarli? Stavo pensando di attenermi a una convenzione e archiviare gli endpoint secondo quello che ha un ID vertice inferiore per e quello superiore per ( e sono gli endpoint del bordo nella struttura dei dati). Ma mi chiedo come potrei eseguire uno sguardo in questo caso?v1v2v1v2

C'è una mappatura che mi è venuta in mente dalla matrice di adiacenza alla matrice perimetrale, ma funziona solo se il grafico sottostante è un grafico completo. Quindi sono venuto qui per alcuni suggerimenti su come procedere perché ho bisogno che la mia ricerca sia efficiente mentre allo stesso tempo non voglio far saltare lo spazio di archiviazione per i bordi poiché i grafici saranno enormi.


1
Il tuo grafico è scarso o denso? Perché la risposta si basa su questo.
Bartosz Przybylski,

Oh, avrei dovuto dirlo, sì, sono per lo più grafici sparsi. Fondamentalmente i grafici con cui lavorerò rappresentano reti del mondo reale che di solito sono scarne. :)
fangoso il

Elenchi di adiacenza ordinati?
Raffaello

Risposte:


5

Se il tuo grafico è scarso, dovresti memorizzarlo usando gli "elenchi" di adiacenza, anche se probabilmente vuoi qualcosa di più efficiente di un elenco (o forse no, a seconda dell'uso). È più semplice se si memorizza ciascun bordo in entrambi gli endpoint. Questo può essere implementato in molti modi, ad esempio è possibile memorizzare tutti i dati in alcuni array di grandi dimensioni e memorizzare solo i puntatori negli "elenchi" di adiacenza.


Finora ho usato un approccio di lista di adiacenza in cui per ogni vertice ho una matrice dei suoi vicini (ogni vertice è un oggetto). In questo modo aiuta perché ogni formica conosce i vicini di ogni vertice. Ma ho bisogno di scegliere quale bordo attraversare successivamente, in base alle informazioni sui feromoni e ad alcuni altri dati che calcolerò. Non voglio introdurre la duplicazione, quindi mi chiedevo se ci fosse un modo per rappresentare ciascun bordo individualmente, ma essere in grado di indicizzarli in modo efficiente allo stesso tempo, poiché avrò bisogno di molta ricerca per ogni bordo in ogni iterazione .
fangoso il

Ad esempio, ecco la possibile mappatura agli indici dell'array edge se il grafico era completo. In questo caso sappiamo già che la dimensione dell'array edge sarà n (n-1), dove n è il numero di vertici. Quindi, per tradurre [x] [y] matrice di adiacenza nell'indice di array (idx) può essere la seguente: se x <= y allora idx = n * x - x * (x + 1) / 2 + (y - x - 1) else idx = n * y - y * (y + 1) / 2 + (x - y - 1) Quindi dire che edge (5,11) o (11,5) si tradurranno entrambi nello stesso indice di array. Ma dal momento che non sto lavorando con grafici completi, non riesco a pensare a una mappatura.
fangoso il

2
Continui a insistere sull'uso di strutture dati che hanno senso solo per grafici densi. Per i grafici sparsi, l'approccio è sempre quello di memorizzare, in qualche modo, per ogni vertice tutti i bordi incidenti. Non vi è alcuna duplicazione: i dati vengono archiviati in un'unica posizione; ma ci sono due puntatori ai dati. L'indicizzazione rapida potrebbe essere implementata utilizzando alberi di ricerca, tabelle hash e così via. Questi ti permetteranno di implementare velocemente e, si spera, senza troppo spazio in testa. G[x][y]
Yuval Filmus,
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.