README.md
JavaScript 演算法與資料結構
本倉庫包含了多種基於 JavaScript 的演算法與資料結構。
每種演算法和資料結構都有自己的 README 並提供相關說明以及進一步閱讀和 YouTube 視訊。
資料結構
資料結構是在計算機中組織和儲存資料的一種特殊方式,它可以高效地訪問和修改資料。更確切地說,資料結構是資料值的集合,它們之間的關係、函式或操作可以應用於資料。
連結串列:
佇列
棧
雜湊表
堆
優先佇列
字典樹
樹
二分查詢
AVL 樹
紅黑樹
圖 (有向圖與無向圖)
並查集
演算法:
演算法是如何解決一類問題的明確規範。 演算法是一組精確定義操作序列的規則。
演算法主題
數學
階乘
斐波那契數
素數檢測 (排除法)
歐幾里得演算法 - 計算最大公約數(GCD)
最小公倍數 (LCM)
整數拆分
集合
笛卡爾積 - 多集合結果
冪集 - 該集合的所有子集
排列 (有/無重複)
組合 (有/無重複)
洗牌演算法 - 隨機置換有限序列
最長公共子序列 (LCS)
最長遞增子序列
Shortest Common Supersequence (SCS)
揹包問題 - "0/1" and "Unbound" ones
最大子數列問題 - BF演算法 與 動態程式設計
字串
萊溫斯坦距離 - 兩個序列之間的最小編輯距離
漢明距離 - 符號不同的位置數
克努斯-莫里斯-普拉特演算法 - 子串搜尋
字串快速查詢 - 子串搜尋
最長公共子串
搜尋
二分查詢,如圖所示:
排序:
氣泡排序
選擇排序
插入排序
堆排序
歸併排序
快速排序
希爾排序
樹
深度優先搜尋 (DFS)
廣度優先搜尋 (BFS)
深度優先搜尋 (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符號中指定的演算法的增長順序。
以下是一些最常用的 大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。