No problema clássico de soma de subconjuntos, há um conjunto S e um alvo t, e o objetivo é encontrar um subconjunto de S cuja soma seja t. Esta variante tem uma solução em tempo pseudopolinomial.
Em uma variante do problema da soma de subconjuntos, o objetivo é encontrar todos os subconjuntos de S cuja soma é t. Esta variante não possui solução em tempo pseudopolinomial; veja as respostas aqui: Obtendo todos os subconjuntos do problema da soma de subconjuntos em Python usando Programação Dinâmica . Um dos comentários explica que, no pior caso, quando você tem N zeros e a soma necessária também é zero, você precisará gerar todos os 2^n - 1 subconjuntos - portanto, não é possível obter um resultado melhor que O(2^n).
E se não diferenciarmos entre dois itens do mesmo valor (de modo que, se dois conjuntos forem compostos de alguns itens com os mesmos valores, eles serão considerados o mesmo conjunto) --- qual é a complexidade de tempo de execução para gerar todos os diferentes subconjuntos com soma t?
Acredito que o pior caso para o seu problema revisado é que o conjunto seja composto por todos os inteiros de
-m
am
, buscando uma soma de0
. Este conjunto não possui nenhuma duplicata.Neste caso
n = 2m+1
, comon
em
variam por um fator constante, eles são os mesmos no que diz respeito ao big-O.A maior soma possível é
m*(m+1)/2
e a menor é-m*(m+1)/2
. Isso significa que os2^n
subconjuntos possíveis são divididos entreO(n^2)
somas possíveis. Isso cria um limite inferior imediato deO(2^n / n^2)
, que é exponencial.Esse limite inferior pode ser ligeiramente melhorado usando o teorema do limite central. Considere o caso de um conjunto aleatório. Ele é a soma de
n
variáveis aleatórias. Cada variável aleatória tem alguma médiai
e variância(i/2)^2
. A soma das variáveis aleatórias tem média0
e variânciaO(n^3)
. Portanto, é aproximadamente uma distribuição normal com média0
e desvio padrão que éO(n^(3/2))
. O que significa que o número de maneiras de somar0
deve serO(2^n / n^(3/2))
.No pior caso, quando você tem N zeros e a soma necessária também é zero, você precisa gerar N conjuntos diferentes com 1, 2, 3, ... N zeros. Então O(n)