【JavaScript 算法】廣度優先搜索:層層推進的搜索策略

在這里插入圖片描述

🔥 個人主頁:空白詩

在這里插入圖片描述

文章目錄

    • 一、算法原理
    • 二、算法實現
    • 三、應用場景
    • 四、優化與擴展
    • 五、總結

在這里插入圖片描述

廣度優先搜索(Breadth-First Search, BFS)是一種用于遍歷或搜索圖或樹數據結構的算法。該算法從起始節點開始,逐層向外擴展,直到找到目標節點或遍歷完所有節點。本文將詳細介紹廣度優先搜索算法的原理、實現及其應用。


一、算法原理

廣度優先搜索的基本思想是從起始節點開始,先訪問所有相鄰節點,然后再依次訪問這些相鄰節點的相鄰節點,以此類推,層層推進。其基本步驟如下:

  1. 從起始節點開始,將其標記為已訪問,并加入隊列。
  2. 當隊列不為空時,取出隊列的頭節點,訪問該節點的所有相鄰節點。
  3. 對于每個相鄰節點,如果未被訪問過,將其標記為已訪問并加入隊列。
  4. 重復步驟2和3,直到隊列為空或找到目標節點。

在這里插入圖片描述


二、算法實現

以下是廣度優先搜索的JavaScript實現:

/*** 廣度優先搜索算法* @param {Object} graph - 圖的鄰接表表示* @param {string} start - 起始節點*/
function breadthFirstSearch(graph, start) {const queue = [start]; // 初始化隊列,將起始節點加入隊列const visited = new Set(); // 用于記錄已訪問的節點visited.add(start); // 將起始節點標記為已訪問while (queue.length > 0) {const node = queue.shift(); // 取出隊列的頭節點console.log(node); // 訪問節點// 訪問當前節點的所有相鄰節點for (const neighbor of graph[node]) {// 如果相鄰節點未被訪問過,將其標記為已訪問并加入隊列if (!visited.has(neighbor)) {visited.add(neighbor);queue.push(neighbor);}}}
}// 示例圖的鄰接表表示
const graph = {A: ['B', 'C'],B: ['D', 'E'],C: ['F'],D: [],E: ['F'],F: []
};// 調用廣度優先搜索算法
breadthFirstSearch(graph, 'A'); // 輸出: A B C D E F
  1. 函數定義與參數

    • breadthFirstSearch(graph, start):廣度優先搜索算法,接受圖的鄰接表表示和起始節點作為參數。
  2. 初始化隊列和已訪問節點集合

    • const queue = [start];:初始化隊列,將起始節點加入隊列。
    • const visited = new Set();:初始化已訪問節點集合,用于記錄已訪問的節點。
  3. 標記起始節點為已訪問

    • visited.add(start);:將起始節點標記為已訪問。
  4. 遍歷隊列中的節點

    • while (queue.length > 0):當隊列不為空時,繼續遍歷。
    • const node = queue.shift();:取出隊列的頭節點。
  5. 訪問節點并訪問其相鄰節點

    • console.log(node);:訪問節點,打印節點值。
    • for (const neighbor of graph[node]):遍歷當前節點的相鄰節點。
    • if (!visited.has(neighbor)):如果相鄰節點未被訪問過。
    • visited.add(neighbor);:將相鄰節點標記為已訪問。
    • queue.push(neighbor);:將相鄰節點加入隊列,等待后續遍歷。
  6. 示例圖和調用

    • 定義一個示例圖的鄰接表表示。
    • 調用breadthFirstSearch函數,進行廣度優先搜索,并輸出結果。

三、應用場景

  1. 最短路徑搜索
    廣度優先搜索可以用于在無權圖中尋找兩個節點之間的最短路徑。由于BFS逐層遍歷,第一次找到目標節點時,即可保證路徑是最短的。

  2. 連通性檢查
    BFS可以用于檢查圖的連通性,確定圖中是否存在路徑連接所有節點,并找出所有連通分量。

  3. 層次遍歷
    BFS在樹的層次遍歷中有重要應用,可以按層次順序訪問樹的節點。

  4. 求解迷宮問題
    在迷宮問題中,BFS可以用于尋找從起點到終點的最短路徑,通過逐層擴展,可以找到最短路徑解。


四、優化與擴展

  1. 記錄路徑
    在實際應用中,除了訪問節點外,還需要記錄從起始節點到每個節點的路徑,可以通過在隊列中存儲路徑信息來實現。
/*** 廣度優先搜索算法(記錄路徑)* @param {Object} graph - 圖的鄰接表表示* @param {string} start - 起始節點* @return {Object} - 每個節點的路徑*/
function breadthFirstSearchWithPath(graph, start) {const queue = [[start]]; // 初始化隊列,隊列中存儲路徑const visited = new Set(); // 用于記錄已訪問的節點visited.add(start); // 將起始節點標記為已訪問while (queue.length > 0) {const path = queue.shift(); // 取出隊列的頭路徑const node = path[path.length - 1]; // 獲取路徑中的最后一個節點console.log(node); // 訪問節點// 訪問當前節點的所有相鄰節點for (const neighbor of graph[node]) {// 如果相鄰節點未被訪問過,將其標記為已訪問并加入隊列if (!visited.has(neighbor)) {visited.add(neighbor);const newPath = [...path, neighbor]; // 創建新的路徑queue.push(newPath); // 將新路徑加入隊列}}}
}// 調用廣度優先搜索算法(記錄路徑)
breadthFirstSearchWithPath(graph, 'A');
  1. 雙向廣度優先搜索
    對于某些特殊場景,可以使用雙向廣度優先搜索,同時從起點和終點開始進行BFS,直到兩邊相遇,從而減少搜索空間,提高效率。

五、總結

廣度優先搜索(BFS)是一種用于遍歷或搜索圖或樹數據結構的有效算法。它通過逐層推進的方式,從起始節點開始,先訪問所有相鄰節點,然后再依次訪問這些相鄰節點的相鄰節點,以此類推,直到找到目標節點或遍歷完所有節點。廣度優先搜索算法實現簡單,適用于最短路徑搜索、連通性檢查、層次遍歷和求解迷宮問題等應用場景。


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/45679.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/45679.shtml
英文地址,請注明出處:http://en.pswp.cn/web/45679.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

小程序-2(WXML數據模板+WXSS模板樣式+網絡數據請求)

目錄 1.WXML數據模板 數據綁定 事件綁定 小程序中常用的事件 事件對象的屬性列表 target和currentTarget的區別 bindtap的語法格式 在事件處理事件中為data中的數據賦值 事件傳參與數據同步 事件傳參 bindinput的語法綁定事件 文本框和data的數據同步 條件渲染 w…

《向量數據庫指南》——使用 Grafana 和 Loki 搭建 Milvus Cloud日志查詢系統

本教程將介紹如何設置 Grafana 和 Loki 來有效監控您的 Milvus Cloud實例。 Milvus Cloud是一款分布式向量數據庫,可高效存儲、索引和管理萬億級 Embedding 向量,是搭建 AI 和 ML 應用的首選向量數據庫系統。 Grafana 是一個開源的指標監控平臺,提供可視化的指標和日志…

5,SSH 端口轉發

SSH 端口轉發 簡介 SSH 除了登錄服務器,還有一大用途,就是作為加密通信的中介,充當兩臺服務器之間的通信加密跳板,使得原本不加密的通信變成加密通信。這個功能稱為端口轉發(port forwarding)&#xff0c…

SpringCloud | 單體商城項目拆分(微服務)

為什么要進行微服務拆分? 在平常的商城項目中,我們一般的項目結構模塊都是將各種業務放在同一個項目文件夾,比如像: 用戶,購物車,商品,訂單,支付等業務都是放在一起,這樣…

thinkphp:數據庫多條件查詢

一、使用if條件限制查詢條件 $query Db::table(wip_operation_plan)->alias(d)->join([wip_jobs_all > a], a.wip_entity_name d.wip_entity_name)->join([sf_item_no > c], a.primary_itemc.item_no)->field(d.*,c.item_no as item_no,c.item_name as i…

線上觀看 3 萬+!「智能運維MeetUp」精彩回顧,探討智能體構建新方向

龍蜥社區“走進系列”第 11 期走進中興通訊-智能可觀測運維技術 MeetUp 于成都圓滿結束,由中興通訊聯合龍蜥社區系統運維聯盟(SOMA)(以下簡稱“聯盟”)共同舉辦。本次活動現場匯聚了阿里云、諧云科技、乘云數字、中興通…

MySQL數據庫day7.11

一,SQL概述 1.1 SQL語句語法 MySQL 數據庫的 SQL 語句不區分大小寫,關鍵字建議使用大寫, 以分號結尾。例如: SELECT * FROM user; 使用 /**/ 、 -- 、 # 的方式完成注釋 /* 多行注釋 */ -- 單行注釋 # 單行注釋 SELECT * FRO…

vue2 ant-design select組件自定義下拉框, dropdownRender 使用,以及遇到的坑

業務需求&#xff1a;下拉框需要滿足用戶可輸入篩選 和 點擊右側 字符按鈕 #A-Z進行用戶選擇 1、基礎頁面代碼 <div><a-selectstyle"width: 100%"placeholder"請選擇客戶"allow-clearshow-search:filter-option"false":not-found-con…

計算機硬件---如何更新自己電腦的BLOS

1找官網 例如“我使用的是HP&#xff08;惠普&#xff09;品牌的電腦”我只需要在瀏覽器上搜索“惠普官網”或“惠普-blos更新” 就可以看到&#xff0c;來自官網中更新blos的信息 2.有些品牌要查序列號該怎么辦呢&#xff1f; 有許多方法可以查詢&#xff0c;例如&#xf…

android13 frameworks里面常用的保存信息或者版本判斷的方法

總綱 android13 rom 開發總綱說明 目錄 1.前言 2. 數據庫 2.1 代碼讀取用法參考 3.prop 屬性配置 3.1 property的key值有哪些特點 4.區別 5. 其他數據存儲 6.彩蛋 1.前言 frameworks 不像我們一般開發app那樣,很多應用保存的方法都無法使用。這里記錄我們系統rom開…

Java性能優化-if-else簡化技巧

場景 Java性能優化-switch-case和if-else速度性能對比&#xff0c;到底誰快&#xff1f;&#xff1a; Java性能優化-switch-case和if-else速度性能對比&#xff0c;到底誰快&#xff1f;-CSDN博客 如果單純是做情景選擇&#xff0c;建議使用switch&#xff0c;如果必須使用i…

關于java的反射

???反射是啥呀相信許多學java的同學非常困惑在學的時候&#xff0c;總是感覺懂了卻又沒懂或者直接忽略過去了&#xff0c;那么本文就帶大家探討一下什么是反射在java中以及它的機制和運用。 ??什么是反射&#xff1a; 首先我們知道一些知識&#xff1a; 維基百科的解釋 …

武漢市集成電路領域重點產業鏈研究咨詢服務機構申報條件、時間

武漢市集成電路領域重點產業鏈研究咨詢服務機構公開遴選有關內容如下&#xff0c;武漢市的企業單位可以了解一下 一、采購內容 &#xff08;一&#xff09;項目名稱 武漢市集成電路領域重點產業鏈研究咨詢服務項目。 &#xff08;二&#xff09;項目內容 為進一步推動我市…

springboot項目 導入 maven坐標 錯誤 Could not transfer artifact XXX

1.報錯原因 當時導入的是 redis坐標 &#xff0c;導入jar 包報錯&#xff08;當時是網速太慢了&#xff0c;一直卡著不動 就關了 idea 重新下載&#xff09;結果報錯 之前的redis 項目都可以的&#xff0c;網上找了一下 都沒解決 2.解決辦法 既然說不能傳輸&#xff0c; 就說…

有用的工具

一、appuploader Appuploader home -- A tool improve ios develop efficiency such as submit ipa to appstore and manage ios certificate這是一款p12證書查看的工具&#xff0c; 需要建立一個apple ID專用密碼&#xff1a;Manage your Apple ID

redis其他類型和配置文件

很多博客只講了五大基本類型&#xff0c;確實&#xff0c;是最常用的&#xff0c;而且百分之九十的程序員對于Redis只限于了解String這種最常用的。但是我個人認為&#xff0c;既然Redis官方提供了其他的數據類型&#xff0c;肯定是有相應的考量的&#xff0c;在某些特殊的業務…

C++相關概念和易錯語法(22)(final、純虛函數、繼承多態難點)

1.final final在繼承和多態中都可以使用&#xff0c;在繼承中是指不想將自己被繼承&#xff0c;在多態中是指不想該函數被重寫&#xff0c;比較簡單&#xff0c;下面是一些使用例子。 2.純虛函數 當我們需要抽象一個類的時候&#xff0c;我們就需要用到純虛函數。所謂抽象的類…

C# 4.0 等待線程結束

在C#中&#xff0c;如果你正在使用多線程編程&#xff0c;并且想要等待一個或多個線程完成它們的工作再繼續執行&#xff0c;有幾種方式可以實現。從C# 4.0開始&#xff0c;雖然直接用于等待線程結束的特性&#xff08;如Thread.Join()&#xff09;在之前的版本中也已經存在&am…

升級版凱撒密碼加密解密器

目錄 開頭程序程序的流程圖程序加密與解密的效果例1加密的過程加密之后的文本 例2解密之后的文本解密之后的文本 例3加密之后的文本加密之后的文本 結尾 開頭 大家好&#xff0c;我叫這是我58。今天&#xff0c;我們來看一下我用C語言編譯的升級版凱撒密碼加密解密器和與之相關…

小程序 - - - - - 實現漸隱漸顯(監聽滾動距離版)

代碼如下&#xff1a; <!-- fixed-left --> <view class"fixed-box" animation"{{animationData}}">這里是漸隱漸顯的標簽 </view>.fixed-box {position: fixed;left: 0;top: 0;z-index: 999;background-color: #ccc;/* background-colo…