Le strutture dati per grafici diretti e non orientati sono di fondamentale importanza. Implementazioni ben note e ampiamente utilizzate come Boost Graph Library e Lemon sono progettate in modo tale che gli indici interi contigui di nodi e spigoli non siano esposti all'utente tramite l'interfaccia.Perché le strutture dati C++ per i grafici nascondono indici interi contigui?
Invece, l'utente identifica nodi e spigoli con (piccoli) oggetti rappresentativi. Un vantaggio è che questi oggetti vengono aggiornati automaticamente quando gli indici di nodi e spigoli cambiano a causa della rimozione di spigoli o nodi dal grafico.
A mio parere (!), Questo vantaggio è sopravvalutato. In genere gli utenti archiviano gli oggetti rappresentativi di nodi e/o spigoli in un contenitore, ad esempio std::vector
. Ora, se i nodi oi bordi vengono rimossi dal grafico e i loro oggetti rappresentativi diventano non validi, l'utente deve ignorare questo o riorganizzare il vettore in modo da mantenere contigui indici interi validi, cioè fare esattamente la contabilità che il progetto avrebbe dovuto rendere inutile.
Quindi, la mia domanda è: La scelta progettuale (di nascondere gli indici interi contigui di nodi e spigoli dell'utente) presenta altri vantaggi?
Domanda interessante ma può essere applicata solo al grafico di incremento mediante vecS. Boost consente di creare grafici utilizzando una varietà di contenitori diversi. Non tutti richiedono indici intigui contigui. I casi che menzioni, aggiungendo e rimuovendo nodi o bordi, sono inadatti al contenitore vettoriale. – pbible
Capisco che la Boost Graph Library ci consente di memorizzare elenchi di adiacenze in contenitori che non offrono un accesso casuale a tempo costante ma un inserimento e una cancellazione costante degli elementi. Questo a sua volta ci consente di inserire e cancellare i bordi in tempo logaritmico nel grado del grafico, a condizione che i contenitori vengano mantenuti ordinati. Vincolare noi stessi ai contenitori con accesso casuale a tempo costante rende la complessità temporale per l'inserimento e la cancellazione dei bordi lineare nel grado del grafico. Tuttavia, in pratica, il runtime assoluto può essere mantenuto piccolo utilizzando, ad esempio, "memmove". –