如何将大型二分图用户项转换为项目项?

时间:2014-02-07 20:22:49

标签: algorithm list data-structures graph-algorithm

我有一个非常大的(10M +边缘,~5M顶点)二分无向用户 - 项目图形格式

item1: user1, user2, user3, ... 

userX1: itemY1
userX2: itemY2
... 

我需要将我的图形转换为项目 - 项目图形,其中i和j顶点之间的边缘权重等于同时使用两个项目的用户数量(即与item_i相邻的顶点集合的交集中的元素数量和item_j)。这就是问题,它似乎需要我做$ O(n ^ 2)$操作,其中$ n $是图中边缘的数量,这在当前拥有的简单家用电脑上是不可能的。这有什么解决方案吗?一些概率数据结构可以很好地满足我的需求,因为我可以丢失一小部分数据。

1 个答案:

答案 0 :(得分:2)

符号:m =旧图中的边数

  1. 按用户排序边缘列表E(建议格式的第二版)(取O(m log(m))
  2. 浏览E并确定具有相同用户(O(m))
  3. 的所有连续边的运行
  4. 运行中的每对边缘都会在新图表中为您提供边缘 - >将其添加到新图的边F(O(| F | = n_user x max_n_items_per_user ^ 2))
  5. F中的所有重复项合并为单个边,边数权重由重复项数量(O(| F |))
  6. 如果图表稀疏,即max_n_items_per_user很小,则上述应该相当有效。否则,该算法存在的问题是它在收缩之前枚举新图中的所有边,因此应该考虑如何直接获得边权重。