首页

▼ 算法合集

▼ 加密算法

▼ 凯撒密码

凯撒密码

▼ Hill密码算法

Hill密码算法

▼ 多项式哈希算法

多项式哈希算法

▼ Rail Fence Cipher

Rail Fence Cipher

▼ Graph算法

▼ 关节点

关节点

▼ Bellman-Ford算法

Bellman-Ford算法

▼ 广度优先搜索

广度优先搜索

▼ GraphBridges

桥接模式

▼ 深度优先搜索

深度优先搜索

▼ 检测循环

检测循环

▼ Dijkstra算法

Dijkstra算法

▼ Eulerian Path

欧拉路径

▼ Floyd-Warshall算法

Floyd-Warshall算法

▼ HamiltonianCycle

Hamiltonian Cycle

▼ Kruskal算法

Kruskal算法

▼ Prim算法

Prim算法

▼ 强连通分量

强连通分量

▼ 拓扑排序

拓扑排序

▼ Travelling Salesman Problem

Travelling Salesman

▼ 图像处理算法

▼ Seam Carving算法

内容感知缩放算法

▼ 链表

▼ 反向遍历

反向遍历

▼ GraphTraversal

GraphTraversal

▼ 数学算法

▼ 二进制浮点数

BinaryFloatingPoint

▼ 位操作

位操作算法

▼ 复数

复数

▼ 欧几里得算法

Euclidean Algorithm

▼ Euclidean Distance

欧几里得距离

▼ 阶乘算法

阶乘算法

▼ 快速幂算法

快速幂算法

▼ Fibonacci数列

斐波那契数列

▼ 傅里叶变换

Fourier变换

▼ Horner法

霍纳法则

▼ 整数划分

整数划分

▼ 判断是否为2的幂

判断是否为2的幂

▼ 最小公倍数

最小公倍数

▼ Liu Hui

Liu Hui

▼ 矩阵

Matrix

▼ Pascal三角形

Pascal三角形

▼ Primality Test

素数测试

▼ 质因数

质因数

▼ 弧度计算

弧度计算

▼ 埃拉托色尼筛法

埃拉托色尼筛法

▼ SquareRoot

SquareRoot

▼ MachineLearning

▼ K均值算法

K均值算法

▼ K近邻算法

K近邻算法

▼ 搜索算法

▼ 二分查找算法

二分查找

▼ 插值搜索算法

插值搜索算法

▼ 跳跃搜索算法

跳跃搜索算法

▼ 线性搜索

线性搜索算法

▼ 集合

▼ 笛卡尔积

笛卡尔积

▼ 组合总和

组合总和

▼ 组合算法

组合算法

▼ Fisher-Yates洗牌算法

Fisher-Yates洗牌算法

▼ 背包问题

背包问题

▼ 最长公共子序列

最长公共子序列

▼ 最长递增子序列

最长递增子序列

▼ 最大子数组

最大子数组

▼ 排列组合

排列组合

▼ 幂集

幂集算法

▼ 最短公共超序列

最短公共超序列

▼ Sorting Algorithms

▼ 冒泡排序

冒泡排序

▼ 桶排序算法

桶排序算法

▼ 计数排序算法

计数排序

▼ 堆排序算法

堆排序

▼ 插入排序

插入排序

▼ 归并排序

归并排序

▼ 快速排序算法

快速排序算法

▼ 基数排序

基数排序

▼ 选择排序算法

选择排序算法

▼ 希尔排序

希尔排序

▼ 统计学

▼ 加权随机

加权随机算法

▼ 字符串算法

▼ Hamming距离

Hamming距离

▼ KnuthMorrisPratt算法

Knuth-Morris-Pratt算法

▼ LevenshteinDistance

Levenshtein距离

▼ 最长公共子串

最长公共子串

▼ 回文检测算法

回文检测算法

▼ Rabin-Karp算法

Rabin-Karp算法

▼ 正则表达式匹配

正则表达式匹配

▼ Z算法

Z算法

▼ Tree Data Structure

▼ 广度优先搜索

广度优先搜索

▼ 深度优先搜索

深度优先搜索

▼ 未分类

▼ 最佳买卖股票时机

最佳买卖股票时机

▼ 汉诺塔算法

HanoiTower

▼ 跳跃游戏算法

跳跃游戏

▼ KnightTour

骑士巡逻

▼ N皇后问题

N皇后问题

▼ 雨水收集

雨水收集

▼ 递归楼梯问题

递归楼梯问题

▼ 方阵旋转

方阵旋转

▼ 独特路径

UniquePaths

▼ 数据结构

▼ BloomFilter算法

布隆过滤器

▼ 不相交集数据结构

Disjoint Set

▼ 双向链表

双向链表

▼ Graph

Graph算法

▼ 哈希表

哈希表

▼ Heap数据结构

Heap数据结构

▼ 链表

链表

▼ LRU缓存

LRU缓存

▼ 优先队列

优先队列

▼ 队列

队列

▼ 栈结构

栈结构

▼ Tree Data Structure

树结构

▼ AVL树

AVL树

▼ 二叉搜索树

二叉搜索树

▼ Fenwick树

Fenwick树

▼ 红黑树

红黑树

▼ 线段树

SegmentTree

▼ Trie数据结构

Trie数据结构

JavaScript Thuật Toán và Cấu Trúc Dữ Liệu

CI codecov

Repository này bao gồm nhiều ví dụ thuật toán và cấu trúc dữ liệu phổ biến dựa trên Javascript.

Mối thuật toán và cấu trúc dữ liệu có README riêng với những lý giải và links liên quan để đọc thêm (bao gồm cả những videos trên Youtube).

Đọc bằng ngôn ngữ khác: English, 简体中文, 繁體中文, 한국어, 日本語, Polski, Français, Español, Português, Русский, Türk, Italiana, Bahasa Indonesia, Українська, Arabic

☝ Dự án này chỉ được sử dụng cho mục đích học tập và nghiên cứu, không được dùng cho mục đích thương mại.

Cấu Trúc Dữ Liệu

Cấu trúc dữ liệu là một cách cụ thể để tổ chức và lưu trữ dữ liệu trong máy tính để nó có thể được truy cập và sửa đổi một cách hiệu quả. Chính xác hơn, cấu trúc dữ liệu là một tập hợp các giá trị dữ liệu, các mối quan hệ giữa chúng và các hàm hoặc phép toán có thể được áp dụng cho dữ liệu.

B - Cơ bản, A - Nâng cao

Thuật Toán

Thuật toán là một đặc tả rõ ràng về cách giải quyết một lớp vấn đề. Nó là một tập hợp các quy tắc xác định chính xác một chuỗi phép toán.

B - Cơ bản, A - Nâng cao

Thuật toán theo chủ đề

Thuật toán theo mẫu hình

Mẫu hình thuật toán là một phương pháp hoặc cách tiếp cận chung làm cơ sở cho việc thiết kế một lớp thuật toán. Nó là một sự trừu tượng cao hơn khái niệm về một thuật toán, cũng giống như một thuật toán là một sự trừu tượng cao hơn một chương trình máy tính.

Hướng dẫn sử dụng repository

Cài đặt tất cả các phụ thuộc

npm install

Chạy ESLint

Bạn có thể muốn chạy nó để kiểm tra chất lượng code.

npm run lint

Chạy tất cả các kiểm thử

npm test

Chạy kiểm thử theo tên

npm test -- 'LinkedList'

Sân chơi

Bạn có thể chơi với các cấu trúc dữ liệu và thuật toán trong tệp ./src/playground/playground.js và viết các bài kiểm thử cho nó ở ./src/playground/__test__/playground.test.js.

Sau đó, chỉ cần chạy lệnh sau để kiểm tra xem sân chơi của bạn có hoạt động như mong đợi hay không:

npm test -- 'playground'

Thông tin hữu ích

Tham khảo

▶ Data Structures and Algorithms on YouTube

Kí hiệu O lớn

Kí hiệu O lớn được dùng để phân loại thuật toán theo thời gian chạy hoặc yêu cầu không gian gia tăng khi kích thước đầu vào gia tăng. Trên biểu đồ bên dưới, bạn có thể tìm thấy hầu hết các thứ tự tăng trưởng phổ biến của các thuật toán được chỉ định trong ký hiệu O lớn.

Đồ thị O lớn

Nguồn: Big O Cheat Sheet.

Dưới đây là danh sách một số ký hiệu O lớn thông dụng và so sánh với các kích thước khác nhau của dữ liệu đầu vào.

Kí hiệu O lớn Tính toán cho 10 phần tử Tính toán cho 100 phần tử Tính toán cho 1000 phần tử
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

Độ phức tạp của các phép toán cấu trúc dữ liệu

Cấu trúc dữ liệu Truy cập Tìm kiếm Chèn Xóa Bình luận
Mảng 1 n n n
Ngăn xếp n n 1 1
Hàng đợi n n 1 1
Danh sách liên kết n n 1 n
Bảng băm - n n n Trong trường hợp hàm băm hoàn hảo, chi phí sẽ là O(1)
Cây tìm kiếm nhị phân n n n n Trong trường hợp cây cân bằng, chi phí sẽ là O(log(n))
Cây B log(n) log(n) log(n) log(n)
Cây đỏ đen log(n) log(n) log(n) log(n)
Cây AVL log(n) log(n) log(n) log(n)
Bộ lọc Bloom - 1 1 - Có thể có kết quả dương tính giả trong khi tìm kiếm

Độ phức tạp của các thuật toán sắp xếp mảng

Tên Tốt nhất Trung bình Tệ nhất Bộ nhớ Ổn định Bình luận
Sắp xếp nổi bọt n n2 n2 1
Sắp xếp chèn n n2 n2 1
Sắp xếp chọn n2 n2 n2 1 Không
Sắp xếp vun đống n log(n) n log(n) n log(n) 1 Không
Sắp xếp trộn n log(n) n log(n) n log(n) n
Sắp xếp nhanh n log(n) n log(n) n2 log(n) Không Sắp xếp nhanh thường được thực hiện tại chỗ với không gian ngăn xếp O (log (n))
Shell sort n log(n) phụ thuộc vào khoảng cách dãy n (log(n))2 1 Không
Sắp xếp đếm n + r n + r n + r n + r r - số lớn nhất trong mảng
Sắp xếp theo cơ số n * k n * k n * k n + k k - độ dài của khóa dài nhất

Project Backers

Bạn có thể hỗ trợ dự án này qua ❤️️ GitHub hoặc ❤️️ Patreon.

Những người đang ủng hộ dự án này ∑ = 0