Análisis del "algoritmo de búsqueda de árbol binario y el algoritmo de ruta más corta de Floyd"

Árbol binario

Introducción al algoritmo de árbol binario

En comparación con el algoritmo de búsqueda de árbol binario, las desventajas del algoritmo de búsqueda de bucle ordinario son:

 

El algoritmo de árbol binario utiliza la idea de dicotomía y su principio operativo es el siguiente:

La idea de la búsqueda binaria es muy simple. Para una "secuencia ordenada a (la secuencia debe ordenarse primero)", si desea encontrar un elemento x, puede hacer x primero y el medio de un

Comparación de elementos:

① Si son iguales, tiene éxito;

② Si es menor que el elemento medio. Luego busque en la mitad izquierda de a;

③ Si es mayor o igual que el elemento del medio, busque en la mitad derecha de a.

La figura 5-4 es el proceso de búsqueda de 25 en una secuencia ordenada, donde I, H, Middle respectivamente representan el intervalo de búsqueda actual

Las posiciones izquierda, derecha y central del

 

Se puede usar un proceso de iteración de bucle para actualizar continuamente los tres indicadores de las posiciones izquierda y derecha (L, H) y la posición media (Medio) del intervalo para encontrar.

Análisis del principio de código de algoritmo de árbol binario

 

Implementación del programa de árbol binario

#include <iostream>  
#include <algorithm>  
#include <functional>  
using namespace std;  
  
int main()  
{  
    int arr[] = { 1,2,3,4,5,6,7,8,9 };  
    int L = 0, H = sizeof(arr) / sizeof(int), x = 0;  
    cin >> x;  
  
    while (L <= H)  
    {  
        int Middle{ (L + H) / 2 };  
        if (arr[Middle] == x)  
        {  
            break;  
        }  
        else if (arr[Middle] > x)  
        {  
            H = Middle;  
        }  
        else if (arr[Middle] < x)  
        {  
            L = Middle;  
        }  
    }  
    if (L <= H)  
    {  
        cout << "找到了目标值" << endl;  
    }  
    else  
    {  
        cout << "未找到目标值" << endl;  
    }  
} 

 

Algoritmo de Floyd

Análisis de principios del algoritmo de Floyd

 

Cuando queremos resolver el camino más corto ①-> ⑤, realizamos las siguientes operaciones:

① Primero establezca "Distancia de matriz 5 * 5 utilizada para almacenar la distancia entre dos puntos" y "Registre la matriz de la misma dimensión Puntero del penúltimo punto"

② Primero averiguamos "si Distancia [①, P] + Distancia [P, ②] <Distancia [①, ②] con un punto de P", si es así, actualice Distancia [①, ②] = Distancia [①, P] + Distancia [P, ②] y actualizar Puntero [①, ②] = P;

③ Para encontrar este nodo intermedio, podemos usar este método para encontrar "¿Hay un punto E hace Distancia [①, E] + Distancia [E, P] <Distancia [①, P]", si existe, actualice Distancia [①, P ] = Distancia [①, E] + Distancia [E, P] y puntero [①, P] = E;

④ Continuamos subdividiendo esto paso a paso, hasta que "no hay Y tal que Distancia [①, Y] + Distancia [Y, N] <Distancia [①, N]", así obtenemos la diferencia entre ①-> P El camino más corto.

⑤ Unimos los dos caminos más cortos [①, P] y [P, ②], podemos obtener el camino más corto ①-> ②, de hecho, cuando encontramos el puente P entre ①-> ②, solo necesitamos ir más lejos Simplemente analice el camino más corto entre ①-> P.

¿Cómo ver la ruta más corta del punto x-> y de acuerdo con el puntero de la matriz de ruta?

 

Queremos entender "el camino más corto desde 1 (comienzo) -> 0 (final)". Primero, Pointer [1,0] = 3, indica que 1 punto, el puente entre los dos puntos 0 es 3 puntos, analizaremos más a fondo La distancia más corta entre 1 punto y 3 puntos, Pointer [1,3] = 2 significa 1 punto, hay un puente entre 3 puntos (1-> 3 el penúltimo punto del camino) 2 puntos, y luego analizamos más a fondo El camino más corto entre 2 puntos -> 1 punto, Puntero [1,2] = 1 Cuando vemos que el penúltimo punto de 1-> 2 es 1 punto (el punto de inicio del camino 1-> 2), significa "no Hay un punto que hace que la distancia entre 1-> 2 sea menor que Distancia [1,2] ".

Al final, obtenemos "una ruta inversa": 0 (punto final) -> 3-> 2-> 1 (punto inicial).

Ejemplo de código de algoritmo de Floyd

#include <iostream>  
#include <iomanip>  
#include <limits>  
using namespace std;  
  
int main()  
{  
    int n = 4;  
    int INFINITE = INT_MAX;  
    unsigned int Distance[][4] = { {0,2,6,4},{INFINITE,0,3,INFINITE},{7,INFINITE,0,1},{5,INFINITE,12,0} };  
    // 初始化路径矩阵  
    decltype(Distance) Pointer = { 0 };  
    for (int u = 0; u < n; u++)  
    {  
        for (int v = 0; v < n; v++)  
        {  
            Pointer[u][v] = u;  
        }  
    }  
  
    // 显示初始的uv之间的距离与uv路径之间中倒数第二个点  
    for (int u = 0; u < n; u++)  
    {  
        for (int v = 0; v < n; v++)  
        {  
            cout << setw(10) << setfill(' ') << Distance[u][v] << ' ';  
        }  
        cout << '\n';  
    }  
    for (int u = 0; u < n; u++)  
    {  
        for (int v = 0; v < n; v++)  
        {  
            cout << Pointer[u][v] << ' ';  
        }  
        cout << '\n';  
    }  
    // Floyd算法  
    for (int w = 0; w < n; w++)  
    {  
        for (int u = 0; u < n; u++)  
        {  
            for (int v = 0; v < n; v++)  
            {  
                if (w != u && w != v && Distance[u][w] + Distance[w][v] < Distance[u][v] && u != v)  
                {  
                    Pointer[u][v] = w;  
                    Distance[u][v] = Distance[u][w] + Distance[w][v];  
                }  
            }  
        }  
    }  
    // u->v的最短路径  
    for (int u = 0; u < n; u++)  
    {  
        for (int v = 0; v < n; v++)  
        {  
            if (u == v) continue;  
            cout << u << "到" << v << "的逆向路径是:" << v << ',';  
            for (int w = Pointer[u][v]; w != u; )  
            {  
                cout << w << ',';  
                w = Pointer[u][w];  
            }  
            cout << u << " ; " << "其最短距离为" << Distance[u][v] << endl;  
        }  
    }  
} 

 

 

Supongo que te gusta

Origin blog.csdn.net/weixin_45590473/article/details/108683727
Recomendado
Clasificación