7
总之,我天真的代码(Ruby)的样子:我天真的最大派系查找算法比Bron-Kerbosch的运行速度更快。怎么了?
# $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
我的布龙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。我已经在伪随机集上测试了这个大小为一百万左右的边。
我在其他一些测试用例上测试过你的代码,它的速度大约是B-K的两倍。你的测试是什么样的? – user635541 2011-03-01 02:01:41
从伪随机程序生成边缘。你介意你是否倾销你的测试用例和代码以供我玩吗? – 2011-03-01 02:18:38
http://www.mediafire.com/file/5x5p7tu2t9c7r1a/tests.zip – user635541 2011-03-01 02:32:03