Tenho várias listas que preciso combinar. Cada uma dessas listas tem uma ordem, e cada ordem é consistente com a ordem da lista original. (Por consistente, quero dizer que cada lista pode ser reproduzida removendo itens da lista original, sem reorganizar nenhum item .)
Meu problema é que não tenho a lista original e tenho que reproduzi-la o mais fielmente possível usando as listas parciais que tenho.
Por exemplo, considere as seguintes listas ordenadas:
a = ["first", "fourth", "fifth", "sixth", "eighth", "sophomore", "junior"]
b = ["second", "third", "fourth", "sixth", "seventh", "eighth", "freshman", "sophomore", "senior"]
c = ["first", "second", "freshman", "sophomore", "junior", "senior"]
...
partial_lists = [a, b, c, ...]
A partir dessas três listas, é possível recuperar a lista original. Em alguns casos, porém, isso pode não ser possível. De qualquer forma, quero criar uma lista merged_list
que merged_list
preserve a ordem de cada uma das listas parciais. (Ou seja, qualquer lista parcial especificada poderia, teoricamente, ser reconstruída merged_list
usando apenas merged_list.remove()
operações.) É seguro assumir que cada lista parcial não contém duplicatas e merged_list
também não deve conter nenhuma duplicata.
Para este exemplo, merged_list
seria["first", "second", "third", "fourth", "fifth", "sixth", "seventh", "eighth", "freshman", "sophomore", "junior", "senior"]
Existe um algoritmo eficiente que pode lidar com isso para um número arbitrário de listas parciais?
Isto é sobre classificação topológica , dadas algumas dependências.
Existem várias maneiras de encontrar uma lista original ordenada topológica. Será útil construir uma estrutura de dados de grafo que tenha todas as dependências codificadas por nós. Em seguida, produza os nós que não têm predecessores e remova-os do grafo. Isso resultará em um novo conjunto de nós sem predecessores, etc.
Aqui está uma implementação em Python:
Para este exemplo de execução, o
result
resultado será: