Мой наивный алгоритм поиска максимальной клики работает быстрее, чем алгоритм Брон-Кербоша. Что не так?

Вкратце, мой наивный код (на 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, но этого недостаточно, чтобы обогнать мое первоначальное решение. Кажется неправильным, что это так; какое алгоритмическое понимание мне не хватает? Вот запись с более подробной информацией, если вам нужно увидеть полностью рабочий код. Я тестировал это на псевдослучайных наборах размером до миллиона или около того.

7
задан Andrew Grimm 18 December 2011 в 21:28
поделиться