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.
Posso fazer melhor que isso? Ou seja, existe um algoritmo de tempo pseudo-polinomial que é executado no tempo com ?
Desde já, obrigado!
ds.algorithms
co.combinatorics
partition-problem
Firebrandt
fonte
fonte
Respostas:
Pode-se resolver o problema de decisão em .O~(nA)
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 SS FS (i,j)∈FS S j i FS O(nA) FS
Se e são duas subsequências que particionam , entãoS 2 SS1 S2 S
onde é a soma de minkowski e a adição entre as tuplas é definida em termos de coordenadas.A + B = { a + b | a ∈ A , b ∈ B }
Reivindicação: Computar de e leva .F S 1 F S 2 ˜ O ( | S | A )FS FS1 FS2 O~( | S| A)
Prova: aplique convolução 2D em duas tabelas de tamanho.A × | 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 ) n UMA
O escondidos fator é .log n log n Aregistro registron logn A
fonte
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 ) ) .registro O ( n Um log( n A ) )
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 ) ) ,S S1 S2
fonte