Á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;
}
}
}