Tiempo O ( d3Iniciar sesiónre)
lema: Corregir cualquier . Luego hay un conjunto S que contiene d + 1 esquinas de { 0 , 1 } d que están más cerca de x y de tal manera que S está conectado (lo que significa que el subgráfico del hipercubo inducido por S está conectado).x ∈ [ 0 , 1 ]reSre+ 1{ 0 , 1 }reXSS
Prueba.
Consideremos en primer lugar el caso de que no tiene coordenadas iguales a 1 / 2 .X1 / 2
Dada cualquier esquina en S , voltear una coordenada a j de a no aumentará la distancia de a a x si | a j - x j | ≥ 1 / 2 . unaSunajunaunaXEl | unaj- xjEl | ≥1 / 2
Considere dos esquinas en S que difieren en al menos una coordenada j , y suponga WLOG que a j = 0 y b j = 1 . Si x j < 1 / 2 tras dar la vuelta b j en b da otro punto en S (debido a que disminuye la distancia desde b a x ). O, si x j > 1 / 2 tras dar la vuelta un ja , bSjunaj= 0sij= 1Xj< 1 / 2sijsiSsiXXj> 1 / 2unajen da un punto en S . La repetición de este proceso para cada uno diferente de coordenadas en una y b da una vía de conexión a y b dentro de S .unaSunasiunasiS
Si tiene coordenadas iguales a 1 / 2 , a continuación, en la elección de S , lazos de ruptura entre los puntos equidistantes, dando prioridad a los que tienen más coordenadas cero. Entonces el mismo argumento funcionará. QEDX1 / 2S
Por el lema, se puede utilizar un algoritmo de Dijkstra-como para encontrar . Comience con una esquina más cercana a x ( una con un j = 0 si x j ≤ 1 / 2 ). A continuación, añadir varias veces para S una esquina que está más cerca de x entre los que se encuentran adyacentes a un cierto punto en S . Deténgase cuando se hayan agregado d + 1 puntos. SXunaunaj= 0Xj≤ 1 / 2SXSre+ 1
Ingenuamente (usando un montón mínimo para encontrar el siguiente punto más cercano a en cada iteración), supongo que hay iteraciones d + 1 , y cada iteración requiere trabajo O ( d 2 ) para generar los vecinos d del nodo agregado (cada de los cuales tiene representación de tamaño d ), dando tiempo de ejecución O ( d 3 log d ) .Xre+ 1O(d2)ddO(d3logd)
Tiempo O(d2logd)
Representar cada esquina implícitamente como un par ( h , d )a(h,d) , donde es un hash del conjunto de índices i de tal manera que un i = 1 , y d es la distancia desde x a una . Desde una esquina dada a , los pares para todas las esquinas vecinas se pueden generar en el tiempo O ( d ) (total). Esto reduce el tiempo de ejecución a O ( d 2 log d ) .hiai=1dxaaO(d)O(d2logd)
¿Más rápido?
Para facilitar la discusión, reformulemos el problema de la siguiente manera. Dada una secuencia de números no negativos yd , encuentre lossubconjuntos de costo mínimo d + 1 de los números, donde el costo de un subconjunto es la suma de los números que contiene. y1≤y2≤⋯≤ydd+1 (Para ver la conexión con el problema anterior, tomar y i = | x i -1 / 2 | ; entonces cada subconjuntoYde la y i 's corresponde a una esquinade una ( y ) del hipercubo, donde a i ( y ) es 1 if ( x iyi=|xi−1/2|Yyia(y)ai(y) y y i ∈ Y ) o ( x i > 1 / 2 y y i ∉ Y ); y el costo de Y es la distancia desde x a una ( y ) ).xi≤1/2yi∈Yxi>1/2yi∉YYxa(y)
Aquí hay una idea general para un algoritmo más rápido. Quizás alguien pueda descubrir cómo hacer que funcione.
Defina un gráfico dirigido implícito donde cada nodo sea un subconjunto de los y i 's. El nodo de inicio es el conjunto vacío. Representar los nodos implícitamente como paresYyi donde h es el hash del subconjunto y c es el costo. Para cada subconjunto Y , defina los subconjuntos vecinos de alguna manera para que (i) si Y → Y ' sea un borde dirigido, entonces el costo ( Y ' ) ≥ costo ( Y ) , y (ii) para cualquier subconjunto Y ' , hay un borde dirigido(h,c)hcYY→Y′(Y′)≥(Y)Y′ de algún subconjunto Y donde costo ( Y ) ≤ costo ( Y ' ) . Luego ejecute Dijkstra's en este gráfico implícito comenzando en el nodo de inicio.Y→Y′Y(Y)≤(Y′)
Elija los bordes (de alguna manera) para que (i) y (ii) se mantengan, y la suma de los grados de los nodos más baratos es O ( d ) . (Esto siempre es posible, por ejemplo, tomar las aristas como las de un árbol de ruta más corta enraizada al inicio). Pero, ¿se puede definir un gráfico sin el conocimiento a priori del árbol de ruta más corta? Si es así, esto podría conducir a un algoritmo de tiempo O ( d log d ) (?).d+1O(d)O(dlogd)