Dada uma lista pythonlists = [ [1, 2], [2, 1], [3, 4] ]
de listas contendo números ie , o problema é retornar uma lista de todas as listas exclusivas da lista de entrada. Uma lista é considerada uma duplicata se puder ser gerada de outra lista reordenando os itens na lista. ie [2, 1]
é uma duplicata de [1, 2].
Dada a entrada [ [1, 2], [2, 1], [3, 4] ]
, a saída deve ser [ [1, 2], [3, 4]]
. Qualquer reordenação de [ [1, 2], [3, 4]]
também está correta ie [1, 2], [4, 3]],
Minha abordagem é primeiro classificar todas as listas na lista de entrada, converter as listas em tuplas, usar uma estrutura de dados definida para filtrar tuplas duplicadas e, finalmente, converter as tuplas exclusivas de volta para listas. A complexidade de tempo para classificar todas as listas é O(m*nlogn)
onde m é o número de listas e n é o tamanho de cada lista (assumindo listas do mesmo tamanho). Converter as listas em tuplas leva O(mn)
tempo, criar um conjunto a partir das tuplas leva O(mn)
, converter o conjunto de tuplas exclusivas de volta para listas também leva, O(mn)
tornando a complexidade de tempo total O (mnlogn + mn + mn + mn) = O(mnlogn)
.
Podemos fazer melhor do que O(mnlogn)
?
Código:
def find_unique(lists):
sorted_lists = [ sorted(lst) for lst in lists]
tuples = [tuple(lst) for lst in sorted_lists]
unique_tuples = set(tuples)
return list(unique_tuples)
Você pode obter uma solução O(m*n) contanto que a "chave" que você esteja usando seja O(m*n). Isso pode ser feito de duas maneiras.
Se as listas internas não puderem conter duplicatas, então um conjunto de conjuntos congelados é uma solução elegante. Note
frozenset(mylist)
que é O(n):O acima retorna a primeira lista "única" vista que está realmente na entrada. Se qualquer ordem de uma lista única for válida, mesmo uma ordem não vista na entrada original (presumo que seja esse o caso porque é isso que sua solução faz), então talvez mais sucintamente:
Se as listas internas puderem conter duplicatas, o procedimento acima não funcionará, mas você pode usar um
collections.Counter
que pode atuar como um multiconjunto e, então, usar um frozent-set dos itens no contador:Observe que, se
n
for pequeno, aposto que asorted
solução será mais rápida.Aqui está uma abordagem da teoria dos grafos, usada
igraph
para transformar uma lista de tuplas em um grafo não direcionadoo que dá