首頁  >  文章  >  後端開發  >  廣度優先搜尋不使用隊列

廣度優先搜尋不使用隊列

WBOY
WBOY轉載
2023-09-16 21:57:031157瀏覽

廣度優先搜尋不使用隊列

廣度 首先,Look (BFS) 是一種圖表遍歷計算,用於研究圖表中廣度運動中的中心。 BFS 的正常使用利用線路資訊結構來追蹤即將到來的集線器。無論如何,可以想像在不使用明確線路的情況下利用其他資訊結構來執行 BFS。

在沒有線路的情況下實作 BFS 的一種可選方法是利用兩個叢集或記錄:一個用於正在調查的目前層級的集線器,另一個用於要調查的下一層集線器。起初,目前層級清單包含來源中心。

計算首先強調當前層級清單並轉到每個集線器。對於每個經過的樞紐,其相鄰的樞紐都會受到檢查。如果未存取相鄰的集線器,則將其標記為已存取並新增至其他層級清單。該句柄將繼續進行,直到目前等級清單中的所有集線器都經過為止。

一旦當前級別列表完全遍歷完畢,計算將繼續到另一個級別列表,並重新哈希前往集線器並檢修下一個級別列表的方法。此準備工作將持續進行,直到不再有未訪問的節點為止。

使用的方法

廣度優先方法

廣度優先方法

BFS 演算法從來源集線器開始,調查其鄰居,最近又轉移到另一個層級的鄰居。使用線路資訊結構來追蹤您造訪的樞紐。在每個週期中,計算都會存取一個集線器,將其標記為已完成,並對未訪問的相鄰集線器進行排隊。此準備工作將持續進行,直到所有可到達的中心都被訪問為止。

程式碼初始化一個向量 adj 來表示圖表的傳染性清單。向量的每個檔案都與一個中心進行比較,每個記錄的值包含相鄰的中心。 BFS 遍歷由 BFS 工作執行,它採用來源集線器、集線器數量 N、經過集線器的向量 vis、單獨的 dp 以及用於追蹤要存取的集線器的向量 v。 bfsTraversal 工作初始化已消失的集線器並刪除向量,然後呼叫 BFS 工作來執行遍歷。

演算法

  • 建立圖表的傳染清單表示形式。

  • 初始化一行來儲存要存取的集線器。

  • 初始化消失叢集以追蹤消失節點。

  • 初始化刪除叢集以在每個集線器上儲存從來源集線器刪除的內容。將來源集線器的分隔符號設定為0。

  • 將來源集線器排入佇列並檢查其是否已存取。

  • 雖然管線不可淨化,但請執行以下操作:

  • #刪除佇列頭部的集線器。對於已出隊且尚未遍歷的每個鄰居集線器,請執行以下操作: 將相鄰集線器排隊。將相鄰的樞紐標記為已存取。將鄰居集線器刪除更新為出隊集線器刪除(也是 1)。

  • 重複步驟 6,直到該行為空。

  • BFS 遍歷完成後,單獨的叢集將包含從來源節點到圖中所有其他中心的間隔。

  • (可選)您也可以在 BFS 遍歷中追蹤每個集線器的父集線器,以便以最簡單的方式從來源集線器到所有其他集線器。

範例

#include <iostream>
#include <queue>
#include <unordered_set>
using namespace std;

void bfsTraversal(int adjacencyList[][2], int numVertices, int source) {
   bool visited[numVertices + 1] = {false};
   int distances[numVertices + 1] = {0};

   queue<int> vertices;
   vertices.push(source);
   visited[source] = true;

   while (!vertices.empty()) {
      int node = vertices.front();
      cout << node << ", ";
      vertices.pop();

      for (int i = 0; i < 2; i++) {
         int next = adjacencyList[node][i];
            
         if (!visited[next]) {
            vertices.push(next);
            distances[next] = distances[node] + 1;
            visited[next] = true;
         }
      }
   }
}

int main() {
    int adjacencyList[][2] = {{0, 0}, {1, 2}, {3, 4}, {0, 0}, {0, 0}};
    int numVertices = 4;
    int source = 2;

    bfsTraversal(adjacencyList, numVertices, source);

    return 0;
}

輸出

2,3,4,0

範例

#include <iostream>
#include <vector>
using namespace std;

void bfsTraversal(vector<vector<int>>& adjacencyList, int N, int source) {
    vector<bool> visited(N + 1, false);
    vector<int> distances(N + 1, 0);
    vector<int> vertices;

    vertices.push_back(source);
    visited[source] = true;

    int curr = 0;
    while (curr < vertices.size()) {
        int node = vertices[curr];
        cout << node << ", ";

        for (int i = 0; i < adjacencyList[node].size(); i++) {
            int next = adjacencyList[node][i];

            if (!visited[next]) {
                vertices.push_back(next);
                distances[next] = distances[node] + 1;
                visited[next] = true;
            }
        }

        curr++;
    }

    cout << "\nDistances from source " << source << ":\n";
    for (int i = 1; i <= N; i++) {
        cout << "Node " << i << ": " << distances[i] << endl;
    }
}

int main() {
    int N = 8;
    vector<vector<int>> adjacencyList(N + 1);
    adjacencyList[0] = {1, 2};
    adjacencyList[1] = {2};
    adjacencyList[2] = {0, 3};
    adjacencyList[3] = {3};
    adjacencyList[4] = {5};
    adjacencyList[5] = {6, 7};
    adjacencyList[6] = {};
    adjacencyList[7] = {};
    adjacencyList[8] = {};

    int source = 5;

    bfsTraversal(adjacencyList, N, source);

    return 0;
}

輸出

5, 6, 7, 
Distances from source 5:
Node 1: 0
Node 2: 0
Node 3: 0
Node 4: 0
Node 5: 0
Node 6: 1
Node 7: 1
Node 8: 0

結論

本文對不使用行資訊結構的廣度優先查找 (BFS) 計算進行了說明。 BFS 計算通常用於從給定的來源中心開始以逐級方式導覽圖表。通常,一條線路用於儲存要前往的樞紐。無論如何,本文研究了一種可選方法,該方法利用基本清單或叢集來儲存下一層的集線器。

這種選擇性的使用完成了圖表的廣度優先研究。本文追溯了 BFS 計算的步驟,例如初始化傳染性記錄、維護 go-to 和分離簇以及使用圓圈來強調中心層級。它還提供了 C 代碼說明,說明了不使用一行的 BFS 遍歷。該程式碼準確地研究圖表,列印 BFS 遍歷排列,並計算從來源集線器到所有其他節點的距離。總的來說,本文在不使用線條的情況下對 BFS 計算進行了清晰的說明和可行的用法,展示了一種以廣度優先的方式導航圖表的可選方法。

以上是廣度優先搜尋不使用隊列的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:tutorialspoint.com。如有侵權,請聯絡admin@php.cn刪除