TempoO(d3logd)
lema: Corrija qualquer . Depois, há um conjunto contendo cantos de que estão mais próximos de e que está conectado (o que significa que o subgrafo do hipercubo induzido por está conectado). S d + 1 { 0 , 1 } d x S Sx∈[0,1]dSd+1{0,1}dxSS
Prova.
Primeiro considere o caso em que não tem coordenadas iguais a .1 / 2x1/2
Dado qualquer canto em , inverter uma coordenada de não aumentará a distância de até se . S a j a a x | a j - x j | ≥ 1 / 2aSajaax|aj−xj|≥1/2
Considere quaisquer dois cantos em que diferem em pelo menos uma coordenada e suponha ao WLOG que e . Se , virar em indica outro ponto em (porque diminui a distância de a ). Ou, se , em seguida, lançando em dá um ponto no . Repetindo este processo para cada uma diferindo de coordenadas em e dá um caminho que liga eS j um j = 0 b j = 1 x j < 1 / 2 b j b S b x x j > 1 / 2 um j um S um b um b Sa,bSjaj=0bj=1xj<1/2bjbSbxxj>1/2ajaSabab dentro .S
Se tiver coordenadas iguais a , então, ao escolher , quebre laços entre pontos equidistantes, dando precedência para aqueles com mais coordenadas zero. Então o mesmo argumento funcionará. QED1 / 2 Sx1/2S
Pelo lema, você pode usar um Dijkstra-como algoritmo para encontrar . Comece com um canto mais próximo de ( com se ). Então repetidamente adicionar ao um canto que está mais próximo entre aqueles que são adjacentes a algum ponto em . Pare quando pontos foram adicionados. x um um j = 0 x j ≤ 1 / 2 S x S d + 1Sxaaj=0xj≤1/2SxSd+1
Ingenuamente (usando um min-heap para encontrar o próximo ponto mais próximo de em cada iteração), acho que existem iterações , e cada iteração requer trabalho de para gerar os vizinhos do nó adicionado ( cada um dos quais tem representação do tamanho ), fornecendo o tempo de execução .d + 1 O ( d 2 ) d d O ( d 3 log d )xd+1O(d2)ddO(d3logd)
TempoO(d2logd)
Representam cada canto implicitamente como um par , onde é um hash do conjunto de índices tal que , e é a distância de para . A partir de um determinado canto , os pares para todos os cantos vizinhos podem ser gerados em tempo (total). Isso reduz o tempo de execução para .( h , d ) h i a i = 1 d x a a O ( d ) O ( d 2 log d )a(h,d)hiai=1dxaaO(d)O(d2logd)
Mais rápido?
Para facilitar a discussão, vamos reformular o problema da seguinte maneira. Dada uma sequência de números não negativos , encontre os subconjuntos de custo mínimo dos números, em que o custo de um subconjunto é a soma dos números nele. y 1 ≤ y 2 ≤ ⋯ ≤ y d d + 1dy1≤y2≤⋯≤ydd+1 (Para ver a conexão com o problema anterior, pegue ; então cada subconjunto dos corresponde a um canto do hipercubo, ondeY y i a ( y ) a i ( y ) y i ∉ Y Y x a ( y )yi=|xi−1/2|Yyia(y)ai(y) é 1 se ( e y i ∈ Y ) ou (xi≤1/2yi∈Y e); e o custo deé a distância dea.)xi>1/2yi∉YYxa(y)
Aqui está uma idéia geral para um algoritmo mais rápido. Talvez alguém possa descobrir como fazê-lo funcionar.
Defina um gráfico direcionado implícito em que cada nó é um subconjunto dos 's. O nó inicial é o conjunto vazio. Represente os nós implicitamente como pares que é o hash do subconjunto é o custo. Para cada subconjunto Y , defina os subconjuntos vizinhos de alguma forma, de modo que (i) se Y → Y ' for uma aresta direcionada, o custo ( Y ' ) ≥ custo ( Y ) e (ii) para qualquer subconjunto Y ' , haverá um aresta direcionada Y → Y ′y i ( h , c ) h cYyi(h,c)hcYY→Y′(Y′)≥(Y)Y′Y→Y′de algum subconjunto que custo ( Y ) ≤ custo ( Y ′ ) . Em seguida, execute Dijkstra's neste gráfico implícito, começando no nó inicial.Y(Y)≤(Y′)
Escolha as arestas (de alguma forma) para que (i) e (ii) se mantenham, e a soma dos graus dos nós mais baratos é O ( d ) . (Isso é sempre possível, por exemplo, considerar as arestas como as de uma árvore de caminho mais curto enraizada no início.) Mas pode-se definir um gráfico desse tipo sem o conhecimento a priori da árvore de caminho mais curto? Nesse caso, isso pode levar a um algoritmo de tempo (?).d+1O(d)O(dlogd)