算法基本思想(結尾附上記憶口訣)

算法基本思想(結尾附上記憶口訣)

  • 貪心
  • 分治
  • 枚舉
  • 動態
  • 回溯
  • 遞歸(兄弟思想-遞推)

這篇文章說的這些思想網上一大堆,可以不看。直接關注結尾自創口訣,希望給你提供一點幫助。

遞歸

概述

在計算機科學中是指一種通過重復將問題分解為同類的子問題而解決問題的方法

特點

  1. 邊界條件
  2. 規模遞減

能解決的問題

  1. 數據的定義是按遞歸定義的。如Fibonacci函數。
  2. 問題解法按遞歸算法實現。如Hanoi問題。
  3. 數據的結構形式是按遞歸定義的。如二叉樹、廣義表等

遞歸解題的基本套路

  1. 明確這個函數的功能
  2. 遞推公式 自上而下的分析
  3. 補充到步驟1中定義的函數中
  4. 時間復雜度的計算

參考文獻

一文看懂什么遞歸(算法小結)
https://zhuanlan.zhihu.com/p/94748605
https://juejin.im/post/6844904008595816462

分治

概述

在計算機科學中,分治法是建基于多項分支遞歸的一種很重要的算法范式。字面上的解釋是"分而治之",就是把一個復雜的問題分成兩個或更多的相同或相似的子問題,直到最后子問題可以簡單的直接求解,原問題的解即子問題的解的合并

步驟

分解(將原問題分解成一系列子問題)
求解(遞歸的求解各子問題,若子問題足夠小,則直接求解)
合并(將子問題的解合并成原問題的解)

適用情況

如排序算法(歸并排序、快速排序)、傅立葉變換(快速傅立葉變換)

貪心

概述

又稱貪婪算法,是一種在每一步選擇中都采取在當前狀態下最好或最優(即最有利)的選擇,從而希望導致結果是最好或最優的算法。[1]比如在旅行推銷員問題中,如果旅行員每次都選擇最近的城市,那這就是一種貪心算法。
貪心算法在有最優子結構的問題中尤為有效。最優子結構的意思是局部最優解能決定全局最優解。簡單地說,問題能夠分解成子問題來解決,子問題的最優解能遞推到最終問題的最優解。
貪心算法與動態規劃的不同在于它對每個子問題的解決方案都做出選擇,不能回退。動態規劃則會保存以前的運算結果,并根據以前的結果對當前進行選擇,有回退功能。

貪心算法的基本思路

  1. 根據問題來建立數學模型,一般面試題會定義一個簡單模型;
  2. 把待求解問題劃分成若干個子問題,對每個子問題進行求解,得到子問題的局部最優解;
  3. 把子問題的局部最優解進行合并,得到最后基于局部最優解的一個解,即原問題的答案。

具有以下性質可以使用貪心算法
最優子結構
貪心選擇性質

適用情況

貪心法可以解決一些最優化問題,如:求圖中的最小生成樹、求哈夫曼編碼……對于其他問題,貪心法一般不能得到我們所要求的答案。一旦一個問題可以通過貪心法來解決,那么貪心法一般是解決這個問題的最好辦法。由于貪心法的高效性以及其所求得的答案比較接近最優結果,貪心法也可以用作輔助算法或者直接解決一些要求結果不特別精確的問題。在不同情況,選擇最優的解,可能會導致辛普森悖論(Simpson’s Paradox),不一定出現最優的解。

貪心算法在Data Science領域都被資泛應用,特別是金融工程。其中一個貪心算法例子就是Ensemble method

實例

最小生成樹、求哈夫曼編碼、活動選擇問題

回溯

概述

回溯法:有"通用的解題法"之稱,可以系統地搜索一個問題的所有解或任一解。在包含問題的所有解的解空間樹時,按照深度優先的策略,從根節點觸發搜索解空間樹。搜索至任一結點時,總是先判斷該結點是否肯定不包含問題的解,如果不包含,則跳過對以該結點為根的子樹的搜索,逐層向其祖先結點回溯;否則,進入該子樹,繼續按深度優先的策略進行搜索。

可以理解為先進行深度優先搜索,一直向下探測,當此路不通時,返回上一層探索另外的分支,重復此步驟,這就是回溯,意為先一直探測,當不成功時再返回上一層。

適用情況

實例

八皇后問題、迷宮類問題

枚舉

概述

枚舉算法的思想是:將問題的所有可能的答案一一列舉,然后根據條件判斷此答案是否合適,保留合適的,丟棄不合適的。

解題思路

確定枚舉對象、枚舉范圍和判定條件。
逐一列舉可能的解,驗證每個解是否是問題的解。

動態

概述

動態規劃在查找有很多重疊子問題的情況的最優解時有效。它將問題重新組合成子問題。為了避免多次解決這些子問題,它們的結果都逐漸被計算并被保存,從簡單的問題直到整個問題都被解決。因此,動態規劃保存遞歸時的結果,因而不會在解決同樣的問題時花費時間。
動態規劃只能應用于有最優子結構的問題。最優子結構的意思是局部最優解能決定全局最優解(對有些問題這個要求并不能完全滿足,故有時需要引入一定的近似)。簡單地說,問題能夠分解成子問題來解決。

適用情況

  1. 最優子結構性質。如果問題的最優解所包含的子問題的解也是最優的,我們就稱該問題具有最優子結構性質(即滿足最優化原理)。最優子結構性質為動態規劃算法解決問題提供了重要線索。
  2. 無后效性。即子問題的解一旦確定,就不再改變,不受在這之后、包含它的更大的問題的求解決策影響。
  3. 子問題重疊性質。子問題重疊性質是指在用遞歸算法自頂向下對問題進行求解時,每次產生的子問題并不總是新問題,有些子問題會被重復計算多次。動態規劃算法正是利用了這種子問題的重疊性質,對每一個子問題只計算一次,然后將其計算結果保存在一個表格中,當再次需要計算已經計算過的子問題時,只是在表格中簡單地查看一下結果,從而獲得較高的效率,降低了時間復雜度。

實例

0-1背包問題、最長公共子序列

記憶口訣

貪心小蔡,

分治灣灣,

人行

灣灣回歸

(關注:魯班曰)

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

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

相關文章

信息檢索技術如何改變了人們獲取知識的方式?

第一個肯定是改變了獲取信息的渠道,以前需要到圖書館,書籍,報紙,雜志等方式獲取信息,現在只需要通過上網搜索一下,就能獲取到信息,并且比自己查的更廣泛全面。當然,互聯網業帶來了海…

貪心刷題1-部分背包

題目來源:【深基12.例1】部分背包問題 - 洛谷 參考書目:《深入淺出程序設計競賽(基礎篇)》 解題思路:這道題是部分背包,如果金幣不能完整的放入是可以分割的。題目中有若干堆金幣,每堆金幣有一…

mac電腦使用pyinstaller打包python腳本

pyinstaller -F template.py 出現報錯"AssertionError: Executable contains code signature!" 移除簽名 codesign --remove-signature /Users/f7692281/PycharmProjects/TPtestlist/transmit_v6.0.py 打包命令 pyinstaller --windowed transmit_v6.0.py pyinst…

【js】事件循環之promise的async/await與setTimeout

什么是事件循環 事件循環又叫消息循環,是瀏覽器渲染主線程的工作方式。 瀏覽器開啟一個永不停止的for循環,每次循環都會從消息隊列中取任務,其他線程只需要在合適的時候將任務加入到消息隊列的末尾。 過去分為宏任務和微任務,現…

wordpress模板官網

移民wordpress主題 移民代辦wordpress主題,適合做海外移民咨詢的代理公司搭建wordpress企業官方網站使用。 https://www.jianzhanpress.com/?p5130 夏令營wordpress主題 綠色夏令營wordpress主題,適合做夏令營或戶外拓展的公司搭建wordpress官方網站…

D2587A高壓大電流DC-DC——專為反激式、升壓和正向轉換器應用而設計的單片集成電路

1、概述 D2587A穩壓器是專為反激式、升壓和正向轉換器應用而設計的單片集成電路。該器件提供四種不同的輸出電壓版本:3.3V、5V、12V 和可調節電壓。這些穩壓器需要的外部元器件很少,因此具有成本效益,并且易于使用。該電源開關是一款5A NPN器…

面試經典150題——最小棧

?Life is a journey, theres no right or wrong. 1. 題目描述 2. 題目分析與解析 2.1 思路一 看到題目的一瞬間,有沒有注意到 常數時間內檢索到最小元素的棧,那說明我們肯定需要把最小元素的下標存儲起來,這樣才能在常數時間內找到。 其…

網工學習 DHCP配置-接口模式

網工學習 DHCP配置-接口模式 學習DHCP總是看到,接口模式、全局模式、中繼模式。理解起來也不困難,但是自己動手操作起來全是問號。跟著老師視頻配置啥問題沒有,自己組建網絡環境配置就是不通,悲催。今天總結一下我學習接口模式的…

c++動態獲取工作路徑

最近在寫項目時遇到一個問題 pclrobot:~/cProject/projects/myPro/mpRPC$ ls autobuild.sh bin build CMakeLists.txt conf example lib log README.md src test如上所示,我的項目根目錄里有一個log文件夾和一個bin文件夾,我的需求是 bin目錄…

揭秘8.4k星開發者的秘密武器:it-tools在線工具集,你不可不知!

在IT的世界里,為了更好地發揮自己的才能,必須善用優秀的工具。深入挖掘IT-Tools的神奇力量,讓你的工作像魔法一般變得輕松高效!無論是自動化、監控還是問題解決,這些工具是我們事業成功的關鍵利器。選擇合適的IT工具&a…

PlantUML - 時序圖

時序圖主要內容 下面是一個簡單的時序圖,我們可以很容易并且美觀的表達我們的交互流程,只需要在箭頭的兩邊指定一個名字,加上描述即可: startuml bkloanapply -> bkloanapprove : request bkloanapprove --> bkloanapply :…

C++ map用法

int main() {void *p;str *st;st (str*)malloc(sizeof(str));st->a 23;st->b 24;p st;//使用void指針需強制類型轉換printf("%d\n%d\n",((str*)p)->a, ((str*)p)->b);free(st);map<char, int> mpci;mpci[m] 20;mpci.insert(pair<char, int…

#WEB前端(盒子模型)

1.實驗&#xff1a;盒子 2.IDE&#xff1a;VSCODE 3.記錄&#xff1a; margin&#xff08;外邊距&#xff09; border&#xff08;邊框&#xff09; padding&#xff08;內邊距&#xff09; 4.代碼&#xff1a; <!DOCTYPE html> <html lang"en"> &…

【C++】類與對象(static、explicit、友元、隱式類型轉換、內部類、匿名對象)

&#x1f308;個人主頁&#xff1a;秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343&#x1f525; 系列專欄&#xff1a;http://t.csdnimg.cn/eCa5z 目錄 再談構造函數 初始化列表 隱式類型轉換 explicit關鍵字 static成員 概念 計算程序中創建出了多少個類…

開源軟件的商業模式探析:開放與盈利的平衡

寫在開頭 開源軟件的概念和應用已經成為了現代科技領域中的一個重要組成部分。然而&#xff0c;雖然開源軟件的價值和影響力得到了廣泛認可&#xff0c;但如何在開放的環境中找到商業盈利的平衡卻是一個頗具挑戰性的問題。本文將深入探討開源軟件的商業模式&#xff0c;從基本…

力扣61:旋轉鏈表

題目 給你一個鏈表的頭節點 head &#xff0c;旋轉鏈表&#xff0c;將鏈表每個節點向右移動 k 個位置。 示例 1&#xff1a; 輸入&#xff1a;head [1,2,3,4,5], k 2輸出&#xff1a;[4,5,1,2,3] 示例 2&#xff1a; 輸入&#xff1a;head [0,1,2], k 4輸出&#xff1a;…

卷積神經網絡(CNN)原理與實現

卷積神經網絡(CNN) 卷積神經網絡原理卷積神經網絡的數學推導卷積層反向傳播算法數學推導卷積層實現代碼 卷積神經網絡(CNN) 卷積神經網絡原理 卷積神經網絡是一種用于圖像、語音、自然語言等數據的深度學習模型&#xff0c;其核心思想是使用卷積操作提取輸入數據的特征&…

4、通達OA代碼審計

一、文件操作 1、文件上傳配合文件包含審計 文件上傳首先確定存在漏洞的文件。和文件上傳相關的函數比如upload。在從上到下分析構造的條件1. 從 POST 請求中提取變量 P 的值。 2. 檢查 P 是否已設置且不為空字符串。 3. 如果 P 已設置且非空&#xff0c;進入包含 "inc/…

JavaScript定義函數,創建函數實例時的內部原理

1、定義一個函數&#xff0c;JavaScript內部各做了哪些事情 定義一個函數時&#xff0c;JavaScript內部執行了以下步驟&#xff1a; 解析函數聲明: 當你定義一個函數時&#xff0c;JavaScript的解析器會首先解析函數聲明。這意味著它會檢查函數聲明的語法是否正確&#xff0c;…

[NSSCTF 2nd]MyJs

做一題ejs原型鏈污染 首先是登錄界面 源碼里面提示了源碼的路由 js不熟先審計一下 const express require(express); #導入Express框架&#xff0c;用于構建Web應用程序的服務器和路由 const bodyParser require(body-parser); #導入body-parser中間件&#xff0c;用于解析…