一、是什么
算法(Algorithm)是指解題方案的准確而完整的描述,是一系列解決問題的清晰指令,算法代表着用系統的方法描述解決問題的策略機制
也就是說,能夠對一定規范的輸入,在有限時間內獲得所要求的輸出
如果一個算法有缺陷,或不適合於某個問題,執行這個算法將不會解決這個問題
一個程序=算法+數據結構,數據結構是算法實現的基礎,算法總是要依賴於某種數據結構來實現的,兩者不可分割
因此,算法的設計和選擇要同時結合數據結構,簡單地說數據結構的設計就是選擇存儲方式,如確定問題中的信息是用數組存儲還是用普通的變量存儲或其他更加復雜的數據結構
針對上述,可以得出一個總結:不同的算法可能用不同的時間、空間或效率來完成同樣的任務
二、特性
關於算法的五大特性,有如下:
- 有限性(Finiteness):一個算法必須保證執行有限步之后結束
- 確切性(Definiteness):一個算法的每一步驟必須有確切的定義
- 輸入(Input):一個算法有零個或多個輸入,以刻畫運算對象的初始情況,所謂零個輸入是指算法本身給定了初始條件
- 輸出(Output):一個算法有一個或多個輸出。沒有輸出的算法毫無意義
- 可行性(Effectiveness):算法中執行的任何計算步驟都是可以被分解為基本的可執行的操作步驟,即每個計算步驟都可以在有限時間內完成(也稱之為有效性)
三、應用場景
在前端領域中,數據結構與算法無法不在,例如現在的vue
或者react
項目,實現虛擬DOM
或者Fiber
結構,本質就是一種數據結構,如下一個簡單的虛擬DOM
:
{
type: 'div',
props: {
name: 'lucifer'
},
children: [{
type: 'span',
props: {},
children: []
}]
}
vue
與react
都能基於基於對應的數據結構實現diff
算法,提高了整個框架的性能以及拓展性
包括在前端javascript
編譯的時候,都會生成對應的抽象語法樹AST
,其本身不涉及到任何語法,因此你只要編寫相應的轉義規則,就可以將任何語法轉義到任何語法,也是babel
, PostCSS
, prettier
, typescript
除了這些框架或者工具底層用到算法與數據結構之外,日常業務也無處不在,例如實現一個輸入框攜帶聯想功能,如下:
如果我們要實現這個功能, 則可以使用前綴樹,如下:
包括前端可能會做一些對字符串進行相似度檢測,例如"每日一題"和"js每日一題"兩個字符串進行相似度對比,這種情況可以通過“最小編輯距離”算法,如果a
和b
的編輯距離越小,我們認為越相似
日常在編寫任何代碼的都需要一個良好的算法思維,選擇好的算法或者數據結構,能讓整個程序效率更高