Hace poco se me planteó esta cuestión al jugar con números binarios y traté de codificar una solución para ello:
Dejemos que $b$ sea una cadena de 1s y 0s. Dividir la cadena en partes separadas de tal manera que la cadena se divide sólo cuando un 0 está junto a un 1 (o viceversa, por supuesto). Por ejemplo, 11100110 se divide en 111, 00, 11 y 0. Calcula el número de dígitos de cada parte (en nuestro ejemplo serían 3, 2, 2 y 1, respectivamente), y toma la suma de cuadrados del número de dígitos de cada parte (en nuestro ejemplo sería $3^2+2^2+2^2+1^2=18$ ). Dejemos que los procedimientos que acabamos de describir se representen con una función $\omega$ Por ejemplo $\omega(11100110)=18$ . Además, $b$ es una cadena tal que el $k$ es 1 con probabilidad $x_k$ (y 0 en caso contrario). También dejemos que la longitud de $b$ sea $L$ . Estoy tratando de encontrar el valor esperado de $\omega(b)$ dado $L$ y el conjunto de $x_k$ para $1 \leq k \leq L$ pero no puedo encontrar un algoritmo más rápido que la fuerza bruta en este momento. ¿Cuáles son algunas optimizaciones que puedo hacer al encontrar programáticamente el valor esperado de $\omega(b)$ ? Además, me gustaría saber cuál sería la eficiencia del algoritmo (preferiblemente un límite inferior de eficiencia).
EDITAR : El algoritmo de fuerza bruta se refiere al $O(2^L \cdot L)$ uno.