Suponha que eu tenha um alfabeto de n símbolos. Eu posso codificá-los eficientemente com-bits strings. Por exemplo, se n = 8:
A: 0 0 0
B: 0 0 1
C: 0 1 0
D: 0 1 1
E: 1 0 0
F: 1 0 1
G: 1 1 0
H: 1 1 1
Agora eu tenho a restrição adicional de que cada coluna deve conter no máximo p bits definidos como 1. Por exemplo, para p = 2 (en = 8), uma solução possível é:
A: 0 0 0 0 0
B: 0 0 0 0 1
C: 0 0 1 0 0
D: 0 0 1 1 0
E: 0 1 0 0 0
F: 0 1 0 1 0
G: 1 0 0 0 0
H: 1 0 0 0 1
Dados nep, existe um algoritmo para encontrar uma codificação ideal (menor comprimento)? (e pode-se provar que calcula uma solução ideal?)
EDITAR
Até agora, foram propostas duas abordagens para estimar um limite mais baixo do número de bits . O objetivo desta seção é fornecer uma análise e uma comparação das duas respostas, a fim de explicar a escolha da melhor resposta .
A abordagem de Yuval é baseada em entropia e fornece um limite inferior muito bom: Onde .
A abordagem de Alex é baseada em combinatória. Se desenvolvermos um pouco mais o raciocínio dele, também é possível calcular um limite inferior muito bom:
Dado o número de bits , existe um único de tal modo que
Agora, dado e , tente estimar . Nós sabemos isso então se , então . Isso fornece o limite inferior para. Primeiro calcule o então encontre o maior de tal modo que
É isso que obtemos se traçarmos, por , os dois limites inferiores juntos, o limite inferior com base na entropia em verde, o baseado no raciocínio combinatório acima em azul, obtemos:
Ambos parecem muito semelhantes. No entanto, se traçarmos a diferença entre os dois limites inferiores, ficará claro que o limite inferior baseado no raciocínio combinatório é melhor no geral, especialmente para valores pequenos de.
Eu acredito que o problema vem do fato de que a desigualdade é mais fraco quando fica menor, porque as coordenadas individuais se correlacionam com pequenas . No entanto, este ainda é um limite inferior muito bom quando.
Aqui está o script (python3) que foi usado para calcular os limites inferiores:
from scipy.misc import comb
from math import log, ceil, floor
from matplotlib.pyplot import plot, show, legend, xlabel, ylabel
# compute p_m
def lowerp(n, m):
acc = 1
k = 0
while acc + comb(m, k+1) < n:
acc+=comb(m, k+1)
k+=1
pm = 0
for i in range(k):
pm += comb(m-1, i)
return pm + ceil((n-acc)*(k+1)/m)
if __name__ == '__main__':
n = 100
# compute lower bound based on combinatorics
pm = [lowerp(n, m) for m in range(ceil(log(n)/log(2)), n)]
mp = []
p = 1
i = len(pm) - 1
while i>= 0:
while i>=0 and pm[i] <= p: i-=1
mp.append(i+ceil(log(n)/log(2)))
p+=1
plot(range(1, p), mp)
# compute lower bound based on entropy
lb = [ceil(log(n)/(p/n*log(n/p)+(n-p)/n*log(n/(n-p)))) for p in range(1,p)]
plot(range(1, p), lb)
xlabel('p')
ylabel('m')
show()
# plot diff
plot(range(1, p), [a-b for a, b in zip(mp, lb)])
xlabel('p')
ylabel('m')
show()
fonte
Respostas:
Existe um limite inferior adicional que podemos construir, que abordará casos como o que o usuário3030830 mencionou em seu comentário à resposta de Yuval. (Casos em quep é particularmente pequeno.) Suponha que soubéssemos m já: Então nós temos pm total de bits alto em todas as palavras de código. Como estamos interessados nos casos em quep é pequeno, vemos esses bits altos como nosso recurso limitador e queremos criar um código com ele (e ver quantas palavras de código podemos extrair). Podemos ter 1 palavra de código com todos os 0s, entãom palavras de código com um único 1; (m2) com dois 1s, etc. Se chamarmos o maior número de bits em uma palavra de código k , então
fonte
Aqui está um limite inferior e uma construção assintoticamente correspondente, pelo menos para alguns intervalos dos parâmetros. Denotar porm o número de colunas e suponha, por simplicidade, que p≤n/2 .
Começamos com um limite inferior emm . DeixeiX seja a codificação do símbolo escolhido uniformemente aleatoriamente. DeixeiX1,…,Xm ser as coordenadas individuais e deixar wi≤p ser o peso do i coluna. Então
A construção assintoticamente correspondente, que deve funcionar parap=Ω(n) , escolhe m um pouco maior que esse limite inferior e escolhe um esquema de codificação aleatória, cada bit sendo definido como 1 com alguma probabilidade q/n que é um pouco menor que p/n . Escolhendo os parâmetros corretamente, devemos obter que isso resulte em uma codificação legal (todas as palavras de código são diferentes e todos os pesos de coluna são no máximop ) com probabilidade positiva.
fonte
Aqui está uma metodologia de pesquisa simples. Começamos a partir de um limite inferior do número de bits e tentamos encontrar uma codificação legal. Especificamente.
Seja m o número atual de bits. Codifique o símbolo i como bi1, bi2, ..., bim.
Restrições: bi xor bj não é 0 - em outras palavras, a codificação de cada símbolo é única
Para todos j: sum_i bij <= p.
Este é um problema de satisfação pseudo-booleano (bem, pode ser facilmente codificado como um problema de satifiabilidade padrão). Portanto, continue aumentando m até encontrar uma que seja satisfatória (ou faça uma pesquisa binária usando os limites inferior e superior para encontrar o mínimo m).
Obviamente, isso não garante que, na prática, você seja capaz de encontrar o m mínimo, a verificação do SAT poderá atingir o tempo limite.
fonte