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

前端之家收集整理的这篇文章主要介绍了ruby – 我的天真最大团队发现算法比Bron-Kerbosch的运行速度更快.怎么了?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
简而言之,我的天真代码(在 @L_502_0@中)看起来像:
  1. # $seen is a hash to memoize prevIoUsly seen sets
  2. # $sparse is a hash of usernames to a list of neighboring usernames
  3. # $set is the list of output clusters
  4.  
  5. $seen = {}
  6. def subgraph(set,adj)
  7. hash = (set + adj).sort
  8. return if $seen[hash]
  9. $sets.push set.sort.join(",") if adj.empty? and set.size > 2
  10. adj.each {|node| subgraph(set + [node],$sparse[node] & adj)}
  11. $seen[hash] = true
  12. end
  13.  
  14. $sparse.keys.each do |vertex|
  15. subgraph([vertex],$sparse[vertex])
  16. end

我的Bron Kerbosch实施:

  1. def bron_kerbosch(set,points,exclude)
  2. $sets.push set.sort.join(',') if set.size > 2 and exclude.empty? and points.empty?
  3. points.each_with_index do |vertex,i|
  4. points[i] = nil
  5. bron_kerbosch(set + [vertex],points & $sparse[vertex],exclude & $sparse[vertex])
  6. exclude.push vertex
  7. end
  8. end
  9.  
  10. bron_kerbosch [],$sparse.keys,[]

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

解决方法

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

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

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

猜你在找的Ruby相关文章