【JavaScript 演算法與資料結構】

java架構源發表於2019-04-03
【JavaScript 演算法與資料結構】

README.md

JavaScript 演算法與資料結構

本倉庫包含了多種基於 JavaScript 的演算法與資料結構。

每種演算法和資料結構都有自己的 README 並提供相關說明以及進一步閱讀和 YouTube 視訊。

資料結構

資料結構是在計算機中組織和儲存資料的一種特殊方式,它可以高效地訪問和修改資料。更確切地說,資料結構是資料值的集合,它們之間的關係、函式或操作可以應用於資料。

連結串列:


【JavaScript 演算法與資料結構】

佇列

雜湊表

優先佇列

字典樹

二分查詢

AVL 樹

紅黑樹

圖 (有向圖與無向圖)

並查集

演算法:

【JavaScript 演算法與資料結構】

演算法是如何解決一類問題的明確規範。 演算法是一組精確定義操作序列的規則。

演算法主題

數學

階乘

斐波那契數

素數檢測 (排除法)

歐幾里得演算法 - 計算最大公約數(GCD)

最小公倍數 (LCM)

整數拆分

集合

笛卡爾積 - 多集合結果

冪集 - 該集合的所有子集

排列 (有/無重複)

組合 (有/無重複)

洗牌演算法 - 隨機置換有限序列

最長公共子序列 (LCS)

最長遞增子序列

Shortest Common Supersequence (SCS)

揹包問題 - "0/1" and "Unbound" ones

最大子數列問題 - BF演算法 與 動態程式設計

字串

萊溫斯坦距離 - 兩個序列之間的最小編輯距離

漢明距離 - 符號不同的位置數

克努斯-莫里斯-普拉特演算法 - 子串搜尋

字串快速查詢 - 子串搜尋

最長公共子串

搜尋

二分查詢,如圖所示:


【JavaScript 演算法與資料結構】

排序:


【JavaScript 演算法與資料結構】

氣泡排序

選擇排序

插入排序

堆排序

歸併排序

快速排序

希爾排序

深度優先搜尋 (DFS)


【JavaScript 演算法與資料結構】

廣度優先搜尋 (BFS)


【JavaScript 演算法與資料結構】

深度優先搜尋 (DFS)

廣度優先搜尋 (BFS)

戴克斯特拉演算法m - 找到所有圖頂點的最短路徑

貝爾曼-福特演算法 - 找到所有圖頂點的最短路徑

判圈演算法 - 對於有向圖和無向圖(基於DFS和不相交集的版本)

普林演演算法 - 尋找加權無向圖的最小生成樹(MST)

克魯斯克爾演演算法 - 尋找加權無向圖的最小生成樹(MST)

拓撲排序 - DFS 方法

關節點 - Tarjan演算法(基於DFS)

橋 - 基於DFS的演算法

尤拉路徑與一筆畫問題 - Fleury的演算法 - 一次訪問每個邊緣

哈密頓圖 - 恰好訪問每個頂點一次

強連通分量 - Kosaraju演算法

旅行推銷員問題 - 儘可能以最短的路線訪問每個城市並返回原始城市

未分類

漢諾塔

八皇后問題

騎士巡邏

演算法正規化

演算法正規化是基於類的設計的通用方法或方法的演算法。 這是一個比演算法概念更高的抽象,就像一個 演算法是比計算機程式更高的抽象。

BF演算法 - 查詢所有可能性並選擇最佳解決方案

最大子數列

旅行推銷員問題 - 儘可能以最短的路線訪問每個城市並返回原始城市

貪心法 - 在當前選擇最佳選項,不考慮以後情況

揹包問題

戴克斯特拉演算法 - 找到所有圖頂點的最短路徑

普里姆演算法 - 尋找加權無向圖的最小生成樹(MST)

克魯斯卡爾演算法 - 尋找加權無向圖的最小生成樹(MST)

分治法 - 將問題分成較小的部分,然後解決這些部分

二分查詢

漢諾塔

歐幾里得演算法 - 計算最大公約數(GCD)

排列 (有/無重複)

組合 (有/無重複)

歸併排序

Quicksort

樹深度優先搜尋 (DFS)

圖深度優先搜尋 (DFS)

動態程式設計 - 使用以前找到的子解決方案構建解決方案

斐波那契數

萊溫斯坦距離 - 兩個序列之間的最小編輯距離

最長公共子序列 (LCS)

最長公共子串

最長遞增子序列

最短公共子序列

0-1揹包問題

整數拆分

最大子數列

貝爾曼-福特演算法 - 找到所有圖頂點的最短路徑

回溯法 - 類似於 BF演算法 試圖產生所有可能的解決方案,但每次生成解決方案測試如果它滿足所有條件,那麼只有繼續生成後續解決方案。 否則回溯並繼續尋找不同路徑的解決方案。

哈密頓圖 - 恰好訪問每個頂點一次

八皇后問題

騎士巡邏

B & B

如何使用本倉庫

安裝依賴

npm install

執行測試

npm test

按照名稱執行測試

npm test -- -t 'LinkedList'

Playground

你可以在./src/playground/playground.js

檔案中運算元據結構與演算法,並在

./src/playground/__test__/playground.test.js

中編寫測試。

然後,只需執行以下命令來測試是否無誤:

npm test -- -t 'playground'

有用資訊

大O符號

大O符號中指定的演算法的增長順序。

【JavaScript 演算法與資料結構】
·

以下是一些最常用的 大O標記法 列表以及它們與不同大小輸入資料的效能比較。

大O標記法計算10個元素100個1000個

O(1)111

O(log N)369

O(N)101001000

O(N log N)306009000

O(N^2)100100001000000

O(2^N)10241.26e+291.07e+301

O(N!)36288009.3e+1574.02e+2567

資料結構操作的複雜性

資料結構連線查詢插入刪除

陣列1nnn

棧nn11

佇列nn11

連結串列nn11

雜湊表-nnn

二分查詢樹nnnn

B樹log(n)log(n)log(n)log(n)

紅黑樹log(n)log(n)log(n)log(n)

AVL樹log(n)log(n)log(n)log(n)

陣列排序演算法的複雜性

名稱最優平均最壞記憶體穩定

氣泡排序nn^2n^21Yes

插入排序nn^2n^21Yes

選擇排序n^2n^2n^21No

堆排序n log(n)n log(n)n log(n)1No

歸併排序n log(n)n log(n)n log(n)nYes

快速排序n log(n)n log(n)n^2log(n)No

希爾排序n log(n)取決於差距序列n (log(n))^21No。


相關文章