Eu tenho um conjunto de pares:
inputs = {
('id1', 'id2'), ('id1', 'id3'), ('id1', 'id4'),
('id2', 'id3'), ('id2', 'id4'),
('id3', 'id4'), ('id3', 'id5'),
('id4', 'id5'),
('id5', 'id6'),
}
E eu gostaria de inverter as combinações de ordem 2, assim:
recombinations = [
('id1', 'id2', 'id3', 'id4'),
('id3', 'id4', 'id5'),
('id5', 'id6'),
]
Consegui fazer isso usando força bruta:
ids = list(sorted( {i for i in itertools.chain(*inputs)} ))
excludes = set()
recombinations = {tuple(i) for i in map(sorted, inputs)}
for i in range(3, len(ids)+1):
for subset in itertools.combinations(ids, i):
for j in range(i-1, len(subset)):
combs = set(itertools.combinations(subset, j))
if all(tup in recombinations for tup in combs):
recombinations.add(subset)
excludes = excludes.union(combs)
for tup in excludes:
recombinations.remove(tup)
print(recombinations)
{('id1', 'id2', 'id3', 'id4'), ('id3', 'id4', 'id5'), ('id5', 'id6')}
Minha pergunta é: existe uma maneira mais inteligente de fazer isso ou algumas otimizações que eu poderia implementar no código?
Usando a
networkx
biblioteca, isso é bastante simples, pois ela possui uma função que faz exatamente o que você está pedindo: encontrar todos os cliques máximos em um gráfico.Aqui:
Saída:
É claro que se sua tarefa é implementar o algoritmo Bron-Kerbosch você mesmo, você terá que codificá-lo - mas perguntar no StackOverflow meio que anula o propósito, a menos que você tenha um problema específico com sua solução e precise de ajuda?
Se você está apenas solicitando uma revisão do seu código, pergunte no Code Review Stack Exchange, mas espere receber instruções para usá-lo
networkx
também.