我的天真最大集团发现算法比Bron-Kerbosch的运行速度更快。怎么了?

时间:2011-03-01 01:13:45

标签: ruby algorithm max clique

简而言之,我的天真代码(在Ruby中)看起来像:

# $seen is a hash to memoize previously seen sets
# $sparse is a hash of usernames to a list of neighboring usernames
# $set is the list of output clusters

$seen = {}
def subgraph(set, adj)
    hash = (set + adj).sort
    return if $seen[hash]
    $sets.push set.sort.join(", ") if adj.empty? and set.size > 2
    adj.each {|node| subgraph(set + [node], $sparse[node] & adj)}
    $seen[hash] = true
end

$sparse.keys.each do |vertex|
    subgraph([vertex], $sparse[vertex])
end

我的Bron Kerbosch实施:

def bron_kerbosch(set, points, exclude)
    $sets.push set.sort.join(', ') if set.size > 2 and exclude.empty? and points.empty?
    points.each_with_index do |vertex, i|
        points[i] = nil
        bron_kerbosch(set + [vertex],
                      points & $sparse[vertex],
                      exclude & $sparse[vertex])
        exclude.push vertex
    end
end

bron_kerbosch [], $sparse.keys, []

我还实现了旋转和简并排序,这减少了bron_kerbosch执行时间,但还不足以超越我的初始解决方案。这种情况似乎是错误的;我错过了什么算法见解?如果您需要查看完整的代码,这里有一个writeup,其中包含更多详细信息。我已经在伪随机集上测试了这个,其大小达到了一百万左右。

1 个答案:

答案 0 :(得分:3)

我不知道你如何为测试生成随机图,但我想你使用的函数根据均匀分布生成一个数字,从而得到一个非常均匀的图。当在图上测试算法时,这是一个常见的问题,创建好的测试用例非常困难(通常和解决原始问题一样困难)。

max-clique问题是一个众所周知的NP难题,两个算法(天真的和一个Bron Kerbosch)具有相同的复杂性,因此我们不能指望所有测试用例的全局改进,而只是一个改进一些特殊情况。但是因为您使用统一分布来生成图形,所以没有这种特殊情况。

这就是为什么两种算法的性能在您的数据上非常相似的原因。而且因为Bron Kerbosch算法比天真的算法复杂一点,所以天真的算法更快。