如何設計演算法?常見的演算法範式介紹
如何設計演算法?下面這篇文章來跟大家分析一下常見的演算法範式。有一定的參考價值,有需要的朋友可以參考一下,希望對大家有幫助。
先明確三個概念:
演算法: 依步驟解決問題的過程。
範式: 思考問題的模式。
演算法範式: 為問題建立高效解決方案的常規方法。
本文討論一些常用的演算法範式,例如
- 分治演算法
- 動態規劃
- 貪婪演算法
- 動態規劃
在排序演算法中,合併和快速排序這兩種演算法的共同點就是分而治之的演算法。
分而治之
是一種常見的演算法設計,它的思路是把問題分解為與原始問題相似的較小子問題。通常以遞歸方式解決子問題,並結合子問題的解決方案來解決原始問題。- 分治法的邏輯可以分為三個步驟:
- 將原始問題分成較小的子問題。
- 透過遞歸解決子問題,解決完畢之後返回子問題的解決方案。
將子問題的解決方案合併為原始問題的解決方案。
分治法的例子:二元搜尋function binarySearchRecursive(array, value, low, high) { if (low <= high) { const mid = Math.floor((low + high) / 2); const element = array[mid]; if (element < value) { return binarySearchRecursive(array, value, mid + 1, high); } else if (element > value) { return binarySearchRecursive(array, value, low, mid - 1); } else { return mid; } } return null; } export function binarySearch(array, value) { const sortedArray = quickSort(array); const low = 0; const high = sortedArray.length - 1; return binarySearchRecursive(array, value, low, high); }
以下是用分治實現的二元搜尋。 binarySearch
binarySearchRecursive
函數是供他人呼叫的,而
是實現分治法的地方。動態規劃法動態規劃
是一種最佳化技術,用於透過把複雜問題分解為較小的子問題來解決。看起來很像是分治法,但動態規劃不是把問題分解為獨立的子問題然後再組合在一起,而是只把問題分解為獨立的
子問題。- 演算法邏輯分為三個步驟: 定義子問題。 重複解決子問題。
辨識並解決基本問題。
動態規劃案例:最小硬幣找零問題function minCoinChange(coins, amount) { const cache = []; const makeChange = (value) => { if (!value) { return []; } if (cache[value]) { return cache[value]; } let min = []; let newMin; let newAmount; for (let i = 0; i < coins.length; i++) { const coin = coins[i]; newAmount = value - coin; if (newAmount >= 0) { newMin = makeChange(newAmount); } if (newAmount >= 0 && (newMin.length < min.length - 1 || !min.length) && (newMin.length || !newAmount)) { min = [coin].concat(newMin); } } return (cache[value] = min); } return makeChange(amount); }
這是一個名為為硬幣找零問題的常見面試題。硬幣找零問題是給定找零的金額,找出可以用多少特定數量的硬幣來找零的方式。最小硬幣找零問題只是找到使用給定面額的錢所需的最少硬幣數量。例如,如果需要找零 3 毛 7 分,則可以使用 1 個 2 分,1個 5 分,1 個 1 毛錢和1個 2 毛錢。 coins
cache
makeChange
在上面的程式碼中,參數 cache
表示面額(在人民幣中為 [1, 2, 5, 10, 20, 50])。為了防止重複計算,用到了一個
console.log(minCoinChange([1, 2, 5 10, 20], 37)); // => [2, 5, 10, 20] console.log(minCoinChange([1, 3, 4], 6)) // => [3, 3]
。
貪心演算法
貪心演算法
與當前的最優解決方案相關,並試圖找到一個全局的最佳方案。與動態規劃不同,它不考慮全局。貪心演算法傾向於簡單直觀,但可能不是整體最優的解決方案。 貪心演算法案例:最小硬幣找零問題function minCoinChange(coins, amount) { const change = []; let total = 0; for (let i = coins.length; i>= 0; i--) { const coin = coins[i]; while (total + coin <= amount) { change.push(coin); total += coin; } } return change; }
上面用動態規劃解決的硬幣問題也可以用貪心演算法解決。這個解的是否能得到最優解取決於所採用的面額。
console.log(minCoinChange([1, 2, 5 10, 20], 37)); // => [2, 5, 10, 20] console.log(minCoinChange([1, 3, 4], 6)) // => [4, 1, 1]
可以看到,貪心演算法比動態規劃的方案簡單許多。下面看一下同樣的求解案例,來了解兩者之間的差異:[3,3]
貪心演算法給出了第一個問題的最優解,但第二個並不是最優解(應該是
)。 貪心演算法比動態規劃演算法簡單且更快,但是得到的有可能不是最優解。回溯演算法
- 回溯演算法
- 非常適合逐步尋找和建立解決方案。
- 嘗試以一種方式解決問題。
如果它不起作用,就回溯並重複步驟 1,直到找到合適的解決方案為止。
對於回溯演算法,我會另寫一篇文章來介紹更複雜的演算法。究竟寫什麼我還沒想好,也許是寫一個對數獨求解的程序,如果你對這個感興趣,請關注我的公眾號!演算法是永無止境的,希望這篇文章能幫你了解一些常見的演算法範式。 相關免費學習推薦:
js影片教學
以上是如何設計演算法?常見的演算法範式介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

寫在前面&筆者的個人理解目前,在整個自動駕駛系統當中,感知模組扮演了其中至關重要的角色,行駛在道路上的自動駕駛車輛只有通過感知模組獲得到準確的感知結果後,才能讓自動駕駛系統中的下游規控模組做出及時、正確的判斷和行為決策。目前,具備自動駕駛功能的汽車中通常會配備包括環視相機感測器、光達感測器以及毫米波雷達感測器在內的多種數據資訊感測器來收集不同模態的信息,用於實現準確的感知任務。基於純視覺的BEV感知演算法因其較低的硬體成本和易於部署的特點,以及其輸出結果能便捷地應用於各種下游任務,因此受到工業

C++中機器學習演算法面臨的常見挑戰包括記憶體管理、多執行緒、效能最佳化和可維護性。解決方案包括使用智慧指標、現代線程庫、SIMD指令和第三方庫,並遵循程式碼風格指南和使用自動化工具。實作案例展示如何利用Eigen函式庫實現線性迴歸演算法,有效地管理記憶體和使用高效能矩陣操作。

C++sort函數底層採用歸併排序,其複雜度為O(nlogn),並提供不同的排序演算法選擇,包括快速排序、堆排序和穩定排序。

人工智慧(AI)與執法領域的融合為犯罪預防和偵查開啟了新的可能性。人工智慧的預測能力被廣泛應用於CrimeGPT(犯罪預測技術)等系統,用於預測犯罪活動。本文探討了人工智慧在犯罪預測領域的潛力、目前的應用情況、所面臨的挑戰以及相關技術可能帶來的道德影響。人工智慧和犯罪預測:基礎知識CrimeGPT利用機器學習演算法來分析大量資料集,識別可以預測犯罪可能發生的地點和時間的模式。這些資料集包括歷史犯罪統計資料、人口統計資料、經濟指標、天氣模式等。透過識別人類分析師可能忽視的趨勢,人工智慧可以為執法機構

PHP與Vue:完美搭檔的前端開發利器在當今網路快速發展的時代,前端開發變得愈發重要。隨著使用者對網站和應用的體驗要求越來越高,前端開發人員需要使用更有效率和靈活的工具來創建響應式和互動式的介面。 PHP和Vue.js作為前端開發領域的兩個重要技術,搭配起來可以稱得上是完美的利器。本文將探討PHP和Vue的結合,以及詳細的程式碼範例,幫助讀者更好地理解和應用這兩

01前景概要目前,難以在檢測效率和檢測結果之間取得適當的平衡。我們研究了一種用於高解析度光學遙感影像中目標偵測的增強YOLOv5演算法,利用多層特徵金字塔、多重偵測頭策略和混合注意力模組來提高光學遙感影像的目標偵測網路的效果。根據SIMD資料集,新演算法的mAP比YOLOv5好2.2%,比YOLOX好8.48%,在偵測結果和速度之間達到了更好的平衡。 02背景&動機隨著遠感技術的快速發展,高解析度光學遠感影像已被用於描述地球表面的許多物體,包括飛機、汽車、建築物等。目標檢測在遠感影像的解釋中

一、58畫像平台建置背景首先和大家分享下58畫像平台的建造背景。 1.傳統的畫像平台傳統的想法已經不夠,建立用戶畫像平台依賴數據倉儲建模能力,整合多業務線數據,建構準確的用戶畫像;還需要數據挖掘,理解用戶行為、興趣和需求,提供演算法側的能力;最後,還需要具備數據平台能力,有效率地儲存、查詢和共享用戶畫像數據,提供畫像服務。業務自建畫像平台和中台類型畫像平台主要區別在於,業務自建畫像平台服務單條業務線,按需定制;中台平台服務多條業務線,建模複雜,提供更為通用的能力。 2.58中台畫像建構的背景58的使用者畫像

在前端開發面試中,常見問題涵蓋廣泛,包括HTML/CSS基礎、JavaScript基礎、框架和函式庫、專案經驗、演算法和資料結構、效能最佳化、跨域請求、前端工程化、設計模式以及新技術和趨勢。面試官的問題旨在評估候選人的技術技能、專案經驗以及對行業趨勢的理解。因此,應試者應充分準備這些方面,以展現自己的能力和專業知識。
