【问题标题】:Computing the clustering coefficient计算聚类系数
【发布时间】:2012-12-13 17:11:09
【问题描述】:

我在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))

【问题讨论】:

    标签: algorithm graph machine-learning cluster-analysis data-mining


    【解决方案1】:

    复杂性取决于图形的密度以及in 谓词的效率。

    一个完整图的幼稚实现显然是O(n^3):两个嵌套循环和一个in 谓词,每个都在线性时间幼稚地运行。如果您将链接保留在哈希图中(而不是密集矩阵表示!),则运行时间仅为 O(n^2) - 对于单个节点。但通常情况下,每个节点都应用这样的算法,为其添加另一个因子n

    如果您的图表不完整(并且您使用更高效的in 谓词),事情会变得更快。假设每个节点都有sqrt(n)邻居,那么算法的复杂度将是O(sqrt(n)^2)*n(对于所有节点,也就是),这可能是他们的O(n^2)结果。

    假设每个节点恰好有两个邻居。然后可以很容易地将复杂性降低到O(1) * n。哦,如果每个节点都有 0 个邻居,那就更简单了。

    【讨论】:

    • 但在 python 中,字典的 in 运算符的复杂性是 theta(1)。所以算法的复杂度应该是theta(n^2)。为什么在视频中说它是 theta(n^3)?
    • 可能是因为他们为 所有 个实例这样做。
    • 这是一个图示例:{ 'a' : { 'b' : True, 'c' : True }, 'b' : { 'a' : True, 'c' : True },'c':{'a':真,'b':真}}。 if 语句不接受 theta(1) 因为它是字典吗?如果它需要 theta(1),我们有循环的 theta(n^2) 和一个需要 theta(1) 的 if 语句,所以它应该是 theta(n^2) 用于星形图和完整图。我错了吗?
    • 我假设 whole 函数将被调用n 次。
    猜你喜欢
    • 2021-07-21
    • 2017-04-21
    • 2019-07-21
    • 2019-01-03
    • 2012-09-25
    • 2019-05-27
    • 1970-01-01
    相关资源
    最近更新 更多