「バイナリツリー検索アルゴリズムとフロイド最短パスアルゴリズム」の分析

バイナリツリー

バイナリツリーアルゴリズムの概要

バイナリツリー検索アルゴリズムと比較すると、通常のループ検索アルゴリズムの欠点は次のとおりです。

 

バイナリツリーアルゴリズムは二分法の概念を使用しており、その動作原理は次のとおりです:

バイナリ検索の考え方は非常に単純です。「順序付けられたシーケンスa(シーケンスを最初に並べ替える必要があります)」の場合、要素xを検索する場合は、xを最初に作成してaの中央に配置できます。

要素の比較:

①それらが等しい場合、それは成功します。

②中央の要素よりも小さい場合。次に、aの左半分を検索します。

③真ん中の要素以上の場合は、aの右半分を検索してください。

図5-4は、順序付けられた順序で25を検索するプロセスです。ここで、I、H、Middleはそれぞれ現在の検索間隔を表します。

の左、右、中央の位置

 

ループ反復プロセスを使用して、間隔の左右の位置(L、H)と中央の位置(Middle)の3つのインジケーターを継続的に更新して見つけることができます。

バイナリツリーアルゴリズムコード原理の分析

 

バイナリツリープログラムの実装

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

 

フロイドアルゴリズム

フロイドアルゴリズムの原理分析

 

最短パス①→⑤を解きたいときは、以下の操作を行います。

①まず、「2点間の距離を格納するための5 * 5行列距離」と「最後から2番目の点の同次元行列ポインタを記録する」を設定します。

②まず、「距離[①、P] +距離[P、②] <距離[①、②]の点がPかどうか」を調べ、その場合は距離[①、②] =距離[①、P] +を更新します。距離[P、②]、ポインタの更新[①、②] = P;

③この中間ノードを見つけるには、この方法で「Eが距離[①、E] +距離[E、P] <距離[①、P]になる点はありますか」を見つけ、存在する場合は距離[①、Pを更新します。 ] =距離[①、E] +距離[E、P]およびポインター[①、P] = E;

④「距離[①、Y] +距離[Y、N] <距離[①、N]のようなYがなくなるまで、この段階を細かく分割していきます。したがって、①-> Pの差が得られます。最短パス。

⑤2つの最短パス[①、P]と[P、②]を結ぶと、最短パスが得られます①->②実際、①->②の間にブリッジPが見つかったら、さらに先に進むだけです。 ①-> P間の最短経路を分析するだけです。

パスマトリックスポインタに従ってx-> yポイントの最短パスを表示するにはどうすればよいですか?

 

「1(始点)→0(終点)からの最短経路」を理解したい。まず、Pointer [1,0] = 3で、1点、2点0間のブリッジが3点であることを示し、さらに分析する。 1点と3点の間の最短距離、Pointer [1,3] = 2は1点を意味し、3点(パスの最後から2番目の点の1-> 3)2点の間にブリッジがあり、さらに分析します。 2点間の最短経路-> 1点、Pointer [1,2] = 1 1-> 2の最後から2番目の点が1点(経路1-> 2の始点)であることがわかると、「いいえ」を意味します。 1-> 2間の距離をDistance [1,2] "よりも小さくするポイントがあります。

最終的に、「リバースパス」が得られます:0(終点)-> 3-> 2-> 1(始点)。

フロイドアルゴリズムのコード例

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

 

 

おすすめ

転載: blog.csdn.net/weixin_45590473/article/details/108683727