我有一个由邻接矩阵表示的无向图G =(V,E)。对于每个边缘,我必须计算它的弱点。弱点 d 计算如下:
其中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 |),我是对的吗?
答案 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 |)。