Encuentra las esquinas


8

¿Cómo se pueden encontrar las esquinas d+1 del cubo unitario en Rd más cercano a un punto x en el cubo?
Utilice la métrica L1, de modo que en 4d | x - 0000 | = xi , | x - 0001 | = x3+x2+x1+(1x0)
( x0 a la derecha) y así sucesivamente.

Para una formulación alternativa, primero voltee xi > 1/2 y ordene, de modo que 0xd1 x1x0 1/2; por simetría, un algoritmo para este caso puede hacer cualquier x en el cubo.
Defina c12x , 1cd1 c1c00 .
Entonces queremos el d+1esquinas con más pequeño c esquina.

En 4d, por ejemplo, con xi disminuyendo 1/2 .. 0 como arriba, las 5 esquinas más cercanas pueden ser

    0 0 0 0
    0 0 0 1
    0 0 1 0

    0 1 0 0  or  0 0 1 1
                 0 1 * *

    1 0 0 0
 or 0 1 0 1

Sin embargo, en 5d, 6d ... los árboles de las esquinas crecientes parecen (para mí) cada vez más desordenados.
La heurística para el aproximado más cercano estaría bien.


¿Qué se rompe en el enfoque directo? Suponga que cada esquina del cubo está en y x [ 0 , 1 ] d . Redondee cada coordinador al entero más cercano para obtener el punto más cercano p , y genere d más "puntos más cercanos" agregando 1{0,1}dx[0,1]dpd a cada coordenada de p , independientemente. 1mod2p
Daniel Apon

@Daniel Apon, en 3d con 0 <= x2 <= x1 <= x0 <= 1/2 o 1> = c2> = c1> = c0> = 0 como arriba, las 4 esquinas más cercanas pueden ser 000 001 010 100 como sugieres, pero también puede ser una cara 000 001 010 011. (Todo el cubo 3d se divide en 8 + 6 piezas, 8 esquinas más adyacentes y 6 caras)
Denis

2
Aquí hay otra forma de plantear este problema: dada una colección de números no negativos, encuentre los subconjuntos de costo mínimo n + 1 (donde el costo de un conjunto es la suma de los números que contiene). nn+1
Neal Young

Sí, ese es el mínimo c. esquina superior: el subconjunto de costo mínimo es un nombre mejor, ¿agregarlo al título / etiquetas?
Denis

Respuestas:


8

Tiempo O(d3logd)

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]dSd+1{0,1}dxSS

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 . aSajaax|ajxj|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,bSjaj=0bj=1xj<1/2bjbSbxxj>1/2ajen 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 .aSababS

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 j1 / 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. Sxaaj=0xj1/2SxSd+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 ) .xd+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. y1y2ydd+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=|xi1/2|Yyia(y)ai(y) y y iY ) o ( x i > 1 / 2 y y iY ); y el costo de Y es la distancia desde x a una ( y ) ).xi1/2yiYxi>1/2yiYYxa(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)hcYYY(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.YYY(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)


Gracias neal ¿Se puede mejorar la expansión de la esquina como Dijkstra? Los conjuntos de posibles esquinas d + 1 más cercanas después de la normalización (voltear x a <= 1/2 y ordenar) parecen crecer muy lentamente con d.
Denis

Edité la respuesta para discutir el tiempo de ejecución más explícitamente.
Neal Young

Y la respuesta de David muestra cómo reducirlo a . O(dlogd)
Neal Young

8

Es equivalente a pedir, entre un conjunto de no ponderados negativamente, los subconjuntos d + 1 de peso total mínimo. Uno puede formar todos los subconjuntos de los elementos en un árbol, en el que el padre de un subconjunto se forma eliminando su elemento más pesado (con lazos rotos de manera arbitraria pero consistente); Las soluciones d + 1 formarán un subárbol de este árbol conectado en su raíz (el conjunto vacío).dd+1d+1

Por lo tanto, uno puede buscar en este árbol los elementos pequeños mediante una forma del algoritmo de Dijkstra en el que mantenemos una cola prioritaria de subconjuntos y los eliminamos en orden de prioridad. Comenzamos con el primer elemento seleccionado como el conjunto vacío. Luego, en cada paso, mantenemos como una invariante del algoritmo una cola de prioridad que contiene el siguiente elemento secundario no seleccionado para cada subconjunto ya seleccionado. Cuando seleccionamos un conjunto S , lo eliminamos de la cola de prioridad y agregamos a la cola de prioridad dos nuevos subconjuntos: su primer hijo (el conjunto formado al agregar el siguiente elemento más pesado que el elemento más pesado en S ) y su próximo hermano (el conjunto se formó eliminando el elemento más pesado en S y agregando el mismo siguiente elemento más pesado).d+1SSS

Después de ordenar los elementos por sus pesos, es sencillo representar cada conjunto implícitamente (como su elemento más pesado más un puntero a su conjunto primario), mantener el peso total de cada conjunto y encontrar el primer hijo y el próximo hermano que necesita el algoritmo en tiempo constante por juego. Por lo tanto, el tiempo total está dominado por la clasificación inicial y por las operaciones de cola prioritarias, que toman el tiempo total .O(dlogd)

Incluso esto puede mejorarse si los artículos ya están ordenados por su peso. Vea la relación "primer hijo" y "próximo hermano" del algoritmo anterior como los hijos izquierdo y derecho en un árbol binario de subconjuntos. Este árbol está ordenado en montón (el peso total aumenta de padre a hijo) para que podamos aplicar un algoritmo para encontrar los nodos de peso mínimo en un árbol binario ordenado en montón [GN Frederickson. Un algoritmo óptimo para la selección en un montón mínimo. Information and Computation, 104: 197–214, 1993]. El tiempo total, después del paso de clasificación, es O ( d ) .d+1O(d)


Estoy de acuerdo con la solución de David: el árbol binario que describe es suficiente para llegar a todos los conjuntos, dando . O(dlogd)
Neal Young

0

En la práctica, los pesos a menudo se distribuyen de manera uniforme, aproximadamente ~ 1 2 3 Entonces, una heurística simple es comenzar con:

los bits individuales, p. ej. 10000000 01000000 00000001d
combinaciones de bits bajos 00000011 00000101 00000110 00000111ln2d
combinaciones de pocos bits del siguiente ln2d , p. ej. 00001001 00001010 00001100.
El mejor de estos candidatos funciona bastante bien en la práctica, al menos para los pequeños d .d+1d

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.