我有一个非常大的(10M +边缘,~5M顶点)二分无向用户 - 项目图形格式
item1: user1, user2, user3, ...
或
userX1: itemY1
userX2: itemY2
...
我需要将我的图形转换为项目 - 项目图形,其中i和j顶点之间的边缘权重等于同时使用两个项目的用户数量(即与item_i相邻的顶点集合的交集中的元素数量和item_j)。这就是问题,它似乎需要我做$ O(n ^ 2)$操作,其中$ n $是图中边缘的数量,这在当前拥有的简单家用电脑上是不可能的。这有什么解决方案吗?一些概率数据结构可以很好地满足我的需求,因为我可以丢失一小部分数据。
答案 0 :(得分:2)
符号:m =旧图中的边数
E
(建议格式的第二版)(取O(m log(m))E
并确定具有相同用户(O(m))F
(O(| F | = n_user x max_n_items_per_user ^ 2))F
中的所有重复项合并为单个边,边数权重由重复项数量(O(| F |))如果图表稀疏,即max_n_items_per_user很小,则上述应该相当有效。否则,该算法存在的问题是它在收缩之前枚举新图中的所有边,因此应该考虑如何直接获得边权重。