Ninguna de estas respuestas realmente abordaba cómo identificar una pequeña cantidad de elementos fuera de orden que acababan de dar una matriz. Suponiendo que hay elementos K fuera de orden en nuestra matriz de longitud N y K es mucho más pequeño que N, entonces hay un par de formas de hacerlo.
La forma más obvia es usar el algoritmo de subsecuencia creciente más largo estándar que se ejecutará en O (N log N). Los elementos que no están en esta secuencia serán los elementos fuera de servicio y siempre terminaremos con no más de K (¡y tal vez menos!).
Sin embargo, en realidad hay otro enfoque. En cambio, podemos construir una subsecuencia creciente de elementos N-2K en el tiempo O (N). Haga esto escaneando los elementos para mantener una subsecuencia creciente de elementos. Si un elemento no es más pequeño que el final de su subsecuencia, agréguelo a la subsecuencia. De lo contrario, elimine el final de la subsecuencia (y no la agregue). Dado que cada operación de eliminación debe involucrar al menos uno de los elementos fuera de servicio, debemos terminar con al menos elementos N-2K en nuestra subsecuencia al final.
- ¿Qué matemáticas están involucradas en la base de datos?
- ¿Por qué nos trasladamos además?
- ¿Qué algoritmos se pueden usar para resolver este problema de optimización?
- ¿Debería doblarme en CS y Estadística o CS y Matemáticas si quiero obtener un trabajo en Machine Learning? Si tuviera que elegir uno, ¿Estadística o Matemáticas?
- ¿Existe un algoritmo eficiente para encontrar el primo más pequeño mayor que N?
Una vez que hemos identificado los elementos 2K fuera de orden, podemos hacer lo que Anders Kaseorg dice y ordenar los elementos fuera de orden por sí mismos y luego fusionarlos. Esto le da al algoritmo general una complejidad de O (N + K log K).
En la descripción de su problema, si solo está cambiando un número realmente pequeño de elementos, podría beneficiarse utilizando una estructura de datos de árbol que le permitirá actualizar la posición de un único elemento en el tiempo O (log (N)) para que toda su operación de actualización puede ejecutarse en tiempo O (K log N), eliminando el término lineal en N por completo.