本倉庫包含了多種基於 JavaScript 的算法與數據結構。javascript
每種算法和數據結構都有本身的 README 並提供相關說明以及進一步閱讀和 YouTube 視頻。java
數據結構是在計算機中組織和存儲數據的一種特殊方式,它能夠高效地訪問和修改數據。更確切地說,數據結構是數據值的集合,它們之間的關係、函數或操做能夠應用於數據。git
算法是如何解決一類問題的明確規範。 算法是一組精肯定義操做序列的規則。github
算法範式是基於類的設計的通用方法或方法的算法。 這是一個比算法概念更高的抽象,就像一個 算法是比計算機程序更高的抽象。算法
BF算法 - 查找全部可能性並選擇最佳解決方案shell
貪心法 - 在當前選擇最佳選項,不考慮之後狀況npm
分治法 - 將問題分紅較小的部分,而後解決這些部分編程
動態編程 - 使用之前找到的子解決方案構建解決方案數組
回溯法 - 相似於 BF算法 試圖產生全部可能的解決方案,但每次生成解決方案測試若是它知足全部條件,那麼只有繼續生成後續解決方案。 不然回溯並繼續尋找不一樣路徑的解決方案。markdown
B & B
安裝依賴
npm install
複製代碼npm install
執行測試
npm test
複製代碼npm test
按照名稱執行測試
npm test -- -t 'LinkedList'
複製代碼npm test -- -t 'LinkedList'
Playground
你能夠在./src/playground/playground.js
文件中操做數據結構與算法,並在./src/playground/__test__/playground.test.js
中編寫測試。
而後,只需運行如下命令來測試你的 Playground 是否按無誤:
npm test -- -t 'playground'
複製代碼npm test -- -t 'playground'
大O符號中指定的算法的增加順序。
如下是一些最經常使用的 大O標記法 列表以及它們與不一樣大小輸入數據的性能比較。
大O標記法 | 計算10個元素 | 計算100個元素 | 計算1000個元素 |
---|---|---|---|
O(1) | 1 | 1 | 1 |
O(log N) | 3 | 6 | 9 |
O(N) | 10 | 100 | 1000 |
O(N log N) | 30 | 600 | 9000 |
O(N^2) | 100 | 10000 | 1000000 |
O(2^N) | 1024 | 1.26e+29 | 1.07e+301 |
O(N!) | 3628800 | 9.3e+157 | 4.02e+2567 |
數據結構 | 鏈接 | 查找 | 插入 | 刪除 |
---|---|---|---|---|
數組 | 1 | n | n | n |
棧 | n | n | 1 | 1 |
隊列 | n | n | 1 | 1 |
鏈表 | n | n | 1 | 1 |
哈希表 | - | n | n | n |
二分查找樹 | n | n | n | n |
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) |
名稱 | 最優 | 平均 | 最壞 | 內存 | 穩定 |
---|---|---|---|---|---|
冒泡排序 | n | n^2 | n^2 | 1 | Yes |
插入排序 | n | n^2 | n^2 | 1 | Yes |
選擇排序 | n^2 | n^2 | n^2 | 1 | No |
堆排序 | n log(n) | n log(n) | n log(n) | 1 | No |
歸併排序 | n log(n) | n log(n) | n log(n) | n | Yes |
快速排序 | n log(n) | n log(n) | n^2 | log(n) | No |
希爾排序 | n log(n) | 取決於差距序列 | n (log(n))^2 | 1 | No |