Inserção eficiente na lista, mantendo o número mínimo de inversões


15

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.


Alimento para reflexão: A abordagem ingênua seria: Pegue um elemento de s, compare-o com cada elemento em u da esquerda para a direita, aumente se for 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. Isso é executado em O (| s | * | u |) com espaço = O (| u |)
Trevor 15/04/16

11
A inspeção de todas as subsequências crescentes máximas pode levar a algum lugar.
Raphael

Respostas:


2

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. ss 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σ1s1s2s1 1β1 1s1 1σ2β2s2σ1 1σ2β2β1 1s1 1s2alterará o número de inversões em que é no máximo -1.-β1 1+β2-σ2+σ1 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.ssss

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 | ) = OkT(|s|,|você|)=T(|s|/2,|você|-k)+T(|s|/2,k)+|você|+|s||s|sT(|s|,|você|)=O(|s|registro|s|+|você|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|você|svocê


Obrigado por elaborar. Essa é exatamente a solução que eu quis dizer.
Trevore

1

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.


Eu não entendo isso. s é uma entrada. Você não pode assumir que s está na ordem classificada. Seu algoritmo deve funcionar para todos os valores possíveis de s.
DW

Sim, mas em qualquer solução ideal, os elementos de s sempre acabam sendo classificados de forma crescente na nova matriz. Observe a etapa "Classificar s". Veja o exemplo acima. O que eu provei até agora é que: para a, b em s, a <b se a é otimamente colocado em u, então o local ideal para b é à direita de a.
Trevore
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.