用于存储图形边缘的数据结构,以便我可以在c ++中以恒定时间访问边缘权重?

时间:2017-07-10 19:43:47

标签: c++ graph graph-theory

我使用邻接列表来存储图表。由于我使用邻接列表,我无法在恒定时间内访问图的边权重。那么,我想知道哪个EXTRA数据结构只用于由两个节点u和v索引的故事边缘?

目前,我正在尝试使用map<pair<int, int>, int>,但它具有日志(N)复杂性,unordered_map没有针对pairs的政策。我知道,边缘权重与{u,v}的顺序无关,但我无论如何都无法使用此功能。

2 个答案:

答案 0 :(得分:0)

使用邻接矩阵;一个二维数组,其中array[x][y]中的每个元素都是节点xy之间边缘的权重。

答案 1 :(得分:0)

一个非常简单的解决方案是创建一个存储每个节点的传出边加上权重的数组。您只需跳转到一个节点,搜索其中的其他节点的外出边缘并获取权重。复杂性是最大程度,我通常认为是上限。

唯一可以确保所有冗余信息保持一致。

class AdjacentWeightedEdges {

    struct OutgoingWeightedEdge {
        size_t target_node;
        int weight;
    }

    vector<OutgoingWeightedEdge> edges;
    int edge_weight(const size_t index) const {
        iterate through edges
        if an edge with index found, return it's weight
        raise an error if not
    }
}

class Graph {

    //your stuff as it is right inserted here

    vector<AdjacentWeightedEdges> adjacencies;

    int edge_weight(const size_t index_1, const size_t index_2){
        return adjacencies[index_1].edge_weight(index_2);
    }
}

如果像这样的1d方法产生内存问题,请考虑仅存储index_1&lt;的边缘。 index_2。

另一种类似的方法:

存储指向节点的指针数组,在邻接列表中使用边权重并直接执行我所做的操作。如果记忆存在问题,无论如何都不要使用索引。

这里的另一个答案是关于邻接矩阵 - 如果使用稀疏矩阵类的某个结构在行/列指针中存储第一个非零,然后指向每个后续的非零条目,那么这个甚至可以工作。虽然这基本上是我的方法崩溃。如果你还需要一个稀疏矩阵类,那么可能是值得的。