JavaScript 演算法與資料結構

February 12, 2025 · View on GitHub

CI codecov

這個知識庫包含許多 JavaScript 的資料結構與演算法的基礎範例。 每個演算法和資料結構都有其個別的文件,內有相關的解釋以及更多相關的文章或Youtube影片連結。

Read this in other languages: English, 简体中文, 한국어, 日本語, Polski, Français, Español, Português, Русский, Türk, Italiana, Bahasa Indonesia, Українська, Arabic, Tiếng Việt, Deutsch, Uzbek עברית

資料結構

資料結構是一個電腦用來組織和排序資料的特定方式,透過這樣的方式資料可以有效率地被讀取以及修改。更精確地說,一個資料結構是一個資料值的集合、彼此間的關係,函數或者運作可以應用於資料上。

演算法

演算法是一個如何解決一類問題的非模糊規格。演算法是一個具有精確地定義了一系列運作的規則的集合

演算法議題分類

演算法範型

演算法的範型是一個泛用方法或設計一類底層演算法的方式。它是一個比演算法的概念更高階的抽象化,就像是演算法是比電腦程式更高階的抽象化。

如何使用本知識庫

安裝所有必須套件

npm install

執行所有測試

npm test

以名稱執行該測試

npm test -- 'LinkedList'

練習場

你可以透過在./src/playground/playground.js裡面的檔案練習資料結構以及演算法,並且撰寫在./src/playground/__test__/playground.test.js裡面的測試程式。

接著直接執行下列的指令來測試你練習的 code 是否如預期運作:

npm test -- 'playground'

有用的資訊

參考

▶ Data Structures and Algorithms on YouTube

大 O 標記

特別用大 O 標記演算法增長度的排序。

Big O 表

資料來源: Big O Cheat Sheet.

下列列出幾個常用的 Big O 標記以及其不同大小資料量輸入後的運算效能比較。

Big 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-Treelog(n)log(n)log(n)log(n)
紅黑樹log(n)log(n)log(n)log(n)
AVL Treelog(n)log(n)log(n)log(n)

陣列排序演算法複雜度

名稱最佳平均最差記憶體穩定
氣泡排序nn^2n^21Yes
插入排序nn^2n^21Yes
選擇排序n^2n^2n^21No
Heap 排序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)由gap sequence決定n (log(n))^21No

ℹ️ A few more projects and articles about JavaScript and algorithms on trekhleb.dev