バイナリツリー
バイナリツリーアルゴリズムの概要
バイナリツリー検索アルゴリズムと比較すると、通常のループ検索アルゴリズムの欠点は次のとおりです。
バイナリツリーアルゴリズムは二分法の概念を使用しており、その動作原理は次のとおりです:
バイナリ検索の考え方は非常に単純です。「順序付けられたシーケンス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;
}
}
}