存储在数组中的PHP快速聚类元素

时间:2015-02-25 16:52:11

标签: php graph-algorithm clique

我有一个由150万对元素组成的数组(用''分隔):

$array {
    [0] => "element1 element2"
    [1] => "element2 element3"
    [2] => "element8 element4"
    [3] => "element8 element5"
    [4] => "element4 element5"
    [5] => "element6 element7"
    [6] => ... 
}     

每对元素都是唯一的,元素是15到20个字符的字符串。

在我的管道中,这个数组意味着[0]“element1与element2相关”,[1]“element2与element3相关”,...... 我想将所有相关元素聚集在一起,得到类似于的输出:

 $array_output {
      [0] => "element1 element2 element3"
      [1] => "element8 element4 element5"
      [2] => "element6 element7"
      [3] => ... 
 }  

我想这个任务非常简单,我可能错过了一个明显的方法,但我没有找到一种快速的方法来聚集我的元素(即从几分钟到几个小时)。

1 个答案:

答案 0 :(得分:0)

您有一个表示为邻接列表的图形,并且您希望将其转换为图形的连接组件列表。执行此操作的最佳方法是构建已连接的节点集,并为每个边合并它们,直到您没有更多边。

在PHP中执行此操作:

  1. 将输入转换为多维数组([["element1", "element2"],["element2","element3"]]等。)
  2. 在地图表示中初始化节点列表,每个节点指向仅包含该节点的集合(例如["element1" => ["element1"],"element2" => ["element2"]]等)。
  3. 对于数组中的每个配对(1)合并来自(2)的数组中两个元素的集合,并将两个元素以及集合中的任何其他元素指向新合并的集合
  4. 将(3)中的所有集合放入一组(集合),所以每次只能获得一次
  5. 将每组转换为所需的输出格式
  6. 您将需要使用引用运算符(&)以便在(3)中重用相同的数组。该算法在Java中更容易实现,或者具有更明显的散列图和哈希表。