Triangle Count算法

来源:互联网 发布:战争程序员白濑 动漫 编辑:程序博客网 时间:2024/06/05 04:12

1.传统算法

1.1算法描述

Triangle Count在社交网络分析中是非常有用的。这个三角形是一个三结点的小图,其中结点两两相连。假如,在Facebook上,你认识两个校友,而这两个校友彼此有相互认识,那么你们三个就组成了一个三角形。像这样的,社交网络拥有越多的三角形,其联系也就业紧密。
Triangle Count的算法思想如下:
  1. 计算每个结点的邻结点,
  2. 统计对每条边计算交集,并找出交集中id大于前两个结点id的结点,
  3. 对每个结点统计Triangle总数,注意只统计符合计算方向的Triangle Count。
注意:计算三角形时,要有计算方向(如,起始结点id<中间结点id<目的结点id)。
假设结点A和结点B是邻居。结点A的邻结点集合是{B,C,D,E},结点B的邻结点集合是{A,C,E,F,G},而它们的交集是{C,E}。交集中的结点是结点A和结点B的共同邻结点,所以有{A,B,C}和{A,B,E}两个三角形。


1.2算法实现

def triangleCount(graph):    count = 0    tringle = []    for srcId in graph:        srcSet = graph.get(srcId)        for destId in srcSet:            if (destId > srcId):                destSet = graph.get(destId)                for vertexId in destSet:                    if(vertexId in srcSet) and (vertexId > destId):                        count += 1                        tringle.append((srcId, destId, vertexId))        print("===================================")    print("Triangle Count: ", count)    print(tringle)if __name__ == "__main__":    #directed graph    graph = {0: [1, 2], 1: [2, 3], 2: [3], 3: []}    #undirected graph    graph = {0: [1, 2], 1: [0, 2, 3], 2: [0, 1, 3], 3: [1, 2]}    triangleCount(graph)

2.基于矩阵的实现

2.1算法描述

其实,我们换个角度思考,会发现Triangle Count的算法有一个更简单的方法:如果结点i既能通过一条路径到达结点j,又能通过两条路径到达结点j(假设经过的中间结点是k),那么结点i、j、k就可以构成一个三角形。
如此一来,不由的就想起了邻接矩阵A,其的含义。中的元素表示从结点i经过k路径到达结点j的通路总数。如果不太清楚,可以参考基于矩阵实现的Connected Components算法中的介绍

现在不用我多说,大家也都猜到了出现在A和相同位置中的非零值,就表示可以形成三角形,而非零值的个数即为Triangle Count。用公式表示为:

假如,有一个图拥有四个结点,如下:

其邻接矩阵A和 分别是:

则可得,

2.2算法实现

Python代码实现如下:

from numpy.random import randimport numpy as npdef init(dimension):    mat = np.zeros((dimension, dimension))    mat[(rand(dimension) * dimension).astype(int), (rand(dimension) * dimension).astype(int)] = 1    return matdef triangleCount(adjacencyMat):    biAdjacencyMat = np.dot(adjacencyMat, adjacencyMat)    countIntersect = np.logical_and(adjacencyMat, biAdjacencyMat)    return countIntersect    if __name__ == "__main__":    adjacencyMat = np.array([[0, 1, 1, 0],                             [0, 0, 1, 1],                             [0, 0, 0, 1],                             [0, 0, 0, 0]])    dimension = 4    adjacencyMat1 = init(dimension)    print(triangleCount(adjacencyMat))


1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 美团机票不出票怎么办 东方航空会员锁定怎么办 大众车烧机油怎么办 大众cc烧机油怎么办 叫外卖给差评被打怎么办 发现宿舍被盗后怎么办 知了猴变黑了怎么办 婴儿仙人掌的刺怎么办 仙人掌刺扎进皮肤里怎么办 被仙人掌的小细绒刺扎到怎么办 值机截止了怎么办 社保卡消磁了怎么办 住宾馆没身份证怎么办 社保卡电话错误怎么办 没住过酒店怎么办 上海合规网约车证件怎么办 取票没有身份证怎么办 买车票没有身份证怎么办 登机身份证丢了怎么办 飞机没带身份证怎么办 上飞机没带身份证怎么办 机场没带身份证怎么办 儿童坐飞机没有户口本怎么办 不需要行李托运化妆品怎么办 坐飞机被限制了怎么办 坐飞机没买保险怎么办 飞机起飞时难受怎么办 婴儿坐飞机没座位怎么办 转机行李不直达怎么办 儿童自己坐飞机怎么办手续 两岁宝宝发烧怎么办 网上购票待核验怎么办 老人坐飞机找不到登机口怎么办 儿童不能值机怎么办 飞机上旅客刁难怎么办 飞机上婴儿哭闹怎么办 飞机上婴儿啼哭怎么办 飞机儿童陪护手续怎么办 孕妇感冒鼻子堵怎么办 孕妇用了眼药水怎么办 孕妇用眼药水了怎么办