Varias estructuras de datos, sus ventajas, desventajas y aplicaciones.

1. Tabla de secuencia

Ventajas: es un bloque de memoria continuo y la eficiencia de acceso a los elementos es alta O (1).
Desventajas: tamaño fijo, gran sobrecarga de expansión, gran sobrecarga de inserción y eliminación O (n).
Escenario de uso: programas que requieren un gran acceso a elementos y pequeñas adiciones y eliminaciones.

2. Lista enlazada

Ventajas: Insertar y eliminar nodos es muy eficiente O (1) y no requiere expansión.
Desventajas: las listas vinculadas no son estructuras de almacenamiento aleatorias y el costo de encontrar elementos es O (n)
Escenarios de uso: adecuado para programas que necesitan realizar una gran cantidad de agregar y eliminar elementos sin requerir acceso a los elementos.

3. Árbol de clasificación binaria

Características: pequeño a la izquierda y grande a la derecha, eficiencia de búsqueda O (logn), en casos extremos O (n).
Inserción: implementación recursiva, el nodo recién insertado debe ser un nodo hoja.
Eliminar: Nodo hoja: eliminar directamente. Eliminar un nodo que solo tenga un subárbol izquierdo o derecho: reemplácelo con un subárbol izquierdo o derecho. El subárbol izquierdo y el subárbol derecho de un nodo eliminado tienen ambas cosas: intercambiar posiciones con el sucesor directo del recorrido en orden y eliminarse a sí mismo.

4. Árbol binario equilibrado

Características: pequeño a la izquierda y grande a la derecha, sin valores duplicados. Nació para resolver el problema de que el árbol de clasificación binaria degenera en una lista enlazada.
Ventajas: la eficiencia de la consulta de un árbol binario equilibrado es inversamente proporcional a la altura: cuanto más pequeña es h, más rápida es la consulta O (logn).
Desventajas: la inserción y eliminación destruirán el equilibrio, lo que requerirá rotaciones aleatorias hacia la izquierda y hacia la derecha para restablecer el equilibrio. La inserción y eliminación frecuentes afectarán la eficiencia.
Ajuste del desequilibrio: LL: rotación a la derecha; RR: rotación a la derecha; RL: rotación a la derecha - rotación a la izquierda; LR: rotación a la izquierda - rotación a la derecha.

5. Árboles rojos y negros.

Características: El nodo raíz siempre es negro, sin nodos rojos adyacentes. En la ruta desde el nodo raíz a cualquier nodo cuyos descendientes sean NULL, el número de nodos negros es el mismo y cada nodo hoja es negro.
Ventajas: el árbol rojo-negro abandona la búsqueda del equilibrio completo y busca un equilibrio aproximado, asegurando que cada inserción solo requiera hasta tres rotaciones para lograr el equilibrio, y es más sencillo de implementar O (logn).
Desventajas: la búsqueda es más lenta que el árbol AVL (más alto), pero la eficiencia de eliminación ha mejorado enormemente.
Aplicación: Conjunto, MultiSet, Mapa, MultiMap en STL.
Reglas de inserción:
1. Si X es raíz, establezca X en negro y finalice.
El tío es rojo:
1. Marque el nodo X recién insertado en rojo. 2. Se encuentra que el Padre§ de X también es rojo, lo que viola la tercera regla del árbol rojo-negro. 3. Se descubre que el tío (U) de X también es rojo. 4. Marque P y U en negro. 5. Marca a X y al abuelo de X (G) con el mismo color, es decir, rojo. Repita los pasos 2 y 3. 6. Encuentre que G es el nodo raíz, marcado en negro. 7. Fin.
El tío es negro:
3. Si el tío de X (U) es negro, tenemos que afrontarlo en cuatro situaciones.
3.1 LL, P es el hijo izquierdo de G y X es el hijo izquierdo de P.
3.1, LR, P es el hijo izquierdo de G y X es el hijo derecho de P.
3.1. RR, P es el hijo derecho de G y X es el hijo derecho de P.
3.1. RL, P es el hijo derecho de G y X es el hijo izquierdo de P.
3.2 LL: rotación a la derecha; RR: rotación a la derecha; RL: rotación a la derecha - rotación a la izquierda; LR: rotación a la izquierda - rotación a la derecha.

6. árbol B

Características: También llamado árbol de búsqueda equilibrado de rutas múltiples. Cuando se aplica el árbol B a la base de datos, la base de datos aprovecha al máximo el principio del disco (el almacenamiento de datos en el disco se almacena en forma de bloques, cada tamaño de bloque es 4K , cada vez que se lee IO, use un bloque de disco para leerlo a la vez), limite el tamaño del nodo y utilícelo completamente dentro del rango de tamaño del bloque de disco. Al aumentar la cantidad de palabras clave de nodos en el árbol, los niveles son menores que antes, lo que reduce la cantidad y la complejidad de las búsquedas de datos.
Aplicación: tecnología de indexación de bases de datos, sistema de archivos.

7. Árbol B+

Características: El árbol B + es una versión mejorada del árbol B. El árbol B + hace un uso completo del espacio de nodos, lo que hace que la velocidad de consulta sea más estable y la velocidad se acerca completamente a la búsqueda binaria.
Aplicación: base de datos, sistema de archivos, acceso por intervalos.
Ventajas:
1. Cada nodo que no es hoja almacena más palabras clave, el árbol tiene menos niveles y la velocidad de consulta es rápida.
2. La velocidad de consulta es estable: todas las palabras clave están en nodos hoja y el número de búsquedas es el mismo cada vez, por lo que la velocidad de consulta es más estable que la del árbol B +.
3. El árbol B + naturalmente tiene una función de clasificación: todos los datos de los nodos hoja del árbol B + forman una lista vinculada ordenada, lo cual es más conveniente cuando se consultan datos en intervalos grandes y pequeños, los datos son muy compactos y la tasa de aciertos de caché es mayor. que el del árbol B.
4. El recorrido completo de los nodos del árbol B+ es más rápido. El árbol B+ facilita el recorrido de todo el árbol al atravesar todos los nodos hoja. No es necesario atravesar cada capa como el árbol B, lo que favorece el escaneo completo de la tabla de la base de datos.
5. La ventaja del árbol B es equivalente al árbol B + es que si los datos a los que se accede con frecuencia están muy cerca del nodo raíz y el nodo no hoja del árbol B almacena la dirección de los datos de la máquina de palabras clave, entonces esto El tipo de recuperación es más rápido que el árbol B+.
Reglas:
1. Los nodos no hoja del árbol B+ no guardan los punteros de los registros de palabras clave, solo realizan la indexación de datos, lo que aumenta en gran medida la cantidad de palabras clave que cada nodo no hoja del árbol B+ puede guardar.
2. El nodo hoja del árbol B + guarda los punteros de todos los registros de palabras clave del nodo padre. Todas las direcciones de datos deben obtenerse del nodo hoja, por lo que el número de consultas es el mismo cada vez.
3. Las palabras clave de los nodos hoja del árbol B + están ordenadas de pequeña a grande. Los datos al final del lado izquierdo guardarán el puntero a los datos iniciales del nodo de la derecha.
4. El número de nodos secundarios de los nodos que no son hoja = el número de palabras clave. MySQL usa el árbol B + para implementarlo.

7. Árbol de Huffman

Definición: cuando se construye un árbol con N nodos (todos los nodos hoja y todos con sus propios pesos), si la longitud de la ruta ponderada para construir este árbol es la más pequeña, se denomina árbol binario óptimo, también llamado árbol Ha.Fman. . El nodo con mayor peso en el árbol de Huffman está más cerca del nodo raíz.
Aplicación: Toma de decisiones en problemas de mínimo coste. Codificación Huffman, compresión, cifrado y descifrado de datos, transferencia de archivos.

8. montón

Propiedad 1: el montón es un árbol binario completo, también llamado montón binario. Cualquier nodo en el montón siempre no es mayor ni menor que el valor de su nodo hijo.
Propiedad 2: dado que el montón es un árbol binario completo, de acuerdo con las propiedades del árbol binario, el árbol binario completo se puede asignar perfectamente a la estructura de la matriz. Pila superior grande: arr[i]>=arr[2i+1]&&arr[i]>=arr[2i+2]; pila superior pequeña: arr[i]<=arr[2i+1]&&arr[i]< =arr[2i+2]; Por lo tanto, las matrices se utilizan a menudo para implementar estructuras de montón.
Propiedad 3: dado que el montón se considera un orden parcial, solo existe una relación de tamaño entre el nodo padre y el nodo hijo, y no existe una relación de tamaño entre los dos nodos hijos, por lo que el orden de almacenamiento real del montón construido usar diferentes algoritmos para el mismo lote de elementos en la matriz no es necesariamente seguro. Lo mismo, y la clasificación en montón también es un algoritmo de clasificación inestable.
Aplicación: el montón se usa a menudo para implementar colas de prioridad. La cola de prioridad puede agregar datos libremente, pero al eliminar datos, debe eliminarlos en orden comenzando desde el valor mínimo. El montón también se utiliza para implementar la clasificación del montón.

9. pila

Aplicación: conversión de base arbitraria de números, prueba de coincidencia de corchetes, evaluación de expresiones, recorrido de árbol binario, etc.

10. Cola

Aplicación: utilice su función primero en entrar, primero en salir para resolver escenarios comerciales específicos, como notificación de mensajes, procesamiento de pedidos, procesamiento asincrónico, etc.

11. tabla hash

1. Aplicación HashMap
: adecuada para situaciones donde los requisitos de rendimiento de búsqueda son altos y no existe una relación lógica entre los elementos de datos.
Definición: la capa inferior es una estructura de matriz, y cada elemento de la matriz corresponde a una lista vinculada, esta estructura se llama hash de lista vinculada, también llamada tabla hash, tabla hash.
Procedimiento almacenado:
1. Llame al método HashCode en la clave del HashMap y devuelva el valor int, que es el HashCode correspondiente.
2. Utilice este HashCode como índice de la tabla hash para encontrar la posición correspondiente de la tabla hash. Si la posición actual está vacía, envuelva el KeyValue del HashMap en una matriz de entrada y colóquelo en la posición actual.
3. Si la posición actual no está vacía, continúe buscando la lista vinculada almacenada en el índice actual, use el método Equals para encontrar la matriz de entrada con la misma clave y reemplace su valor de valor.
4. Si no se encuentra la misma clave, mueva la lista vinculada en la posición actual hacia atrás y coloque la nueva matriz de entrada al principio de la lista vinculada.
2. Definición de HashSet
: HashSet se implementa a través de HashMap. El parámetro de entrada de HashMap consta de dos KeyValues. Al implementar HashSet, mantenga HashMap solo procesando su objeto Key.
Procedimiento almacenado:
1. HashSet primero llamará al método HashCode del elemento para obtener el valor hash del elemento.
2. Luego calcule la ubicación de almacenamiento en la tabla hash realizando operaciones como cambiar el valor hash.
3. Si no hay ningún elemento almacenado en la posición actual, el elemento se puede colocar directamente en esa posición.
4. Si hay otros elementos, se llamará al método igual para comparar con el elemento en esa posición. Si se devuelve verdadero, se considera un elemento duplicado y no se permite la suma. Si se devuelve fasle, se permite la suma.
3. Solución a la colisión de hash
Motivo: diferentes claves obtienen el mismo valor después del cálculo mediante la función hash.
1. Método de hash abierto: en la matriz en la que se basa la tabla hash, cada posición es el nodo principal de una lista vinculada, por lo que las tuplas en conflicto se colocarán en la misma lista vinculada.
2. Método de hash cerrado: cuando ocurre un conflicto, los elementos posteriores irán a la siguiente posición para encontrar un espacio vacío.
4. Ampliación de la tabla hash
Motivo: a medida que aumenta el número, cada elemento de la tabla hash se hará cada vez más largo, por lo que la eficiencia se reducirá considerablemente.
Expansión: aumente el espacio de almacenamiento de la tabla hash al doble del tamaño original, en este momento es necesario modificar todos los datos (recuerde la función hash para obtener la nueva posición).

12. Figura

Almacenamiento de gráficos
1. Matriz de adyacencia
Definición: El método de almacenamiento de matriz de adyacencia de un gráfico es utilizar dos matrices para representar el gráfico, una matriz unidimensional para almacenar la información de los vértices en el gráfico y una matriz bidimensional para almacenar la información de borde en el gráfico. Insertar descripción de la imagen aquí
Nota:
1. En aplicaciones simples, puede utilizar directamente una matriz bidimensional como matriz de adyacencia del gráfico.
2. Cuando los elementos de la matriz de adyacencia solo indican si existe el borde correspondiente, se puede definir un tipo de enumeración con un valor de 0 o 1.
3. La matriz de adyacencia de un gráfico no dirigido es una matriz simétrica y se puede utilizar una matriz de compresión para matrices de adyacencia a gran escala.
4. La complejidad espacial de la representación de la matriz de adyacencia es O (n2), donde n es el número de vértices del gráfico |V|. 5. Usando el método de la matriz de adyacencia
para almacenar el gráfico, es fácil determinar si hay un borde entre dos vértices cualesquiera en el gráfico. Pero para determinar cuántos bordes hay en el camino, cada elemento debe detectarse por fila y columna, lo que lleva mucho tiempo.
6. Los gráficos densos son adecuados para la representación del almacenamiento mediante matrices de adyacencia.

2. Lista de adyacencia

Concepto: la lista de adyacencia se refiere al establecimiento de una lista enlazada individualmente para cada vértice vi en el gráfico. Los nodos i inferiores en la lista enlazada individualmente representan los bordes adjuntos al vértice vi. Esta lista enlazada individualmente se convierte en la lista de bordes del vértice vi. El puntero principal de la tabla de borde y la información de datos de los vértices se almacenan secuencialmente, por lo que hay dos tipos de nodos en la lista de adyacencia: nodos de la tabla de vértices y nodos de la tabla de borde. El nodo de la tabla de vértices consta de un campo de vértices y un puntero que apunta al primer borde adyacente, y el nodo de la tabla de bordes consta de un campo de puntos adyacentes y un campo de puntero que apunta al siguiente borde adyacente.
Insertar descripción de la imagen aquí
Insertar descripción de la imagen aquí

Características:
1. Si el gráfico G es un gráfico no dirigido, el espacio de almacenamiento requerido es O(|V|+2|E|), si G es un gráfico dirigido, el espacio de almacenamiento requerido es O(|V|+|E| ), el primero es múltiplo de 2 porque cada arista del gráfico no dirigido aparece dos veces en la lista de adyacencia.
2. Para gráficos de coeficientes, el uso de la representación de lista de adyacencia ahorrará mucho espacio de almacenamiento.
3. En la lista de adyacencia, dado un vértice, es fácil encontrar todos sus bordes adyacentes, porque solo es necesario leer su lista de adyacencia. En la matriz de adyacencia, la misma operación requiere escanear cada fila, lo que lleva un tiempo O (N). Sin embargo, si desea determinar si hay un borde entre dos vértices dados, puede verificarlo inmediatamente en la matriz de adyacencia, mientras que en la matriz de adyacencia En la tabla, es necesario encontrar otro nodo en el borde correspondiente al nodo correspondiente, que es menos eficiente.
4. En la representación de la lista de adyacencia de un gráfico dirigido, para encontrar el grado de salida de un vértice dado, solo necesita calcular el número de nodos en su lista de adyacencia, pero para encontrar el grado de entrada de un vértice, necesita para recorrer toda la lista de adyacencia, por lo que puede utilizar el almacenamiento de lista de adyacencia inversa.
5. La representación de la lista de adyacencia del gráfico no es única, porque en la lista de adyacencia correspondiente a cada vértice, el orden de conexión de cada nodo de borde puede ser arbitrario, lo que depende del algoritmo para establecer la lista de adyacencia y el orden de entrada del bordes.

3. Lista de enlaces cruzados
Definición: La lista de enlaces cruzados es una estructura de almacenamiento enlazada de un gráfico dirigido. Para los gráficos dirigidos, la lista de adyacencia es defectuosa. Si le preocupa el problema del grado de salida, debe recorrer todo el gráfico para saberlo. La lista de enlaces cruzados resuelve muy bien este problema. La estructura de punto fijo se muestra en la siguiente figura, donde firstin representa el puntero principal de la tabla de borde entrante, que apunta al primer vértice en la tabla de borde entrante del vértice. firstout representa el puntero principal de la tabla de borde saliente y apunta al primer nodo de la tabla de borde saliente del vértice. Los nodos de la tabla de bordes son los siguientes, donde tailvex se refiere al subíndice del punto inicial del arco en la tabla de vértices, headvex se refiere al subíndice del punto final del arco en la tabla de vértices, headlink se refiere al campo de puntero de la tabla de borde, apuntando al siguiente borde con el mismo punto final, y taillink señala el campo de puntero de la tabla de borde y solo quiere el siguiente borde con el mismo punto de inicio. Insertar descripción de la imagen aquí
Insertar descripción de la imagen aquí
Insertar descripción de la imagen aquí
La ventaja de la lista entrecruzada es que integra la lista de adyacencia y la lista de adyacencia inversa, por lo que es fácil encontrar el arco que termina en v1 y el arco que comienza con v1, por lo que es fácil encontrar el grado de salida y grado de entrada del vértice. Además de su estructura más compleja y estructura más corta, la complejidad temporal de crear un algoritmo gráfico también es la misma que la de una lista de adyacencia. Por tanto, en la aplicación de gráficos dirigidos, la lista entrelazada es un muy buen modelo de estructura de datos.
4.
Definición de matriz de conjunto de bordes: la matriz de conjunto de bordes se compone de dos matrices unidimensionales. Una almacena la información del vértice y la otra almacena la información del borde. Cada elemento de datos de esta matriz está subíndice por el punto inicial y el final. Punto de un borde Compuesto por objetivos y pesos. Como se muestra en la figura siguiente, buscar un vértice en la matriz del conjunto de bordes requiere escanear toda la matriz de bordes, lo cual no es muy eficiente, por lo que es más adecuado para operaciones que procesan bordes en una sola operación, pero no para operaciones relacionadas con vértices.Insertar descripción de la imagen aquí

5. Recorrido del gráfico
1. Rendimiento del algoritmo DFS: DFS requiere una estación de trabajo recursiva, por lo que la complejidad del espacio es O (v). Para un gráfico con n vértices y e aristas, la matriz de adyacencia es una matriz bidimensional y debe ser buscado Los puntos adyacentes de cada vértice necesitan acceder a todos los elementos de la matriz, por lo que todos requieren tiempo O (V2). Cuando la lista de adyacencia se usa como estructura de almacenamiento, el tiempo requerido para encontrar puntos adyacentes depende del número de vértices y aristas, por lo que es O (v + E). Obviamente, para gráficos dispersos con muchos puntos y pocas aristas, la La estructura de lista de adyacencia hace que el algoritmo sea más rápido en el tiempo. La eficiencia mejora enormemente. Para los gráficos dirigidos, dado que solo es factible o no factible para la existencia de canales, no hay cambios en el algoritmo y es completamente universal.
2. Árbol de expansión en profundidad y bosque de expansión.
La búsqueda en profundidad generará un árbol de expansión de prioridad. Llamar a DFS en un gráfico conectado generará un árbol de expansión de prioridad. De lo contrario, se generará un bosque de expansión de prioridad.
3. Análisis de rendimiento del algoritmo BFS.
Independientemente del método de almacenamiento de la lista de adyacencia o la matriz de adyacencia, el algoritmo BFS requiere el uso de una cola auxiliar Q. Es necesario poner en cola N vértices una vez. En el peor de los casos, la complejidad del espacio es O ( v ). Cuando se utiliza el método de almacenamiento de lista de adyacencia, cada vértice debe buscarse una vez. Cuando se buscan los puntos adyacentes de cualquier vértice, cada borde debe visitarse al menos una vez. La complejidad temporal total del algoritmo es O(E+ V), y se utiliza la matriz de adyacencia. En el modo de almacenamiento, el tiempo necesario para encontrar los puntos adyacentes de cada vértice es O (V), por lo que el total es O (V2). Nota: La representación de la matriz de adyacencia
de el gráfico es único, pero para la lista de adyacencia, si el borde El orden de entrada es diferente y la lista de adyacencia generada también es diferente, por lo tanto, para el mismo gráfico, las secuencias DFS y BFS obtenidas en función del recorrido de la matriz de adyacencia son únicas Y las secuencias DFS y BFS basadas en el recorrido de la lista de adyacencia no son únicas.
4. Determine la conectividad del gráfico mediante el recorrido del gráfico.
Para gráficos no dirigidos, si el gráfico no dirigido está conectado, comenzando desde cualquier nodo, se puede acceder a todos los nodos en un solo recorrido. Si el gráfico de fases no está conectado, a partir de cualquier nodo, se pueden visitar todos los nodos en un solo recorrido. Si no hay un gráfico de fase que no esté conectado, comenzando desde un vértice y atravesando secuencialmente, solo se puede acceder a todos los vértices del componente conectado donde se encuentra el vértice, y no se puede acceder a los vértices de otros componentes conectados en el camino a través de este el recorrido. Para un gráfico dirigido, si hay una ruta desde el punto inicial hasta cada vértice del gráfico, entonces se puede acceder fácilmente a todos los vértices del gráfico; de lo contrario, no. Por lo tanto, se agrega un segundo bucle for a BFSTraverse() y DFSTraverse(), y luego se selecciona el punto inicial y el recorrido continúa para evitar que no se puedan atravesar todos los vértices del gráfico. Para gráficos no dirigidos, el número de llamadas a las dos funciones anteriores es igual al número de componentes conectados; para gráficos dirigidos, este no es el caso, porque un gráfico dirigido conectado se divide en fuertemente conectado y no fuertemente conectado, y su El subgrafo conectado también se divide en componentes fuertemente conectados y componentes no fuertemente conectados. Para los componentes no fuertemente conectados, llamar a DFS y BFS en secuencia no puede acceder a todos los vértices del componente conectado.

6. Árbol de expansión mínimo
El árbol de expansión de un gráfico conectado es un subgrafo conectado muy pequeño. Contiene todos los vértices del gráfico, pero solo es suficiente para formar n-1 aristas de un árbol. Si se corta una de sus aristas , Esto convertirá el árbol de expansión en un gráfico no conectado. Si le agrega un látigo, formará un bucle en el gráfico. Para un gráfico no dirigido completamente conectado G = (V, E), el árbol de expansión es diferente y el libro con la suma más pequeña de pesos de aristas se denomina árbol de expansión mínimo de G.
Existen muchos algoritmos para construir árboles de expansión mínima, pero la mayoría de los algoritmos aprovechan las siguientes propiedades de los árboles de expansión mínima: Supongamos que G = (V, E) es un gráfico no dirigido, conectado y ponderado, y U es un subconjunto no vacío del conjunto de vértices V, si (u, v) es una arista con peso mínimo, donde u∈U, v∈VU, entonces debe haber un árbol de expansión mínimo que contenga (u, v). Los algoritmos de árbol de expansión mínimo basados ​​en esta propiedad incluyen principalmente el algoritmo Prim y el algoritmo Kruskal, los cuales se basan en estrategias de algoritmo codicioso.
1. El algoritmo de Prim (Prim)
en términos sencillos significa: comenzando desde un vértice, bajo la premisa de garantizar que no se forme ningún bucle, cada vez que se encuentra y agrega un borde más corto, el componente conectado actualmente formado se trata como un todo o como un Haga clic en Ver, luego repita la operación de encontrar el lado más corto y agregarlo.
Insertar descripción de la imagen aquí
2. Algoritmo de Kruskal (Kruskal)
El proceso de construcción del árbol de expansión mínimo mediante el algoritmo de Kruskal se muestra en la siguiente figura. Inicialmente, es un gráfico sin aristas no conectado T = V con solo n vértices. Cada vértice forma un componente conectado propio. Luego se clasifica según los pesos de los bordes de pequeño a grande, y el valor de peso más pequeño que no tiene ha sido seleccionado se selecciona continuamente. Si los vértices adjuntos a este borde caen en diferentes componentes conectados en T, agregue este borde a T; de lo contrario, descarte este borde y seleccione el siguiente borde con el peso más pequeño. Y así sucesivamente, hasta que todos los vértices de T estén en un componente conexo. Insertar descripción de la imagen aquí
Idea de algoritmo: construimos directamente con el objetivo del borde, debido a que el peso está en el borde, también es una idea natural encontrar directamente el borde con el peso mínimo para construir el árbol de expansión, pero debemos considerar si se formará un bucle. al construir. En este momento utilizamos la estructura de matriz de conjunto de bordes en la estructura de almacenamiento del gráfico.
7. Camino más corto
El significado de la ruta más corta es diferente en los gráficos de red y los gráficos que no son de red. Dado que los gráficos que no son de red no tienen pesos de borde, la llamada ruta más corta en realidad se refiere a la ruta con el menor número de aristas entre dos vértices, y Para los gráficos de red, el camino más corto se refiere al camino con la suma más pequeña de pesos de los bordes que pasan entre dos vértices, y llamamos al primer vértice del camino origen y al último vértice punto final.
1. Algoritmo de Dijkstra (Dijkstra)
El algoritmo de Dijkstra se utiliza para construir la ruta más corta desde un único punto de origen, es decir, la distancia desde un determinado punto a cualquier otro punto en el gráfico es la más corta, por ejemplo, al crear una aplicación de mapas. , encuentra tu propia distancia de coordenadas. La distancia más corta a un punto de referencia. Se puede utilizar para gráficos dirigidos, pero no pueden existir pesos negativos. Tome la siguiente imagen como ejemplo. El punto general es que este algoritmo no encuentra el camino más corto de v0 a v8 a la vez, sino que encuentra el camino más corto a los vértices entre ellos paso a paso. El proceso se basa en el camino más corto. que se ha encontrado Sobre la base de la ruta, encuentre la ruta más corta hasta el vértice más lejano y finalmente obtenga el resultado.
El algoritmo DIjkstra también se basa en una estrategia codiciosa. Cuando se expresa mediante una matriz de adyacencia o una lista de adyacencia ponderada, la complejidad temporal es O (V2). Es posible que las personas solo quieran encontrar el camino más corto desde el punto de origen hasta un vértice específico. pero este problema es tan complicado como resolver el camino más corto desde el origen a todos los demás vértices, y la complejidad del tiempo también es O (V2) 2.
Algoritmo de Floyd (Floyd)
La idea del algoritmo de Floyd es: primero inicialice el matriz de distancia y luego comenzar desde A partir de un punto, el valor del punto de la matriz se actualiza gradualmente. d[i][j] representa la distancia desde el punto i al punto j. Al actualizar por enésima vez, juzgue el tamaño de d[i][k]+d[k][j] y d[i][j]. Si el primero es pequeño, actualice este valor; de lo contrario, permanecerá sin cambios. .
Ecuación de transición de estado: map[i,j]:=min{map[i,k]+map[k,j],map[i,j]};

Insertar descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/weixin_44802051/article/details/121824062
Recomendado
Clasificación