【遞歸搜索回溯專欄】前言與本專欄介紹

本專欄內容為:遞歸,搜索與回溯算法專欄。 通過本專欄的深入學習,你可以了解并掌握算法。

💓博主csdn個人主頁:小小unicorn
?專欄分類:遞歸搜索回溯專欄
🚚代碼倉庫:小小unicorn的代碼倉庫🚚
🌹🌹🌹關注我帶你學習編程知識

前言

  • 遞歸
    • 什么是遞歸
    • 為什么會用到遞歸
    • 如何理解遞歸
    • 怎樣寫好遞歸
  • 搜索
    • 深度優先/寬度優先
    • 關系圖
    • 拓展搜索
  • 回溯與剪枝

遞歸

什么是遞歸

在講解遞歸前,我們首先要知道什么是遞歸:
遞歸我們之前是接觸過的:
在c語言中我們詳細學過遞歸,數據結構中的快排,二叉樹也用到了遞歸。

簡單來說,遞歸就是函數自己調用自己。

為什么會用到遞歸

那么為什么會用到遞歸呢?
舉兩個例子:
例子一
在這個二叉樹中:我們用前序遍歷來遍歷這個樹:
在這里插入圖片描述
先訪問藍色節點,然后將這個樹分為左子樹和右子樹:
在這里插入圖片描述
在左子樹中,我們繼續根據前序遍歷(根左右)進行劃分:

在這里插入圖片描述
依次內推:將這個樹不停的劃分成:根,左子樹,右子樹。

我們的主問題是根左右,而子問題也是根左右,子問題的子問題的也是根左右。子問題是相同的。

例子二
我們復習一下快排:
在這里插入圖片描述
找一個key,將數組從key位置劃分為左右兩個部分,讓這兩個左右部分排序。而讓左右兩個部分排序,又可以進行劃分,在左右兩個數組繼續用Key進行劃分:
在這里插入圖片描述
依次內推:不停的劃分,知道最后不停劃分為兩個元素后大小就很好比較。

這個例子我們也可以發現主問題是通過key將數組劃分為兩部分,而子問題也是通過key將數組劃分為兩部分,子問題的子問題也是通過key將數組劃分為兩部分。

通過這兩個例子,我們想告訴遞歸的本質:
遞歸的本質其實就是重復的子問題,也就是說主問題可以劃分成一個跟主問題相同的子問題
在這里插入圖片描述

如何理解遞歸

那么如何理解遞歸?
這里給出兩點:

  1. 遞歸展開
  2. 宏觀看待遞歸的過程

想要理解遞歸,就要畫一下遞歸的展開圖,將遞歸通過展開圖展開,會很明顯看到遞歸相關細節:返回條件,如何遞歸

其次我們要宏觀看待一個遞歸得到過程:
具體分一下幾步:

  1. 不要在意遞歸的細節展開圖
  2. 把遞歸的函數當成一個黑盒
  3. 相信這個黑盒一定能把這件事做好

就比如我們的二叉樹后序遍歷:

在這里插入圖片描述
首先我們要通過根節點來進行遍歷,黑盒裝什么呢?
我們知道后序是:左->右->根
那么我們就堅信dfs(root->left)一定能幫我們實現進行左子樹的遍歷,dfs(root->right)一定能幫我們實現進行右子樹的遍歷
這就相當于是我們的黑盒。

但是還要注意一個細節:
為了防止進行死循環,我們要寫一個出口(也就是返回條件)

怎樣寫好遞歸

有了上面的經驗,怎樣寫好遞歸就很簡單:

  1. 先找到相同子問題(這就是我們函數頭的設計)
  2. 只關心某一個問題是如何來的(這就涉及到函數體的書寫)
  3. 注意細節:遞歸函數出口防止死循環
    在這里插入圖片描述

搜索

深度優先/寬度優先

首先要知道什么是深度優先,什么是寬度優先:
深度優先:深度優先就是一條道走到黑,我們也叫DFS,通常用遞歸實現。
在這里插入圖片描述
跟二叉樹遍歷一樣,從根開始,一直往下走,知道左子樹最后一個節點走完不能再走了就往上走。

寬度優先:寬度就是一層一層的剝開,我們也叫BFS,通常借助隊列實現。
在這里插入圖片描述
就比如還是二叉樹遍歷,我們一層一層的進行遍歷,將每一層遍歷出來。

在這里插入圖片描述
那么深度優先遍歷和深度優先搜索又有什么區別呢?
其實遍歷和搜索大致是一樣的,記住一點:遍歷知識形式,就比如二叉樹遍歷只是根據規則進行遍歷,而搜索是遍歷里面的值,因此也叫搜索。

關系圖

其實搜索也叫暴搜,暴搜顧名思義就是暴力枚舉一遍所有的情況。
在這里插入圖片描述

拓展搜索

其實我們之前學過的全排列就是一個搜索問題。

以123三個數的全排列為例,我們高中就學過,要想枚舉出全部的結果,用樹狀能很清晰的表達出來:
在這里插入圖片描述
通過樹狀這樣畫出來就不會漏解的情況。

這棵樹我們也把它叫做決策樹。

回溯與剪枝

什么是回溯,什么是剪枝,其實他們兩的本質也還是搜索!!!
回溯還是以二叉樹遍歷為例:

在這里插入圖片描述
當遍歷到左子樹的最左節點,他的左子樹為空,那么就要返回,而這個返回的過程就是回溯。

以這個迷宮為例子:

在這里插入圖片描述
第一段紅線走到盡頭發現走不掉了,往回走的過程就是回溯。

根據暴搜原理,會一直往右走,走到盡頭,向上走,走到盡頭發現到頭了,就往回走,然后往左走,往右走,依次內推。在這個過程中,有一段是沒有必要走的路段(沒有價值的路段),在本圖中是畫叉的路段,這個畫叉的路段我們就可以舍去,舍去的過程就是剪枝。

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

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

相關文章

分享6個解決msvcp110.dll丟失的方法,全面解析msvcp110.dll文件

msvcp110.dll 是一個動態鏈接庫 (DLL) 文件,屬于 Microsoft Visual C 庫的一部分,具體來說是 Microsoft Visual C 2012 版本的運行時組件。這個 DLL 文件包含了在 Windows 環境下運行用 C 編寫的程序所必需的一些函數和資源。當一個應用程序是使用 Visua…

視頻拉流推流技術梳理

概況 視頻的整個流程主要分為推流和拉流 攝像頭場景: 攝像頭捕捉視頻畫面,推流到服務器,服務器分發到CDN, 客戶端從CDN地址拉流,客戶端進行播放 直播場景: 主播通過手機,電腦等客戶端&…

G8-ACGAN理論

本文為🔗365天深度學習訓練營 中的學習記錄博客 原作者:K同學啊|接輔導、項目定制 我的環境: 1.語言:python3.7 2.編譯器:pycharm 3.深度學習框架Pytorch 1.8.0cu111 一、對比分析 前面的文章介紹了CGAN&#xf…

java基礎(4)注解,集合,

注解 什么是注解(Annotation)?注解是放在Java源碼的類、方法、字段、參數前的一種特殊“注釋” // this is a component: Resource("hello") public class Hello {Injectint n;PostConstructpublic void hello(Param String name…

經典文獻閱讀之--CamMap(基于SLAM地圖對不共視相機進行外參標定)

0. 簡介 由于多相機之間通常存在有限或無重疊的視場,因此在估計外參相機參數時面臨著一定的挑戰,為了解決這個問題,本文提出了CamMap:一種新穎的6自由度外參標定流程。根據三個操作規則,使一個多相機系統單獨捕捉一些…

【Linux進程】進程狀態(運行阻塞掛起)

目錄 前言 1. 進程狀態 2. 運行狀態 3. 阻塞狀態 4. 掛起狀態 5. Linux中具體的狀態 總結 前言 在Linux操作系統中,進程狀態非常重要,它可以幫助我們了解進程在系統中的運行情況,從而更好地管理和優化系統資源,在Linux系統中&am…

【Python筆記-設計模式】迭代器模式

一、說明 迭代器模式是一種行為設計模式,讓你能在不暴露集合底層表現形式(列表、棧和樹等)的情況下遍歷集合中所有的元素。 (一) 解決問題 遍歷聚合對象中的元素,而不需要暴露該對象的內部表示 (二) 使用場景 需要對聚合對象…

SpringBoot實現短鏈跳轉

目錄 1.背景介紹 2.短鏈跳轉的意義 3.SpringBoot中的代碼實現 1.建議短鏈-長鏈的數據庫表:t_url_map: 2.映射實體 3.Dao層實現 4.Service層實現 5.Controller層實現 3.結果測試 4.問題 1.背景介紹 短鏈跳轉是一種通過將長鏈接轉換為短鏈接的方式&…

南方電網的能源棋局上,蔚來換電扮演什么角色?

2 月 26 日,南網儲能科技與蔚來能源簽署協議,將充換電站、儲能站、可調負載等聚合資源連接到虛擬電廠平臺,推動換電站作為分布式儲能在虛擬電廠項目上的應用。 蔚來換電站是國內首個智慧微電網型分布式換電設施,可透過換電訂單預…

軟考-系統集成項目管理中級-信息系統建設與設計

本章重點考點 1.信息系統的生命周期 信息系統建設的內容主要包括設備采購、系統集成、軟件開發和運維服務等。信息系統的生命周期可以分為四個階段:立項、開發、運維和消亡。 2.信息系統開發方法 信息系統常用的開發方法有結構化方法、原型法、面向對象方法等 1)結構化方法 …

AI智能分析網關V4:抽煙/打電話/玩手機行為AI算法及場景應用

抽煙、打電話、玩手機是人們在日常生活中常見的行為,但這些行為在某些場合下可能會帶來安全風險。因此,對于這些行為的檢測技術及應用就變得尤為重要。今天來給大家介紹一下TSINGSEE青犀AI智能分析網關V4抽煙/打電話/玩手機檢測算法及其應用場景。 將監控…

java項目打包運行報異常:xxxxx-1.0-SNAPSHOT.jar中沒有主清單屬性

pom.xml中加入這段話即可 <build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>2.4.4</version><executions><execution><…

安泰ATA-7050高壓放大器在微流控細胞分選中的應用

微流控細胞分選是一種用于分離和鑒定生物樣本中特定類型細胞的技術&#xff0c;其原理基于將生物細胞通過微通道進行操縱和區分。微流控細胞分選的原理主要基于流體力學、電氣學、光學和熱力學等多學科的交叉應用。通過設計具有特定尺寸和性質的微通道網絡&#xff0c;可實現對…

RV1126芯片概述

RV1126芯片概述 前言1 主要特性2 詳細參數 前言 1 主要特性 四核 ARM Cortex-A7 and RISC-V MCU250ms快速開機2.0Tops NPU14M ISP with 3幀 HDR支持3個攝像頭同時輸入4K H.264/H.265 視頻編碼和解碼 2 詳細參數

萬人在線直播:構建高效穩定的音視頻架構

萬人在線大型直播音視頻架構解析 隨著網絡技術的發展,大型直播已成為人們生活中不可或缺的一部分。萬人在線直播音視頻架構是實現高清、流暢直播的關鍵。本文將深入探討這一架構的核心組成部分及其運作機制。 直播客戶端作為架構的基石,負責音視頻數據的采集、編碼、推流、…

永磁同步電機無感FOC(龍伯格觀測器)算法技術總結-仿真篇

文章目錄 1、觀測器的引入2、β軸向下的電機觀測器數學模型3、β軸向下的轉子點角度及速度觀測4、Simulink仿真模型搭建4.1模型總覽4.2 Luenberger觀測器模塊4.2.1 I_alpha觀測4.2.2 I_beta觀測4.2.3 e_alpha、e_beta觀測4.2.4 鎖相環 4.3 速度設定4.4 速度觀測結果4.5 電角度觀…

express+mysql+vue,從零搭建一個商城管理系統6--數據校驗和登錄

提示&#xff1a;學習express&#xff0c;搭建管理系統 文章目錄 前言一、修改models/user.js二、修改routes下的user.js三、Api新建user/login接口四、刪除數據庫原有數據&#xff0c;添加新驗證規則的用戶四、用戶登錄總結 前言 需求&#xff1a;主要學習express&#xff0c;…

SQL數學函數--pow(),abs() 函數 全面且詳細

一、冪運算函數: pow 語法: pow(double a, double p) 返回值: double 說明:返回a的p次冪 舉例&#xff1a; hive> select pow(2,4) ; 16.0 ???????二、絕對值函數: abs 語法: abs(double a) abs(int a) 返回值: double int 說明:返回數值a的絕對值 …

MacBook將iPad和iPhone備份到移動硬盤

#創作靈感# 一個是ICloud不夠用&#xff0c;想備份到本地&#xff1b;然而本地存儲不夠用&#xff0c;增加容量巨貴&#xff0c;舍不得這個錢&#xff0c;所以就想著能不能備份到移動硬盤。剛好有個移動固態&#xff0c;所以就試了一下&#xff0c;還真可以。 #正文# 說一下邏…

《PyTorch深度學習實踐》第八講加載數據集

一、 1、DataSet 是抽象類&#xff0c;不能實例化對象&#xff0c;主要是用于構造我們的數據集 2、DataLoader 需要獲取DataSet提供的索引[i]和len;用來幫助我們加載數據&#xff0c;比如說做shuffle(提高數據集的隨機性)&#xff0c;batch_size,能拿出Mini-Batch進行訓練。它…