估算图算法

时间:2016-02-16 11:39:26

标签: algorithm graph time-complexity

我有一个由邻接矩阵表示的无向图G =(V,E)。对于每个边缘,我必须计算它的弱点。弱点 d 计算如下:
weakness
其中Nx是x的直接节点集合(直接节点是指x中路径为1的节点) 我已经编写了这个算法,但我不确定如何评估它的复杂性。

float **graph_weakness(struct graph *g)
{
    int i;
    int j;
    int n = g->n;
    struct edge *edge;
    int rel_union;
    int rel_intersect;
    int idx;
    float **m = graph_to_matrix(g);

    /* complessità: O(|V|/2|E|) */
    for (i = 0; i < n; i++) {
        edge = g->nodes[i]->edges;
        while (edge != NULL) {
            idx = edge->idx;
            if (m[i][idx] == MATRIX_SET) {
                rel_union = 0;
                rel_intersect = 0;
                for (j = 0; j < n; j++) {
                    if (m[i][j] != 0.0 || m[idx][j] != 0.0) {
                        rel_union++;
                    }
                    if (m[i][j] != 0.0 && m[idx][j] != 0.0) {
                        rel_intersect++;
                    }
                }
                m[i][idx] = 1 - (float) rel_intersect / rel_union;
                m[idx][i] = m[i][idx];
            }
            edge = edge->next;
        }
    }

    return m;
}

算法迭代边缘,每个边缘使用1 ... | V |的循环计算集合的交集和并集。
Tha矩阵是对称的,因此计算是在一半的边缘上进行的 因此复杂性应该是O(| E | / 2 * | V |)= O(| E | * | V |),我是对的吗?

1 个答案:

答案 0 :(得分:2)

该行

float **m = graph_to_matrix(g);

可能是Θ(| V | | E |)

(取决于您的矩阵库)。

(或许与您的问题中的陈述相反),算法首先循环遍历所有节点

for (i = 0; i < n; i++) {

对于每个节点,它遍历所有邻居

while (edge != NULL) {

并且对于每个邻居,它再次遍历所有节点

for (j = 0; j < n; j++) {

因此,假设您的图形具有邻接列表表示,则第一个+第二个循环将完全运行 O(| E | + | v |)次,并且每次迭代都会迭代 | V | 项目。

因此,该算法是 O((| E | + | V |)| V |)