Supongamos que leemos una secuencia de números, uno por uno. Cómo encontrar el elemento más pequeño de 'con solo usar la memoria de celda y en tiempo lineal ( ). Creo que deberíamos guardar los primeros términos de secuencia y, cuando obtengamos el término ', eliminemos un término que estamos seguros de que no puede ser el ' elemento más pequeño y luego guardemos 'término. Por lo tanto, deberíamos tener un indicador que muestre este término inutilizable en cada paso y este indicador debería actualizarse en cada paso rápidamente. Empecé con "max" ; pero no puede actualizarse rápidamente; Significa que si consideramos maxluego, en la primera eliminación, perdemos el máximo y debemos buscar el máximo en y su causa tiempo en que no es lineal. Tal vez deberíamos guardar los primeros términos de secuencia de manera más inteligente.
¿Cómo resuelvo este problema?
fuente
Respuestas:
Crea un búfer de tamaño . Lea en elementos de la matriz. Use un algoritmo de selección de tiempo lineal para dividir el búfer de modo que los elementos más pequeños sean los primeros; esto lleva tiempo. Ahora lea otros elementos de su matriz en el búfer, reemplazando los elementos más grandes en el búfer, particione el búfer como antes y repita.2 k k O ( k ) k k2k 2k k O(k) k k
Esto toma tiempo y espacio.O ( k )O(k∗n/k)=O(n) O(k)
fuente
min
Puede hacerlo en la memoria y el tiempo formando un montón máximo de tamaño fijo a partir de los primeros elementos en el tiempo , luego iterando sobre el resto de la matriz y presionando un nuevo elemento y luego aparece para cada elemento dando tiempo total = .O ( n log k ) k O ( k ) O ( log k ) O ( k + n log k ) O ( n log k )O(k) O(nlogk) k O(k) O(logk) O(k+nlogk) O(nlogk)
Puede hacerlo en la memoria auxiliar y el tiempo utilizando el algoritmo de selección de mediana de medianas, seleccionando en y devolviendo los primeros elementos. Sin cambios en los asintóticos, puede usar introselect para acelerar el caso promedio. Esta es la forma canónica de resolver su problema.O ( n ) k kO(logn) O(n) k k
Ahora técnicamente y son incomparables. Sin embargo, sostengo que es mejor en la práctica, ya que es efectivamente constante teniendo en cuenta que ningún sistema informático tiene más de bytes de memoria, . Mientras tanto, puede llegar a ser tan grande como .O(logn) O(k) O(logn) 264 log264=64 k n
fuente