Aquí hay una muestra recursiva bastante obvia que es en el mejor de los casos (en términos de pesos ), pero exponencial en el peor de los casos.O(d)ωi
Supongamos que ya hemos seleccionado y deseamos elegir . Necesitamos calcular
y elige con probabilidad
El denominador será distinto de cero para cualquier elección válida de muestras .x1,…,xi−1xi
w(x1,…,xi−1,xi)=∑xi+1∈{−1,1}⋯∑xd∈{−1,1}(∑j=1dωjxj)+
xi=1w(x1,…,xi−1,1)w(x1,…,xi−1,1)+w(x1,…,xi−1,−1).
x1,…,xi−1
Ahora, por supuesto, la pregunta es cómo calcular .w(x1,…,xi)
Si tenemos que , entonces para cualquier con entradas , y entonces convierte en:
C:=∑ij=1ωjxj≥∑dj=i+1|ωj|ω⋅x≥0xx1:iw
∑xi+1⋯∑xdω⋅x=ω⋅(∑xi+1⋯∑xdx)=∑j=1iωj(∑xi+1⋯∑xdxj)2d−ixj+∑j=i+1dωj(∑xi+1⋯∑xdxj)0=2d−iC.
En el caso opuesto, , tenemos que y entonces .C≤−∑dj=i+1|ωj|ω⋅x≤0w(x1,…,xi)=0
De lo contrario, debemos recurrir, usando .w(x1,…,xi)=w(x1,…,xi,1)+w(x1,…,xi,−1)
Suponga que la memoria no es un problema y que podemos almacenar en caché todos los sub-cálculos en , en un árbol, hasta el punto en que llegamos a uno de los casos "agradables", después de lo cual cualquier Las llamadas toman tiempo constante. (Tendremos que calcular todo este árbol de todos modos para seleccionar .) Luego, una vez que se construya este árbol de cálculos , la muestra tomará solo tiempo. La pregunta es cuánto tiempo se tarda en construir el árbol, o de manera equivalente qué tan grande es.w(1)w(−1)x1wO(d)
Por supuesto, veremos los casos "agradables" más rápido si los están ordenados, .ωiω1≥ω2≥⋯≥ωd
En el mejor de los casos, . Entonces llegamos a un caso "agradable" inmediatamente, ya sea para o , por lo que construcción del árbol toma constante de tiempo, y todo el muestreador toma tiempo.|ω1|>∑dj=2|ωj|w(1)w(−1)wO(d)
En el peor de los casos (ordenados), . Entonces la pregunta es: ¿qué tan grande es el árbol total?ω1=ω2=⋯=ωd
Bueno, los primeros caminos para terminar son, por supuesto y de longitud . Por lo tanto, el árbol está completo hasta esa profundidad, y por lo tanto contiene al menos nodos. (Tiene más; probablemente puedas encontrarlo con un argumento como los que se usan en los problemas de ruina del jugador, pero no pude encontrarlo en dos minutos de Google y no me importa particularmente: es malo suficiente....)(1,1,…,1)(−1,−1,…,−1)⌈d/2⌉O(2d/2)2d/2
Si su configuración tiene solo unos pocos muy grandes , este es probablemente un enfoque razonablemente práctico. Si los son todos de magnitud similar, probablemente todavía sea exponencial y demasiado caro para grande .ωiωid