Editorial for Ifri y la producción musical.
Submitting an official solution before solving the problem yourself is a bannable offence.
Se puede desarrollar una solución óptima considerando los prefijos y sufijos de bloques de elementos de la secuencia de entrada. Para cada bloque, podemos barrer el bloque de izquierda a derecha y luego de derecha a izquierda para calcular los valores mínimos de cada prefijo y sufijo del bloque, como se muestra en la tabla 4.1 para el caso
,
. Una ventana arbitraria consiste en un sufijo de un bloque y un prefijo del siguiente (mostrados en negrita en la primera fila de la tabla). El valor mínimo de la ventana puede calcularse en tiempo constante tomando el mínimo del Min-Suffix y el Min-Prefix correspondientes al sufijo y prefijo que componen la ventana (mostrados en negrita en la segunda y tercera fila). El valor máximo puede calcularse de forma similar, con lo que se obtiene una solución que se ejecuta en
usando
espacio. Se espera que una solución así obtenga todos los puntos. En realidad, bastaría con mantener sólo dos bloques adyacentes en la memoria en cualquier momento, y reducir así la memoria a
.
Otra solución óptima puede derivarse de la observación de que después de encontrar un valor cualquier valor
ya no afectará al cálculo del máximo. Por lo tanto, podemos sustituir el Sliding Window ingenuo por una lista de índices
tales que
y
. Cuando llega un nuevo valor
, la lista puede actualizarse del siguiente modo:
- Si
elimina
del principio de la lista.
- Mientras
y
elimina
del final de la lista.
- Añade
al final de la lista.
Debería ser obvio que los pasos anteriores garantizan que en cualquier momento el valor es el máximo entre las últimas
muestras. Aunque el algoritmo puede gastar
operaciones para procesar la llegada de una muestra
, el coste total de procesar todas las
muestras no puede superar
ya que cada índice entra y sale de la lista una sola vez. Mantener el valor mínimo entre las últimas
muestras puede hacerse de forma similar, o simplemente manteniendo otra lista que se actualiza en función del valor
de cada muestra
. Una solución de este tipo que utilice
de tiempo y
de memoria se espera que obtenga todos los puntos.
La última solución tiene la ventaja adicional de que es fácilmente modificable para el caso en que el silencio se defina como al menos
muestras en las que el nivel de ruido no supera el umbral. Además, con un poco más de cuidado en la programación, podríamos salirnos con la nuestra utilizando sólo
de memoria. Esto podría ser útil cuando se analizan grabaciones largas que contienen secciones potencialmente largas de silencio en un dispositivo con memoria limitada.
Existen otros tipos de soluciones, pero quedarán como ejercicio para el lector.
Comments