Búsqueda de amplitud de árbol primero (Parte 1): ¿Es verdadera la teoría de seis grados de las relaciones interpersonales?

Búsqueda de amplitud de árbol primero (Parte 1): ¿Es verdadera la teoría de seis grados de las relaciones interpersonales?

Amigos en las redes sociales

Hay una gran cantidad de usuarios en plataformas de redes sociales como LinkedIn, Facebook, WeChat y QQ. En estas redes sociales, una parte muy importante es la relación de "amistad" entre las personas.

En matemáticas, para expresar este tipo de amistad, usualmente usamos los nodos en el gráfico para representar a una persona, y los bordes en el gráfico para representar el conocimiento entre personas, entonces las redes sociales pueden usar la teoría de gráficos Dijo. La "relación de conocimiento" se puede dividir en unidireccional y bidireccional.

Representación unidireccional, dos personas a y b, a sabe b, pero b no sabe a. Si se trata de una relación unidireccional, debemos utilizar un borde dirigido para distinguir si a sabe b o b sabe a. Si se trata de una relación bidireccional, las dos partes se conocen entre sí, por lo que es suficiente usar directamente un borde no dirigido.

img

Como se puede ver en el ejemplo anterior, puede haber múltiples caminos hacia la relación de amistad entre las personas. Por ejemplo, Zhang San puede conectarse a Zhao Liu directamente, o puede conectarse a Zhao Liu a través de Wang Wu. Comparando los dos caminos, la longitud del camino más corto es 1, por lo que Zhang San y Zhao Liu fueron una vez amigos. En otras palabras, aquí uso la longitud del camino más corto entre los dos para definir cuántas veces son amigos. Según esta definición, en el diagrama de relación social anterior, Zhang San, Wang Wu y Zhao Liu eran amigos de primer grado, mientras que Li Si y Zhao Liu y Wang Wu eran amigos de segundo grado.

img

Dado un usuario, ¿cómo encontrar primero a sus amigos de segundo grado?

Problemas que enfrenta la búsqueda de profundidad primero

Al usar la búsqueda de optimización de profundidad, debemos filtrarla una vez que encontremos el borde que genera el bucle. La operación específica es determinar si el nuevo punto de acceso ya ha aparecido en el canal actual y, si ha ocurrido, no se volverá a acceder a él.

La teoría de los seis grados nos dice que su relación social se expandirá exponencialmente a medida que aumente el grado de la relación. Esto significa que durante la búsqueda profunda, cada vez que agrega un grado de relación, se agregará una gran cantidad de amigos.

¿Qué es la búsqueda de amplitud primero?

BFS (búsqueda en anchura), también llamado primero en amplitud de búsqueda , se refiere a un nodo en el gráfico, paseo a lo largo del borde y el punto de unión, y para encontrar la distancia a este punto 1, todos los demás Punto. Solo cuando se buscan todos los puntos con la distancia 1 desde el punto inicial, se busca el punto con la distancia 2 desde el punto inicial. Cuando se buscan todos los puntos con una distancia de 2 desde el punto de partida, se busca el punto con una distancia de 3 desde el punto de partida, y así sucesivamente.

img

¡La búsqueda de amplitud es en realidad buscar un árbol horizontalmente!
Aunque el orden de búsqueda de amplitud y profundidad primero es diferente, también tienen dos cosas en común.
Primero, en el proceso de progreso, no queremos tomar nodos y bordes repetidos, por lo que marcaremos los puntos que se han visitado, y en el proceso de progreso posterior, solo visitaremos aquellos puntos que no se hayan marcado. . En este punto, la amplitud primero y la profundidad primero son consistentes. La diferencia es que, en prioridad de amplitud, si encuentra que los puntos directamente conectados a un determinado nodo han sido visitados, entonces el siguiente paso analizará los puntos directamente conectados al nodo hermano de este punto ¿Hay un nuevo punto para visitar?

En la figura anterior, después de visitar los dos nodos secundarios 580 y 762 del nodo 945, la estrategia de amplitud primero encontró que 945 no tiene otros nodos secundarios, así que revise el nodo hermano 131 de 945 para ver qué nodos secundarios tiene El punto es accesible, por lo que el siguiente punto visitado es 906. Prioridad en profundidad, si llega a cierto punto y encuentra que todos los puntos conectados directamente a este punto han sido visitados, entonces no verá su nodo hermano, sino que volverá al nodo padre de este punto. Compruebe si hay un nuevo punto entre los puntos directamente conectados al nodo principal. Por ejemplo, en la figura anterior, después de visitar los dos nodos secundarios del nodo 945, la estrategia de profundidad primero volverá al punto 110 y luego visitará el nodo secundario 131 de 110.
En segundo lugar, la búsqueda de amplitud primero también nos permite acceder a todos los puntos que están conectados al punto de partida, por lo que también se llama transversal de amplitud. Si un gráfico contiene varias subgrafías no conectadas, la búsqueda de amplitud desde el punto de partida solo puede cubrir una de las subgrafías. En este momento, necesitamos cambiar un punto de partida que no ha sido visitado, y continuar recorriendo en primer lugar otro subgrafo. La búsqueda de amplitud puede usar el mismo método para atravesar un gráfico con varias subgrafías conectadas,

¿Cómo implementar la recomendación de amigo social?

¿Cómo visitar preferentemente los puntos con una distancia más corta al registrar todos los nodos encontrados? Si observa detenidamente, encontrará que el nodo más cercano al punto de partida se descubrirá antes. En otras palabras, cuanto antes se visite el nodo, antes se procesará,

Aquí necesitamos usar la estructura de datos cola primero en entrar, primero en salir (primero en entrar, primero en salir).

Entonces, ¿cómo funciona la cola en la búsqueda de amplitud primero? Esto se divide principalmente en los siguientes pasos.
Primero, coloque el nodo inicial en la cola. Luego, cada vez que se toma un nodo de la parte superior de la cola, se buscan todos los nodos debajo de él. A continuación, agregue el nodo recién descubierto al final de la cola. Repita los pasos anteriores hasta que no se encuentren nuevos nodos.

img

En el primer paso, el nodo inicial 110 se agrega a la cola.
En el segundo paso, se saca el nodo 110 y se buscan los nodos 123, 879, 945 y 131 del siguiente nivel.
Paso 3. Agregue los puntos 123, 879, 945 y 131 al final de la cola.
En el paso 4, repita los pasos 2 y 3 para procesar el nodo 123 y agregue los nodos recién descubiertos 162 y 587 al final de la cola.
Paso 5, repita los pasos 2 y 3, procese el nodo 879, no se encuentran nuevos nodos.
Paso 6, repita los pasos 2 y 3, procese el nodo 945 y agregue los nodos recién descubiertos 580 y 762 al final de la cola.
...
Paso n-1, repita los pasos 2 y 3, procese el nodo 906 y no se encuentran nuevos nodos.
En el paso n, repita los pasos 2 y 3 para procesar el nodo 681, no se encuentran nuevos nodos y no hay más nodos para procesar, y todo el proceso finaliza.

  • Nodo de usuario Nodo . El nodo de usuario diseñado esta vez es ligeramente diferente del nodo de árbol de prefijo TreeNode, que contiene el ID de usuario user_id y la colección de amigos del usuario. Utilizo HashSet para facilitar que el usuario confirme si habrá amigos duplicados al generar el gráfico de relación de usuario.
  • Representa la matriz de nodos Nodo [] de todo el gráfico . Como cada usuario está representado por user_id, puedo usar una matriz continua para representar a todos los usuarios. El user_id del usuario es el índice de la matriz.
  • Cola de la cola . Como Queue es una interfaz en Java, debe usar una clase LinkedList con una implementación concreta.

Resumen

Al atravesar un árbol o gráfico, si usa una estrategia de profundidad primero, el número de nodos encontrados puede aumentar exponencialmente. Si nos preocupa más el punto de conexión más cercano, como un amigo de segundo grado en una relación social, entonces, en este caso, la estrategia de amplitud es más eficiente. Precisamente debido a esta característica, ya no podemos usar programación recursiva o estructuras de datos de pila para lograr amplitud primero, sino que necesitamos usar una cola con características de primero en entrar, primero en salir.

img

Supongo que te gusta

Origin www.cnblogs.com/liugangjiayou/p/12712077.html
Recomendado
Clasificación