¿Cuál es la forma más eficiente de encontrar el késimo elemento más pequeño en un montón mínimo?

Intentemos atravesar su montón en orden creciente. Primero, miramos la raíz. A continuación, observamos el hijo menor de la raíz. ¿Pero qué nodo miramos desde aquí? ¡El próximo más pequeño podría ser otro de los hijos de la raíz, o podría ser un nieto de la raíz!

Entonces hagamos lo siguiente. Llamemos a nuestro montón mínimo original [math] H_1 [/ math], e introduzcamos otro montón mínimo [math] H_2 [/ math]. Cada vez que visitamos un nodo [matemática] x [/ matemática] en [matemática] H_1 [/ matemática], empujemos un par [matemática] (v, p) [/ matemática] para cada hijo de [matemática] c [/ matemática ] de [matemática] x [/ matemática] a [matemática] H_2 [/ matemática], donde [matemática] v [/ matemática] es el valor en el hijo [matemática] c [/ matemática], y [matemática] p [ / math] es un puntero a esa [math] c [/ math]. Para averiguar qué nodo visitar a continuación en [math] H_1 [/ math], saquemos un par [math] (v, p) [/ math] de [math] H_2 [/ math] y visitemos [math ] H_1 [/ math] nodo señalado por [math] p [/ math]. El nodo [matemático] k [/ matemático] que sacamos de [matemático] H_2 [/ matemático] mantendrá el valor del nodo más pequeño [matemático] k [/ matemático] en [matemático] H_1 [/ matemático].

¿Cuánto tiempo se tarda? Bueno, suponiendo que [math] H_1 [/ math] es un montón binario, haremos a lo sumo [math] 2k [/ math] inserciones en [math] H_2 [/ math], así que diremos que el tamaño de [math] H_2 [/ math] es [math] \ mathcal {O} (k) [/ math]. Esto significa que cada inserción es [math] \ mathcal {O} (\ log k) [/ math], y cada extracto-min también es [math] \ mathcal {O} (\ log k) [/ math], suponiendo nuevamente estamos usando un montón binario para [math] H_2 [/ math].

El tiempo total es [math] \ mathcal {O} (k \ log k) [/ math], según lo deseado.

La forma muy eficiente sería hacer el extracto min-montón para k veces. Por lo tanto, la complejidad será igual a O (Klog (tamaño del montón)). Este es el límite inferior ya que la ordenación no se puede hacer mejor que O (nlogn) para n elementos.

More Interesting

¿Cuáles son las preguntas técnicas que se hacen durante la entrevista en el sitio como desarrollador front-end?

¿Qué tipo de preguntas se hacen en una entrevista técnica?

Además de la búsqueda binaria, ¿hay otros ejemplos de código que tengan un tiempo de ejecución de O (log n)?

Cómo aprender a programar y desarrollar un interés en escribir códigos

¿Cuáles son las cosas básicas que debe considerar para una entrevista?

¿Cuáles son los conceptos más importantes en C y C ++ que se deben aprender y comprender antes de una entrevista de programación?

¿Cómo diseñaría un sistema de cupones como una pregunta de diseño de software?

¿Cómo es el proceso de entrevista en HackerRank for Software Developer? ¿Cuál es el proceso después de la ronda en línea?

Cómo resolver la siguiente pregunta en Java: tengo dos listas vinculadas, que representan dos números: l1: 2-> 3-> 4, l2: 7-> 8; agregue estos dos números y almacene el resultado en l1, es decir, l1 debería convertirse en l1: 3-> 1-> 2

¿Cuál es el contenido teórico de información de las monedas y el acertijo de escala?

¿Cuáles son algunas preguntas que un empleador podría hacer sobre Swift durante una entrevista de trabajo para desarrolladores de iOS? ¿Qué tipo de respuestas esperaría él o ella?

¿Cómo es la entrevista telefónica de Google?

Hay una matriz de tamaño 'N', y todos los números que contiene son distintos, excepto uno que se repite solo una vez. ¿Cómo encontrará qué número se repite atravesando la matriz solo una vez?

¿Cómo se borra una entrevista de codificación algorítmica una vez que ya se encuentra en la industria del software y ha perdido totalmente el contacto de la codificación algorítmica / Programación competitiva?

Cómo mejorar mi currículum, con 3 meses de tiempo para ubicaciones