Subject: Re: Adjacency Arrays in Graph Proposal (p1709r0)
From: Matthew Galati (matthew.galati_at_[hidden])
Date: 2019-07-20 05:33:03
âAdjacency arrayâ is really just an adjacency sparse matrix.
We might want to consider using some standardized matrix storage object.
Sent from my iPhone
> On Jul 20, 2019, at 2:40 AM, Sebastian Messmer via SG19 <sg19_at_[hidden]> wrote:
> Upon further research, I found that the terms are used inconsistently in different sources.
> The way Iâve learned and am using the terms is consistent with a Carnegie Mellon class I found: http://www.cs.cmu.edu/afs/cs/academic/class/15210-s12/www/lectures/lecture07.pdf
> They have four graph layouts: adjacency matrix, adjacency list, adjacency array and edge list (edge list is the one where thereâs just one array with all edges and each edge stores both corresponding vertex indices).
> But Iâve also found sources that describe what I know as âadjacency arrayâ but call it âadjacency listâ: https://www.sciencedirect.com/topics/computer-science/adjacency-list
> Though I donât know what they call what I and the class linked above know as âadjacency listâ then, maybe âlinked adjacency listâ?
> Given this inconsistent situation, we should probably decide for a terminology and then define the terms in the paper before we use them.
> From: SG19 <sg19-bounces_at_[hidden]> on behalf of Sebastian Messmer via SG19 <sg19_at_[hidden]>
> Reply-To: "sg19_at_[hidden]" <sg19_at_[hidden]>
> Date: Thursday, July 18, 2019 at 7:28 PM
> To: "sg19_at_[hidden]" <sg19_at_[hidden]>
> Cc: Sebastian Messmer <messmer_at_[hidden]>
> Subject: [SG19] Adjacency Arrays in Graph Proposal (p1709r0)
> I looked through the graph proposal paper and I think there might be some misunderstandings about what I meant when I talked about adjacency arrays in our phone call.
> I found a picture online that might make things a bit more clear: https://www.researchgate.net/figure/The-adjacency-list-data-structure-used-in-our-implementation-shown-for-a-sample-graph_fig1_268988477
> (they call it adjacency list in that link, but itâs actually an adjacency array).
> An adjacency array stores all edges in one array, but sorted by vertex. There is an additional vertex array that stores pointers to its first edge in the edge array.
> Say V is that vertex array and E is the edge array, then E[V[i] â¦ V[i+1]-1] is the range storing all edges for vertex I, usually they store the vertex index of the vertex on the other side of the edge.
> A directed graph that only needs to be forward-traversable does not store backwards edges, for each vertex the edge array only holds the out-edges.
> A undirected graph stores each edge twice, once for each vertex.
> A directed graph that need to be forward- and backward-traversable can be implemented by storing two indices in/out per vertex. E[V[i].in ... V[i].out-1] stores the in-edges and E[V[i].out ... V[i+1].in-1] stores the out-edges. This also means that each edge is stored twice.
> Adjacency arrays are very fast and cache-efficient when traversed but slow when modified. They are often used for map data and route planning because map data doesnât change that often.
> Following this, thereâs a few errors in the paper, for example:
> Inserting a new edge to a pre-existing node is O(number of edges), not O(1), because it needs to add a new entry to the middle of the edge array
> The paper claims âFor instance, edges in an adjacency matrix should only be as big as the user-defined edge value, and for an adjacency array should be the size of user-defined edge value and in and out vertex references (vertex_id or pointer).â. Actually, an edge only stores only one vertex reference, not an in- and out-reference.
> Sebastian Messmer
> SG19 mailing list
SG19 list run by email@example.com
SG19 Archives on Google Groups