Para um número inteiro positivo n
, considere todas as cadeias binárias de comprimento 2n-1
. Para uma determinada string S
, L
seja uma matriz de comprimento n
que contenha a contagem do número de 1
s em cada substring de comprimento n
de S
. Por exemplo, se n=3
e S = 01010
então L=[1,2,1]
. Chamamos L
a matriz de contagem de S
.
Dizemos que duas seqüências de caracteres S1
e S2
o mesmo comprimento correspondem às suas respectivas matrizes de contagem L1
e L2
têm a propriedade que L1[i] <= 2*L2[i]
e L2[i] <= 2*L1[i]
para todos i
.
Tarefa
Para aumentar o n
início de n=1
, a tarefa é encontrar o tamanho do maior conjunto de strings, cada um de comprimento, 2n-1
para que não haja duas strings correspondentes.
Seu código deve gerar um número por valor de n
.
Ponto
Sua pontuação é a mais alta n
para a qual ninguém postou uma resposta correta mais alta para nenhuma das suas respostas. Claramente, se você tiver todas as respostas ideais, obterá a pontuação mais alta que n
você postar. No entanto, mesmo que sua resposta não seja ótima, você ainda pode obter a pontuação se ninguém mais conseguir vencê-la.
Respostas de exemplo
Pois n=1,2,3,4
eu entendo 2,4,10,16
.
Línguas e bibliotecas
Você pode usar qualquer idioma e bibliotecas disponíveis que desejar. Onde for possível, seria bom poder executar seu código, portanto, inclua uma explicação completa de como executar / compilar seu código no linux, se possível.
Entradas principais
- 5 por Martin Büttner em Mathematica
- 6 por Reto Koradi em C ++ . Valores são
2, 4, 10, 16, 31, 47, 75, 111, 164, 232, 328, 445, 606, 814, 1086
. Os 5 primeiros são conhecidos por serem ótimos. - 7 por Peter Taylor em Java . Valores são
2, 4, 10, 16, 31, 47, 76, 111, 166, 235
. - 9 por joriki em Java . Valores são
2, 4, 10, 16, 31, 47, 76, 112, 168
.
L1[i]/2 <= L2[i] <= 2*L1[i]
.match(A, B)
ematch(B, C)
não implicamatch(A, C)
(o mesmo para o inverso). Exemplo: [1] e [2] correspondem, [2] e [3] correspondem, mas [1] e [3] não. Da mesma forma, [1,3] e [3,1] não coincidem, [3, 1] e [2, 3] não coincidem, mas [1, 3] e [2, 3] coincidem.Respostas:
2, 4, 10, 16, 31, 47, 76, 112, 168
Para cada n, esse código Java determina as possíveis matrizes de contagem e, em seguida, encontra conjuntos não correspondentes de tamanho crescente, para cada tamanho começando com um conjunto aleatório e melhorando-o pela descida mais íngreme aleatória. Em cada etapa, um dos elementos do conjunto é selecionado aleatoriamente uniformemente e substituído por outra matriz de contagem selecionada aleatoriamente uniformemente entre os que não estão em uso. A etapa é aceita se não aumentar o número de correspondências. Essa última receita parece ser crucial; aceitar etapas apenas se reduzirem o número de correspondências não é tão eficaz. As etapas que deixam o número de correspondências invariáveis permitem que o espaço de pesquisa seja explorado e, eventualmente, algum espaço pode ser aberto para evitar uma das correspondências. Após 2 ^ 24 etapas sem melhoria, o tamanho anterior é gerado para o valor presente de n e n é incrementado.
Os resultados até n = 9 são
2, 4, 10, 16, 31, 47, 76, 112, 168
, melhorando os resultados anteriores para n = 8 por um e para n = 9 por dois. Para valores mais altos de n, o limite de 2 ^ 24 etapas pode ter que ser aumentado.Eu também tentei recozimento simulado (com o número de correspondências como a energia), mas sem melhorar a descida mais acentuada.
Código
salvar como
Question54354.java
compilar com
javac Question54354.java
executar com
java Question54354
fonte
2, 4, 10, 16, 31, 47, 76, 111, 166, 235
Notas
Se considerarmos um gráfico
G
com os vértices0
an
e arestas que unem dois números que fósforo, então a potência tensorG^n
tem vértices(x_0, ..., x_{n-1})
, formando o poder cartesiano{0, ..., n}^n
e arestas entre tuplos correspondentes. O gráfico de interesse é o subgrafoG^n
induzido pelos vértices que correspondem às possíveis "matrizes de contagem".Portanto, a primeira subtarefa é gerar esses vértices. A abordagem ingênua enumera sobre
2^{2n-1}
strings, ou na ordem de4^n
. Mas se olharmos para a matriz das primeiras diferenças das matrizes de contagem, descobrimos que existem apenas3^n
possibilidades e, a partir das primeiras diferenças, podemos deduzir o intervalo de possíveis valores iniciais exigindo que nenhum elemento nas diferenças zero seja menor0
ou igual a maior quen
.Em seguida, queremos encontrar o conjunto independente máximo. Estou usando um teorema e duas heurísticas:
(n, n, ..., n)
estará em um conjunto independente máximo. Há uma camarilha bastante grande de vértices,{m, m+1, ..., n}^n
ondem
é o menor número inteiro que corresponden
;(n, n, ..., n)
é garantido que não há correspondências fora dessa camarilha.No meu computador isto encontra
111
paran=8
em 16 segundos,166
paran=9
em cerca de 8 minutos, e235
paran=10
em cerca de 2 horas.Código
Salve como
PPCG54354.java
, compile comojavac PPCG54354.java
e execute comojava PPCG54354
.fonte
Mathematica
n = 5
,, 31 stringsAcabei de escrever uma solução de força bruta usando os recursos do Mathematica para verificar as respostas de exemplo do Lembik, mas ele também pode lidar
n = 5
com:Como um bônus, esse código produz uma visualização do problema como um gráfico em que cada aresta indica duas seqüências correspondentes.
Aqui está o gráfico para
n = 3
:fonte
C ++ (heurística): 2, 4, 10, 16, 31, 47, 75, 111, 164, 232, 328, 445, 606, 814, 1086
Isso está um pouco atrás do resultado de Peter Taylor, sendo 1 a 3 menor para
n=7
,9
e10
. A vantagem é que é muito mais rápido, para que eu possa executá-lo com valores mais altos den
. E isso pode ser entendido sem nenhuma matemática sofisticada. ;)O código atual é dimensionado para executar até
n=15
. Os tempos de execução aumentam aproximadamente um fator de 4 para cada aumento emn
. Por exemplo, foram 0,008 segundos paran=7
, 0,07 segundos paran=9
, 1,34 segundos paran=11
, 27 segundos paran=13
e 9 minutos paran=15
.Existem duas observações principais que usei:
c
excluindo o intervalo dec / 2
até2 * c
de outros valores. Para valores menores dec
, esse intervalo é menor, o que significa que menos valores são excluídos usando-o.Gere matrizes de contagem exclusivas
Fiz força bruta neste, iterando todos os valores, gerando a matriz de contagem para cada um deles e unificando a lista resultante. Isso certamente poderia ser feito com mais eficiência, mas é bom o suficiente para os tipos de valores com os quais estamos operando.
Isso é extremamente rápido para os pequenos valores. Para os valores maiores, a sobrecarga se torna substancial. Por exemplo,
n=15
ele usa cerca de 75% de todo o tempo de execução. Definitivamente, seria uma área para se olhar ao tentar ir muito mais alto do quen=15
. Mesmo o uso da memória para criar uma lista de matrizes de contagem para todos os valores começaria a se tornar problemático.O número de matrizes de contagem exclusivas é de cerca de 6% do número de valores para
n=15
. Essa contagem relativa se torna menor à medida quen
se torna maior.Seleção gananciosa dos valores da matriz de contagem
A parte principal do algoritmo seleciona os valores da matriz de contagem da lista gerada usando uma abordagem simples e gananciosa.
Com base na teoria de que o uso de matrizes de contagem com pequenas contagens é benéfico, as matrizes de contagem são classificadas pela soma de suas contagens.
Eles são então verificados em ordem e um valor é selecionado se for compatível com todos os valores usados anteriormente. Portanto, isso envolve uma única passagem linear pelas matrizes de contagem exclusivas, em que cada candidato é comparado aos valores que foram selecionados anteriormente.
Tenho algumas idéias sobre como a heurística poderia ser potencialmente aprimorada. Mas isso parecia um ponto de partida razoável, e os resultados pareciam muito bons.
Código
Isso não é altamente otimizado. Eu tinha uma estrutura de dados mais elaborada em algum momento, mas seria necessário mais trabalho para generalizá-la além
n=8
, e a diferença no desempenho não parecia muito substancial.fonte
n=4
já. Pode ter terminadon=5
com alguma paciência. Você deve ter usado uma melhor estratégia de retorno, mesmo para fazê-lon=7
. A sua era heurística ou explorou todo o espaço da solução? Estou contemplando algumas idéias sobre como melhorar isso, ajustando a ordem de classificação ou talvez não sendo puramente ganancioso.3^n
e as duas heurísticas que ele descreve.n=7
rapidamente. Mas, tentandon=9
, ele ainda estava preso aos 164 quando eu o parei após 20 minutos. Portanto, estender isso com uma forma limitada de retorno simples não parece promissor.