¿Cuál sería el mejor enfoque para encontrar la distancia entre dos nodos de un árbol?

Puede resolver este problema utilizando dos enfoques:>

  1. Usando BFS -> Suponga que tiene que encontrar la distancia entre el nodo A y el nodo B en un árbol. Simplemente puede ejecutar BFS en B y mantener un recuento del número de niveles que atravesó para llegar a A. Complejidad de tiempo: O (n) donde n es el número de vértices.
  2. Usando el ancestro común más bajo -> Ahora este enfoque requiere que viaje hacia arriba en un nivel desde el nodo A y el nodo B hasta obtener un ancestro común. (Siempre tendrá un ancestro común para cualquiera de los dos nodos. La raíz definitivamente sería un ancestro común de cualquiera de los 2 nodos). Aquí estamos hablando del más bajo entre los ancestros comunes en el árbol. Así es como los encuentras:
  • Realice un recorrido BFS desde la raíz y asigne información de nivel y principal para cada nodo. (Puede mantener el padre de la raíz como NULL)
  • Una vez que haya sido consultado con los dos nodos, obtenga los niveles de ellos.
  • Ahora encuentre el que tenga un nivel más alto. Digamos que el nodo A, tiene el nivel más alto entre los dos. Avanza en el nivel superior desde A. (¿Cómo? Al usar el padre de A, subirás un nivel). Sigue subiendo un nivel hasta que te vuelvas igual al nivel de B. Deje que este nodo sea A ‘ .
  • Siga viajando un nivel hacia arriba desde ambos nodos (Nodo B y Nodo A ‘ ) hasta llegar a un nodo común. Este nodo es el ancestro común más bajo.
  • Mantenga un recuento de la distancia que atravesó desde el nodo A y el nodo B para llegar al ancestro común más bajo. Agrega los dos. Ahora tienes la distancia entre A y B.
  • Complejidad de tiempo -> O (altura), en un promedio O (logn) para cada consulta. Tenga en cuenta la complejidad temporal de BFS al comienzo de este método. Tiene que hacerse solo una vez y no para cada consulta.

Entonces, para q consultas. El enfoque 1 da la complejidad temporal de O (qn) en promedio. Pero, el Enfoque 2 da O (n + qlogn) en promedio. Por lo tanto, usar el Enfoque 2 sería el método más eficiente.

Para 1000 consultas y 10,000 nodos. El tiempo de ejecución del enfoque 1 sería aproximadamente 100 veces más que el tiempo de ejecución del enfoque 2.

Y el enfoque 2 debería pasar bien dentro de 0.1 segundos en un compilador contemporáneo. Buena suerte !!

More Interesting

¿Por qué no necesito conocer algoritmos para lenguajes de programación modernos como Java o Python?

¿Quién sabe qué hay detrás de la API de Google Nearby Search? ¿Qué algoritmo usan? ¿Cómo encuentra Google una estación de servicio cercana?

¿Cuál es la forma más eficiente de encontrar el número total de nodos en un sistema distribuido?

¿Cuáles son algunas de las mejores plataformas en línea para practicar la codificación relacionada con algoritmos?

¿Debería darse más reconocimiento a las personas que hacen el trabajo de limpiar conjuntos de datos para que puedan ser utilizadas por personas que ejecutan algoritmos de aprendizaje automático?

¿Qué sitios web o aplicaciones usan el algoritmo de correspondencia para el cual los profesores Roth y Shapley ganaron el Premio Nobel en 2012?

Digamos que encontramos un algoritmo que resuelve problemas de NP-Complete en tiempo polinómico pero no podemos probarlo. ¿Cuáles serían las consecuencias?

¿Es este código de búsqueda binario válido? Si es así, ¿entonces cómo?

¿Cómo construiría una estructura de datos compartidos para un alto rendimiento y disponibilidad?

¿Por qué todos me dicen que aprenda la estructura de datos y los algoritmos si quiero obtener un trabajo de desarrollo de software?

¿Qué problemas comunes se resuelven con la programación dinámica?

Estoy tratando de incrementar un elemento de matriz de caracteres inicializado a cero pero no puedo, ¿por qué?

¿Cómo se implementa el alogoritmo de Timsort en Java?

¿Por qué el método Arrays.sort en Java implementa timsort en lugar de contar?

¿El aprendizaje automático es todo sobre software? ¿Qué tipo de hardware se requiere para simular algoritmos de aprendizaje automático?