Weisfeiler-Lehman算法測試圖同構

背景

Weisfeiler-Lehman算法(威斯費勒-萊曼算法)是測試圖同構的經典算法之一,我在這兒記錄一下它的實現原理,參考文章爲Weisfeiler-Lehman Graph Kernels

僞代碼

論文中的僞代碼如下所示

假設要測試同構的兩張圖爲G和G`,那麼在結點v的第i次迭代裏,算法都分別做了四步處理:標籤複合集定義、複合集排序、標籤壓縮和重標籤。

標籤複合集定義

如果是第一次迭代, v的標籤複合集裏只有一個元素,就是v的標籤。

如果不是第一次迭代,v的標籤複合集元素就是v的所有鄰居在上一輪迭代裏,生成的標籤。

複合集排序

首先,對複合集裏的元素進行升序排序,並把排序好的元素拼接爲一個字符串s;然後把v在上一輪迭代生成的標籤作爲前綴,添加到這個s裏。

標籤壓縮

對兩張圖G和G`中所有結點的字符串s,進行升序排列;然後通過映射函數f,把每一個s映射成一個壓縮標籤,並且當且僅當s1 = s2時,生成的壓縮標籤才一樣。

也是說,壓縮標籤類似於s的標識符,而映射函數f完全可以用計數函數來實現。其實只要能讓s和壓縮標籤一一對應,前面的對s進行升序排列這一步就沒必要做了。

重標籤

將壓縮標籤作爲結點v在兩張圖中的第i輪標籤。

如果G和G`在這一輪生成的標籤集不一樣,那麼這兩張圖就不是同構的,算法直接結束。

舉例

以下面的圖爲例,圖a到圖d顯示了威斯費勒-萊曼算法在G和G`上的第一輪迭代過程

圖a是初始形態,結點的標籤對應結點類型。

圖b則是複合集的生成與排序拼接的結果。對於某個結點v,他的複合集是鄰居在上一輪迭代生成的標籤集。但是上一輪迭代爲初始化,那麼鄰居在上一輪迭代生成的標籤就是鄰居的結點類型。因此,以圖G爲例,兩個1號結點的複合集就都是{4},4號結點的複合集就是{1, 1, 3, 5}(要升序排列),其餘以此類推。完成之後,把排序好的複合集中的元素,依次拼接成字符串s,然後把結點標籤本身,作爲前綴拼接到s前面。在G中,對於結點1,生成的s就是"1, 4";對於結點4,生成的s就是"4, 1135"。最後,用s替代結點v的標籤。

圖c則是標籤壓縮過程,把G和G`中所有的複合集按升序排列,並且按順序依次標號。這裏的排序規則是按元素數值的升序進行排列,因此{2, 3}在{1, 4}前面,{2, 4, 5}在{2, 3, 5}前面。由於經過上一輪迭代(初始迭代),圖中已經出現了5類結點,那麼這裏的編號從6開始。

圖d則是最後一步重排序,用生成的編號代替每個結點的複合集,得到結點在這一輪迭代中生成的新標籤。

對於上面的兩張圖來說,第1輪生成的新標籤集合就已經不一樣了,因此他們倆是異構圖。

時間複雜度

由於每一輪迭代主要處理的是排序,那麼假設對於某個圖G,每一次迭代可以生成的複合集中有m個元素,根據計數排序,迭代時間複雜度就是O(m)。每一輪生成的複合集的元素數量m是>=結點數n的,因爲每個結點的複合集都至少包含自己的標籤。

如果迭代次數爲h,那麼威斯費勒-萊曼算法計算複雜度就是O(hm)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章