Editorial for Ifri y la producción musical.


Remember to use this editorial only when stuck, and not to copy-paste code from it. Please be respectful to the problem author and editorialist.
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 m 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 n=16, m=4. 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 O(n) usando O(n) 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 O(m). Tabla 4.1

Otra solución óptima puede derivarse de la observación de que después de encontrar un valor x cualquier valor y \leq x ya no afectará al cálculo del máximo. Por lo tanto, podemos sustituir el Sliding Window ingenuo por una lista de índices j_1 < j_2 < \dots < j_k tales que j_1 > i - m y a_{j1} > a_{j2} > \dots > a_k. Cuando llega un nuevo valor a_i, la lista puede actualizarse del siguiente modo:

  1. Si j_i = i - m elimina j_1 del principio de la lista.
  2. Mientras k > 0 y a_{jk} \leq a_i elimina j_k del final de la lista.
  3. Añade i al final de la lista.

Debería ser obvio que los pasos anteriores garantizan que en cualquier momento el valor a_{j1} es el máximo entre las últimas m muestras. Aunque el algoritmo puede gastar O(m) operaciones para procesar la llegada de una muestra a_i, el coste total de procesar todas las n muestras no puede superar O(n) ya que cada índice entra y sale de la lista una sola vez. Mantener el valor mínimo entre las últimas m muestras puede hacerse de forma similar, o simplemente manteniendo otra lista que se actualiza en función del valor -a_i de cada muestra a_i. Una solución de este tipo que utilice O(n) de tiempo y O(m) 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 m 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 O(c) 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

There are no comments at the moment.