Suponha que você tenha um conjunto de conjuntos de números inteiros. É possível que alguns dos conjuntos se sobreponham (isto é, compartilhando elementos). Você pode se livrar das sobreposições excluindo elementos dos conjuntos, mas alguns deles podem acabar vazios; isso seria uma vergonha. Podemos tornar todos os conjuntos disjuntos sem esvaziar nenhum deles?
Observe que, nessa situação, nunca há motivo para deixar vários elementos em um conjunto; portanto, esse problema sempre pode ser resolvido reduzindo-se cada conjunto a apenas um elemento. Essa é a versão do problema que estamos resolvendo aqui.
A tarefa
Escreva um programa ou função, da seguinte maneira:
Entrada : uma lista de conjuntos de números inteiros.
Saída : uma lista de números inteiros, do mesmo tamanho que a entrada, para a qual:
- Todos os números inteiros na saída são distintos; e
- Cada número inteiro na saída é um elemento do conjunto correspondente da entrada.
Esclarecimentos
- Você pode representar um conjunto como uma lista, se desejar (ou o que for apropriado para o seu idioma), desconsiderando a ordem dos elementos.
- Você não precisa lidar com o caso em que não existe solução (ou seja, sempre haverá pelo menos uma solução).
- Pode haver mais de uma solução. Seu algoritmo sempre deve produzir uma solução válida, mas pode ser não determinístico (ou seja, tudo bem se ele escolher uma solução válida diferente toda vez que for executado).
- O número de números inteiros distintos que aparecem na entrada, n , será igual ao número de conjuntos na entrada e, por simplicidade, serão os números inteiros de 1 a n, inclusive (já que seus valores reais não importam). Depende de você se você deseja explorar esse fato ou não.
Casos de teste
[{1,2},{1,3},{1,4},{3,4}] -> [2,3,1,4] or [2,1,4,3]
[{1,3},{1,2,4},{2,3},{3},{2,3,4,5}] -> [1,4,2,3,5]
[{1,3,4},{2,3,5},{1,2},{4,5},{4,5}] -> [1,3,2,4,5] or [3,2,1,4,5] or [1,3,2,5,4] or [3,2,1,5,4]
Condição de vitória
Um programa requer uma complexidade de tempo ideal para vencer, ou seja, se um algoritmo com uma complexidade de tempo melhor for encontrado, desqualifica todas as entradas mais lentas. (Você pode supor que os componentes internos do seu idioma sejam executados o mais rápido possível, por exemplo, você pode assumir que um componente ordenado seja executado no tempo O (n log n). Da mesma forma, suponha que todos os números inteiros de tamanho comparável a n possam ser adicionados, multiplicados, etc. em tempo constante.)
Como é provável que seja fácil obter uma complexidade de tempo ideal na maioria dos idiomas, o vencedor será, portanto, o programa mais curto entre aqueles com complexidade de tempo vencedora, medidos em bytes.
fonte
Respostas:
Geléia , 8 bytes
Experimente online!
Explicação
Extremamente ineficiente. Assintótico de
ϴ(n^(n+1))
acordo com Misha Lavrov; Eu acho que está certo.fonte
unique
função @HyperNeutrino na verificação de uso de geléia JellyO(n)
(x in s
), cada uma deve levar deO(n)
acordo com esta página , portanto,Q
deve levar noO(n^2)
pior caso / complexidade média de tempo do caso. Portanto, o algoritmo éO(n^(n+2))
. (original pode serO(n)
no caso de todos os elementos são iguais, em que cada cheque de contenção é executado emO(1)
) --- Em uma nota não relacionada, é possível implementarunique
noO(n)
usando Python incorporadoset
estrutura de dados que é mistura-conjunto. Enfim, o Jelly não foi projetado para ser eficiente.Wolfram Language (Mathematica) , 87 bytes e ϴ (n 3 )
Experimente online!
Constrói um gráfico bipartido cujos vértices de um lado são os conjuntos (indexados por
-1,-2,...,-n
) e cujos vértices do outro lado são os elementos1,2,...,n
, com uma aresta de-i
atéj
quandoj
contida noi
-ésimo conjunto. Encontra uma correspondência perfeita neste gráfico usando um built-in. Em seguida, lista os elementos correspondentes-1,-2,...,-n
nessa ordem na correspondência perfeita.O Mathematica
FindIndependentEdgeSet
é o gargalo aqui; tudo o mais exige operações O (n 2 ). O Mathematica provavelmente usa o algoritmo húngaro e, portanto, assumirei que ele é executado em ϴ (n 3 ) , embora seja possível que o Mathematica tenha uma implementação ingênua com complexidade O (n 4 ).fonte
Haskell , 48 bytes
-1 byte graças a nimi.
Experimente online!
fonte
mapM id
em vez desequence
Mathematica 39 Bytes
Na questão da complexidade, acho que é muito dependente do tamanho de cada sub-lista, bem como uma medida de quão disjuntos são os sublistas.
Então, acho que esse algoritmo é O (n Log n + n ^ 2 Log m), em que m é aproximadamente o comprimento médio de cada sub-lista.
Algo assim teria complexidade O (a ^ n) onde a> 1 é uma medida da sobreposição em sublistas:
Difícil dizer qual é realmente mais rápido sem conhecer as propriedades de possíveis entradas.
fonte
DeleteDuplicates /@ Tuples@#
etapa leva tempo ϴ (n ^ (n + 1)) pelos mesmos argumentos das outras soluções. Em seguida,Union
há uma lista de comprimento n ^ n para classificar, o que leva tempo O (n ^ (n + 1) log (n)) - mas talvez seja mais rápido, pois no máximo 2 ^ nn! elementos nessa lista são distintos. De qualquer forma, a complexidade é ϴ (n ^ (n + 1)) até um fator de log (n).Tuples@#
tamanho 2 ^ n, portanto, sua primeira estimativa assintótica não pode ser verdadeira.05AB1E , 13 bytes, O (n! * N)
Experimente online! Explicação:
fonte
Casca , 5 bytes
Experimente online!
Explicação
Acabei de ver o que é complexidade: como costuma acontecer na solução das linguagens de golfe, elas não são muito eficientes - essa possui complexidade O (n · nⁿ).
fonte
Pitão , 9 bytes (ϴ (n n + 1 ))
Como isso funciona exatamente como a solução Jelly, provavelmente tem a mesma complexidade.
Experimente aqui!
Quão?
fonte
JavaScript (ES6),
7473 bytes1 byte salvo, graças a @Neil.
Iera repetidamente pela matriz, procurando uma solução.
Ungolfed:
Casos de teste:
Mostrar snippet de código
fonte
a?a.map(
...)&&S:s
?Python3,
9384 bytes-9 bytes graças a caird coinheringaahing
Experimente online!
fonte