Suponha duas listas de itens comparáveis: u e s. Seja INV (u) o número de inversões em u.
Estou procurando um algoritmo eficiente para inserir os itens de s em u com um aumento mínimo de INV (u).
Basicamente, gostaria de inserir objetos em uma lista, mantendo-o "o mais ordenado possível", mantendo a ordem da primeira lista.
Exemplo:
u = [4,6,2,9,7]
INV(u) = 3 ((4, 2), (6, 2) and (9, 7)
s = [8,3,10]
one optimal solution u' = [3, 4, 6, 2, 8, 9, 7, 10]
INV(u') = 5 ((4, 2), (7, 2) and (9, 7) + (3,2), (8,7))
different optimal solution u' = [3, 4, 6, 2, 9, 7, 8, 10]
INV(u') = 5 ((4, 2), (7, 2) and (9, 7) + (3,2), (9,8))
Como você pode ver, não existe uma solução ideal única.
Eu ficaria feliz em qualquer tipo de idéias ou orientação para analisar.
algorithms
sorting
Trevor
fonte
fonte
Respostas:
Esta é uma elaboração sobre a resposta do Trevore. É muito longo para caber em um comentário e contém as provas de sua solução (ou pelo menos como eu a entendo).
Você pode mostrar que em qualquer solução ideal, os elementos de aparecerão ordenados.s s 1 < s 2 σ 1 s 1 s 2 s 1 β 1 s 1 σ 2 β 2 s 2 σ 1 ≤ σ 2 β 2 ≤ β 1 s 1 s 2 - β 1 + β 2 - σ 2 + σ 1 - 1Caso contrário, assuma e eles aparecem na ordem inversa em uma solução ideal. Vamos ser o número de elementos entre e que são menos de e ser o número daqueles que são maiores do que . Defina e mesma forma para . Observe que e . Trocando es1<s2 σ1 s1 s2 s1 1 β1 1 s1 1 σ2 β2 s2 σ1 1≤ σ2 β2≤ β1 1 s1 1 s2 alterará o número de inversões em que é no máximo -1.- β1 1+ β2- σ2+ σ1 1- 1
Não é difícil ver que elementos de podem ser inseridos independentemente.s s s s sComo eles parecem ordenados, os elementos de não "sentem" a presença um do outro. Ou seja, pares de elementos de não contribuem para a contagem de inversões. Para fazer isso, insira a mediana de idealmente em tempo linear. Em seguida, recursivamente, insira elementos de menor que a mediana à esquerda da mediana e elementos maiores que a mediana à sua direita.s s s s
Seja inserida a mediana na posição , o tempo de execução disso é satisfatório,, o linearO fator é encontrar a mediana e embaralhar os elementos de . É fácil mostrar por indução que .T ( | s | , | u | ) = T ( | s | / 2 , | u | - k ) + T ( | s | / 2 , k ) + | u | + | s | | s | s T ( | s | , | u | ) = Ok T( | s | , | u | ) = T( | s | / 2 , | u | - k ) + T( | s | / 2 , k ) + | u | + | s | | s | s T( | s | , | u | ) = O ( | s | log| s | + | u | registro| s | )
Observe que a dependência deaqui é ótimo. Como resolver o problema com vazio é equivalente a classificar usando apenas comparações. A dependência detambém é ideal, uma vez que o problema para uma lista Singleton e uma lista deve exigir trabalho linear.| s | você s | u | s você
fonte
Ok, aqui está a minha solução:
Uma observação (que eu mais ou menos provei) é que uma solução ótima será sempre aquela em que s é ordenado de forma crescente. Isso dá origem a um algoritmo O ((| u | + | s |) * log (| s |)).
Para encontrar a solução ideal para um único elemento, faça o que eu disse no meu comentário: Pegue um elemento de s, compare-o com cada elemento em u da esquerda para a direita, incremente um contador é uma inversão e carregue o número calculado anteriormente. Em seguida, percorra a lista da direita para a esquerda com o mesmo elemento, aumentando as contagens para cada posição.
Este é O (| u |).
Classificar s.
Para o elemento do meio de s na posição m: Encontre a melhor posição b em u (usando o método acima).
Divida s em me u em be recursivamente chame com as partes esquerda e direita, concatenando os resultados com m na ordem correta.
Pare assim que você estiver vazio.
fonte