¿Qué es un algoritmo O (log n) para encontrar un máximo local de una matriz?

Definamos exactamente qué está buscando:

  1. La peor complejidad de tiempo de O (log n), donde n es el número de elementos en la matriz.
  2. No hay dos elementos iguales en la matriz (esto nos salva de considerar muchos casos especiales)
  3. Para encontrar el máximo local que se define como: el número en la matriz es el máximo local si todos sus vecinos (uno o dos) son más pequeños.

Tenga en cuenta que los supuestos 2 y 3 implican que hay al menos un máximo local.

Puede resolver este problema dividiendo y conquistando el enfoque. Elija elemento en el medio. Consideremos todos los casos:

  1. Es local máximo. Terminamos el algoritmo.
  2. El elemento del lado izquierdo es más grande.
  3. El elemento del lado derecho es más grande.

Tenga en cuenta que los casos número 2 y 3 no son mutuamente excluyentes. Considérelo como una declaración de cambio -> elija primero lo que se aplique a su situación.

Sin pérdida de generalidad, digamos que terminamos en el caso número 3 (el número 2 se puede resolver de la misma manera, pero los lados son opuestos). ¿Qué significa que en nuestro lado derecho hay un elemento más grande? Que tal vez ese elemento es el máximo local. O no, pero el siguiente es el máximo local. No lo sabemos Pero lo que sabemos con certeza es que en el lado derecho de este elemento podemos encontrar el máximo local. Eso es todo lo que necesitamos. Continuaremos con el mismo algoritmo, pero esta vez elegimos el elemento en medio del intervalo en nuestro lado derecho.

Ahora podemos preguntar, ¿cuál es la complejidad de este algoritmo? Si imagina una función recursiva que resolvería este problema, tendría 2 parámetros: el lado izquierdo del intervalo considerado y el lado derecho. En cada iteración encontramos la respuesta o reducimos a la mitad este intervalo. Entonces, el peor de los casos es que dividiremos a la mitad el intervalo tantas veces como sea posible. Pero, ¿cuántas veces puedes reducir a la mitad el intervalo que inicialmente es largo n unidades? Solo log (n) veces.

Este algoritmo resuelve su problema en el peor de los casos O (log n). Espero que esta respuesta te haya ayudado.

(Editar: el máximo local originalmente se llamaba modo en esta pregunta)

La especificación del problema es muy confusa.

  • En una matriz sin clasificar, no puede encontrar el modo tan rápido.
  • Pero esta pregunta parece ser sobre una matriz en la que los valores aumentan primero y luego disminuyen, y se nos pide que encontremos el elemento máximo. Entonces este no es el modo, sino el máximo en una matriz sin máximos locales. (Esto se puede hacer en tiempo O (log n) con un algoritmo de divide y vencerás).
  • Normalmente, el modo sería el elemento que ocurre con mayor frecuencia. Esto se puede hacer rápidamente si la matriz está ordenada; para ese caso, vea el enlace que proporcionó Daniel Page.

No estoy seguro de la complejidad, pero una búsqueda simple para encontrar el primer máximo local debería completarse en menos de O (n) tiempo.

Digamos que consideremos la matriz 2 3 6 9 1 7 6 9 1 6 0 7 2 7

buscando desde la izquierda, x1, x2 y x3 no son máximos locales, pero en la cuarta prueba x4 = 9> x3 y x4> x5. Entonces podemos detener la iteración.

La complejidad dependerá de la naturaleza de los elementos de la matriz. Considere una matriz de números reales aleatorios, existe la posibilidad de que cualquier elemento sea mayor que uno de sus vecinos. Por lo tanto, hay una cuarta posibilidad de que cualquier número sea un máximo local. Esto da una distribución geométrica con p = 0.25. El número esperado de prueba antes de encontrar un máximo local es 1 / p = 4.

Tenga en cuenta que esta expectativa no depende del número de elementos en la matriz. Entonces la complejidad es O (1).

More Interesting

¿Qué clases de problemas no se pueden resolver con métodos de optimización?

¿Dónde debo comenzar si quiero aprender programación de computadoras?

¿La operación Bitwise es importante en Python? Estoy aprendiendo esta parte en Codecademy y no entendí totalmente. ¿Qué es Base 2 y Base 10?

Cómo resolver rápidamente cualquier problema

¿Dónde se usan los números primos? ¿Por qué nos enseñan a escribir un programa para encontrar números primos?

¿Cuáles son algunas historias menos conocidas sobre Alan Turing?

¿Cuáles son algunos problemas realmente fáciles de explicar que en realidad son increíblemente difíciles de resolver?

¿Es esto cierto? "Repetir es humano, repetir, divino". En caso afirmativo o no, ¿por qué?

¿Es posible tomar la construcción del producto para DFA con diferentes idiomas?

¿Se pueden replicar completamente todas las funciones matemáticas utilizando una secuencia de operadores '+', '-', 'x', '/' (como puede y para la potencia x)?

Cómo mejorar mi forma analítica de pensar para trabajar matemáticamente para la programación de computadoras

¿Cómo se pueden representar los números negativos en 0 y 1 binarios para que la computadora pueda leer con precisión?

¿Cuál es la diferencia entre la variable de control y la variable de confusión?

Criptografía: ¿Cómo describirías la diferencia entre la longitud de la contraseña y la longitud de la clave de una criptografía como AES?

¿Alguna vez eres totalmente experto en matemáticas?