Algoritmos de tempo pseudo-polinomial mais rápidos para PARTITION

8

Eu quero particionar N dados (pode ou não ser igual) em 2 subconjuntos, de modo que os 2 subconjuntos tenham a soma o mais próximo possível e também a cardinalidade dos conjuntos seja igual (se n for par) ou diferir apenas por 1 ( se n for ímpar).

Acho que podemos fazer isso no tempo pseudo-polinomial , onde é a soma dos números no conjunto.O(n2A)A

Posso fazer melhor que isso? Ou seja, existe um algoritmo de tempo pseudo-polinomial que é executado no tempo O(ncA) com c<2 ?

Desde já, obrigado!

Firebrandt
fonte
1
Observe que, como um caso especial da mochila, ela possui um FPTAS . Veja, por exemplo, o ELLawler. Algoritmos de aproximação rápida para problemas de mochila .
Mathieu Chapelle
1
@Oleksandr, por melhor, quis dizer que existe um algoritmo pseudo-polinomial que roda em O (nA). desculpe por não conseguir postar em látex.
Firebrandt
4
Receio que esta questão esteja na fronteira de ser muito elementar. Por exemplo, "O problema da Partição com a restrição adicional de que os dois conjuntos devem ter cardinalidade igual ainda está completo-NP?" pode ser uma pergunta típica da lição de casa e tenho medo de que escrever a resposta possa ter um impacto negativo em alguns cursos de complexidade computacional.
Tsuyoshi Ito 30/01
6
Como isso é muito elementar? A abordagem óbvia fornece , e a questão é se existe um algoritmo melhor em execução no tempo que . Meu palpite é que essa é uma pergunta em aberto. O ( n c A ) c < 2O(n2A)O(ncUMA)c<2
quer
3
@Febrebrandt: Tomei a liberdade de editar sua pergunta original para adicionar minha versão do seu esclarecimento (alterar para com , pois acho que mesmo essa é provavelmente uma pergunta em aberto). Sinta-se à vontade para alterá-lo novamente para se desejar. Penso que a questão, conforme esclarecida pelos seus comentários, é claramente de nível de pesquisa. O ( n c A ) c < 2 O ( n A )O(nUMA)O(ncUMA)c<2O(nUMA)
Peter Shor

Respostas:

7

Pode-se resolver o problema de decisão em .O~(nUMA)

Deixe que a sequência de números ser . Defina como um conjunto tal que se existir uma subsequência de de comprimento que seja igual a . Se , precisamos apenas de tempo adicional para completo para resolver o seu problema.F S ( i , j ) F S S j i F S O ( n A ) F SSFS(Eu,j)FSSjEuFSO(nUMA)FS

Se e são duas subsequências que particionam , entãoS 2 SS1S2S

FS=FS1+FS2

onde é a soma de minkowski e a adição entre as tuplas é definida em termos de coordenadas.UMA+B={uma+b|umaUMA,bB}

Reivindicação: Computar de e leva .F S 1 F S 2 ˜ O ( | S | A )FSFS1FS2O~(|S|UMA)

Prova: aplique convolução 2D em duas tabelas de tamanho.UMA×|S|

O algoritmo particiona a sequência em duas seqüências de tamanho igual, aplica recursão a cada uma e obtém a soma minkowski do resultado. Seja o pior caso de tempo de execução quando a entrada do algoritmo tiver elementos e for um limite superior da soma. Temos que mostra .TUMA(n)nUMA

TUMA(n)=2TUMA(n/2)+UMAO~(n)
TUMA(n)=O~(nUMA)

O escondidos fator é .log n log n AregistroregistronregistronUMA

Chao Xu
fonte
3

Se alguém se importa com os fatores de , com uma análise cuidadosa, podemos provar que a complexidade do tempo para o algoritmo de Chao é O ( n A log ( n A ) ) .registroO(nUMAregistro(nUMA))

Prova. Na nona camada da árvore de recursão, dividimos o conjunto em dois conjuntos de tamanho igual S 1 e S 2 , o que fornece T e ( n , A ) = T o ( n / 2 , A ) + T o ( n / 2 , A - A ) + O ( n A log ( n A ) ) ,SS1S2

Te(n,UMA)=To(n/2,UMA)+To(n/2,UMA-UMA)+O(nUMAregistro(nUMA)),
e na camada ímpar da árvore de recursão, particionamos o conjunto em dois conjuntos "igualmente somados" S 1 e S 2 . Para ser mais preciso, podemos particionar um conjunto S com a soma A em dois conjuntos S 1 e S 2 com cada um deles somando A / 2 , com no máximo um elemento restante. Podemos lidar com esse elemento com programação dinâmica trivial em O ( A ) . Isso fornece T o ( n , A ) = T eSS1S2SUMAS1S2UMA/2O(UMA) que n 1 = | S 1 | . Portanto, temos T ( n , A ) 4 i = 1 T ( n i ,
To(n,UMA)=Te(n1,UMA/2)+Te(n-n1,UMA/2)+O(nUMAregistro(nUMA)),
n1=|S1| onde4 i = 1 n in ,4 i = 1 A iA , ei , n in / 2 , A iA / 2 . Isso nos dará T ( n , A )
T(n,UMA)Eu=14T(nEu,UMAEu)+O(nUMAregistro(nUMA)),
Eu=14nEunEu=14UMAEuUMAEu, nEun/2, UMAEuUMA/2 .T(n,UMA)=O(nUMAregistro(nUMA))
hqztrue
fonte