【算法】遞歸、搜索與回溯算法入門

文章目錄

  • 遞歸
    • 什么是遞歸
    • 為什么會用到遞歸
    • 如何理解遞歸
    • 如何寫好一個遞歸
  • 搜索 vs 深度優先遍歷 vs 深度優先搜索 vs 寬度(廣度)優先遍歷 vs 寬度(廣度)優先搜索 vs 暴搜
    • 深度優先遍歷 vs 深度優先搜索(dfs)
    • 寬度(廣度)優先遍歷 vs 寬度(廣度)優先搜索(bfs)
    • 關系圖
    • 拓展搜索問題
  • 回溯和剪枝

遞歸

什么是遞歸

通俗來講,也就是函數自己調用自己的情況。像二叉樹的遍歷、快排算法、歸并算法等。

為什么會用到遞歸

本質:解決主問題的時候會衍生出相同的子問題,解決子問題的時候又衍生出相同的子問題。

主問題 -> 相同的子問題
子問題 -> 相同的子問題

一直往復…

如何理解遞歸

第一層次去理解:畫遞歸展開的細節圖
第二層次去理解:編寫和理解二叉樹中的題目
第三層次去理解:宏觀的看待遞歸的過程

我們要在第三層去理解:

  1. 不要在意遞歸的細節展開圖
  2. 把遞歸的函數當成一個黑盒(過程是怎么樣的不用管,看不到內部過程)
  3. 相信這個黑盒一定能夠完成這個任務

如何寫好一個遞歸

  1. 先找到相同的子問題!!!!!-> 決定了函數頭的設計
  2. 只關心某一個子問題是如何解決的 -> 函數體的書寫
  3. 注意一下遞歸函數的出口即可

把數據結構中二叉樹的題目,試著用第三層的方式去理解一下。

搜索 vs 深度優先遍歷 vs 深度優先搜索 vs 寬度(廣度)優先遍歷 vs 寬度(廣度)優先搜索 vs 暴搜

搜索其實就是把整個解空間遍歷一遍,本質就是暴力枚舉一遍所有的情況。也就是暴搜。

深度優先遍歷 vs 深度優先搜索(dfs)

通俗理解:一條道走到黑,走到不能再走時返回,遇到分支,和前面一樣的操作。

遍歷是形式,搜索是目的。所以他們兩可以理解為一個東西。

寬度(廣度)優先遍歷 vs 寬度(廣度)優先搜索(bfs)

通俗理解:一層一層剝開,也就是一層一層的去遍歷。

遍歷是形式,搜索是目的。所以他們兩可以理解為一個東西。

關系圖

在這里插入圖片描述

拓展搜索問題

全排列問題:就是高中數學學的排列組合的問題,比如1,2,3,有哪幾種排列方式。如果數少還能列的出來,但是數一多就很容易一漏掉一些情況。

樹狀圖 (決策樹)
在這里插入圖片描述

注意:不要局限于認為只有二叉樹和圖這些問題才能使用dfs和bfs,只要整個問題能用決策樹的方式畫出來的話,就能使用。

回溯和剪枝

回溯其實就是深搜里的一個小分支。
在這里插入圖片描述

簡單理解一下回溯,就是嘗試某種情況的時候,發現走不通,返回到上一級的這個操作。也就是圖中紅色按1走的然后返回到紅點的過程。
再簡單理解一下剪枝,就是按1返回到紅點后再走到按2走,發現行不通再返回到紅點,此時往上往下都有路線,但是往上走已經嘗試過了,不用再走了。其實就是在分叉路口有兩種選擇的時候,但是我們已經明確知道了其中一個選擇不是我們最終想要的結果的時候,我們就把這個結果給略過。

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

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

相關文章

借助Aspose.HTML控件,在 Python 中將 SVG 轉換為 PDF

您可能會發現許多解決方案都提供以編程方式將SVG轉換為PDF 的功能。但這篇博文將介紹一個功能強大的 SDK,供 Python 開發人員自動化文件轉換和操作。本指南將重點介紹通過 .NET 實現 Python 的 Aspose.HTML。此外,我們將逐步講解相關步驟和代碼片段&…

高級06-Java網絡編程:從Socket到HTTP

引言:Java 網絡編程的重要性 隨著互聯網技術的飛速發展,網絡編程已成為現代軟件開發中不可或缺的一部分。Java 作為一種廣泛應用于企業級開發和分布式系統的編程語言,提供了強大的網絡通信支持。從底層的 Socket 編程到高層的 HTTP 協議處理&…

STM32的藍牙通訊(HAL庫)

藍牙基礎知識(了解即可):1.是一種利用低功率無線電,支持設備短距離通信的無線電技術,能在包括移動電話、PDAQ、無線耳機、筆記本電腦、相關外設等眾多設備之間進行無線信息交換,藍牙工作在全球通用的2.4 GH…

方案B,version1

我們重新設計起步階段的步驟,目標是:通過運行PowerShell腳本和配置GitHub Actions工作流(deploy.yml)來實現自動化部署。 要求: 用私有倉庫(my-website-source-SSH)存儲源碼。 通過GitHub Actions自動構建(這里只是簡單的Hello World,所以構建步驟可以簡化為復制文件…

Linux --- 進程

一、進程概念 在 Linux 系統中,??進程(Process)?? 是程序執行的動態實例,是操作系統進行資源分配和調度的基本單位。 ??1. 程序 vs 進程?? ??程序(Program)??:是靜態的代碼集合&…

Cgroup 控制組學習(三)在容器中使用 CGroups

一、CGroups 關于mememory的限制操作 cgroup關于cpu操作 關于memeory cgroup的幾個要點 ① memeory限額類 1、memory.limit_bytes:硬限制--> 限制最大內存使用量,單位有k、m、g三種,填-1則代表無限制,默認是字節2、memory.soft_limi…

SpringBoot面試基礎知識

SpringBoot 是面試中后端開發崗位的高頻考點,以下是核心考點整理:1. SpringBoot 基礎概念- 定義:SpringBoot 是 Spring 框架的簡化版,通過“自動配置”“起步依賴”等特性,簡化 Spring 應用的搭建和開發,減…

Java面試全方位解析:從基礎到AI的技術交鋒

Java面試全方位解析:從基礎到AI的技術交鋒 面試場景:互聯網大廠Java工程師崗位面試 面試官:您好,我是今天的面試官,接下來我們將進行三輪技術面試。 謝飛機:您好您好!我是謝飛機,特別…

Web Worker:解鎖瀏覽器多線程,提升前端性能與體驗

目錄 一、Web Worker 是什么? 核心特性 類型 二、為什么需要 Web Worker?(單線程的痛點) 三、Web Worker 的典型使用場景 四、一個簡單的代碼示例 (專用 Worker) 五、使用 Web Worker 的注意事項 六、總結 一、Web Worker 是什么? 簡…

LabVIEW命令行調用與傳參功能

該功能一方面借助 Formatinto String 構建命令行字符串,實現LabVIEW 環境下命令行調用 VI 并傳參;另一方面,針對 Mac 平臺,通過解析應用 Info.plist 文件,處理 LabVIEW 可執行文件路徑,完善跨平臺命令行調用…

使用FRP搭建內網穿透工具,自己公網服務器獨享內外網端口轉發

內網穿透,也即 NAT 穿透,進行 NAT 穿透是為了使具有某一個特定源 IP 地址和源端口號的數據包不被 NAT 設備屏蔽而正確路由到內網主機。簡單來說,就是讓互聯網(外網)設備能訪問局域網(內網)設備提…

JavaWeb01——基礎標簽及樣式(黑馬視頻筆記)

1.如何用VScode寫html代碼 1. 首先在vscode上安裝一些插件,插件如下: 2.打開你要寫入的html文件的文件夾,然后右擊“ 新建文件”,命名 “xxx.html”, 3.如果是寫 css文件,那么也是右擊“新建文件”,命名“x…

在2G大小的文件中,找出高頻top100的單詞

將 2GB 的大文件分割為 2048 個大小為 512KB 的小文件,采用流式讀取方式處理,避免一次性加載整個文件導致內存溢出。初始化一個長度為 2048 的哈希表數組,用于分別統計各個小文件中單詞的出現頻率。利用多線程并行處理機制遍歷所有 2048 個小…

基于LNMP分布式個人云存儲

1.準備工作a.關閉兩臺虛擬機的安全軟件客戶端:[rootmaster ~]# systemctl stop firewalld [rootmaster ~]# systemctl disable firewalld [rootmaster ~]# systemctl status firewalld ○ firewalld.service - firewalld - dynamic firewall daemonLoaded: loaded (…

指針運算全攻略:加減、比較與排序

常見的指針指針運算說明1.指針與整數的加減運算對指針可以進行加法運算&#xff0c;即p n或者p - n。其結果依舊是一個是一個指針&#xff0c;新的指針是在原來的地址值基礎上加上/減去n *(sizeof(指針指向的數據類型)&#xff09;個字節。示例&#xff1a;#include<stdio.…

物聯網安裝調試-物聯網網關

物聯網網關作為連接終端設備與云平臺的核心樞紐,其分類與選型需結合功能定位、硬件性能、連接方式及應用場景等多維度考量。以下從分類體系和產品推薦兩方面系統梳理,助您高效決策: ?? 一、物聯網網關分類體系 1. 按功能定位劃分 類型 核心能力 典型場景 代表產品 邊緣計…

Jenkins教程(自動化部署)

Jenkins教程(自動化部署) 1. Jenkins是什么&#xff1f; Jenkins是一個開源的、提供友好操作界面的持續集成(CI)工具&#xff0c;廣泛用于項目開發&#xff0c;具有自動化構建、測試和部署等功能。Jenkins用Java語言編寫&#xff0c;可在Tomcat等流行的servlet容器中運行&…

linux 驅動驗證是否成功 之 查看moudle信息

這些是 Linux 內核模塊&#xff08;.ko&#xff09;中的元信息&#xff08;metadata&#xff09;&#xff0c;可以通過如下方式查看&#xff1a;? 1. 使用 modinfo 命令查看已加載或已編譯模塊信息 示例&#xff1a; modinfo aw2013.ko輸出內容大概如下&#xff1a; filename:…

瀏覽器關閉之前請求接口到后端

2025.07.24今天我學習了如何在瀏覽器關閉之前請求一個接口返回到后端。可以用performance.navigation判斷是瀏覽器關閉&#xff0c;還是瀏覽器刷新&#xff0c;因為我這邊只需要瀏覽器關閉的時候才去觸發1. 利用performance API&#xff08;刷新檢測&#xff09; 刷新頁面時&am…

MySQL批量數據處理與事務管理

MySQL是一種廣泛應用的關系型數據庫管理系統&#xff0c;尤其在數據分析和業務邏輯處理方面具有重要地位。在數據量龐大的業務場景中&#xff0c;批量數據處理和事務管理是提高效率和保障數據一致性的重要手段。掌握高效的批量數據操作方法與事務管理技巧&#xff0c;不僅能夠提…