我在this视频中看到,使用以下算法计算星图的中心节点的聚类系数是theta(n ^ 2),对于clique,它是theta(n ^ 3)。那是对的吗?
def clustering_coefficient(G,v):
neighbors = G[v].keys()
if len(neighbors) == 1: return 0.0
links = 0.0
for w in neighbors:
for u in neighbors:
if u in G[w]: links += 0.5
return 2.0*links/(len(neighbors)*(len(neighbors)-1))
答案 0 :(得分:2)
复杂性取决于图表的密度以及in
谓词的效率。
完整图表上的天真实现显然是O(n^3)
:两个嵌套循环和一个in
谓词,每个都在线性时间内天真地运行。如果将链接保留在散列映射中(而不是密集矩阵表示中!)那么运行时只有O(n^2)
- 对于单个节点。但通常,这样的算法适用于每个节点,为其添加另一个因子n
。
如果您的图表不完整(并且使用更高效的in
谓词),事情会变得更快。假设每个节点都有sqrt(n)
个邻居,算法的复杂度将为O(sqrt(n)^2)*n
(对于所有节点),这可能是他们的O(n^2)
结果。
假设每个节点都有完全两个邻居。然后,复杂性可以轻松降低到O(1) * n
。哦,如果每个节点都有0个邻居,那就更简单了。