README.vi-VN.md
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 עברית
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
B Danh sách liên kếtB Danh sách liên kết đôiB Hàng đợiB Ngăn xếpB Bảng bămB Đống - max và min heapB Hàng đợi ưu tiênA Cây tiền tốA Cây
A Cây tìm kiếm nhị phânA Cây AVLA Cây đỏ đenA Cây phân đoạn - với các ví dụ truy vấn phạm vi nhỏ nhất/lớn nhất/tổngA CÂy Fenwick (Cây chỉ mục nhị phân)A Đồ thị (có hướng và vô hướng)A Tập hợp không giao nhauA Bộ lọc BloomThuậ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
B Thao tác bit - đặt/lấy/cập nhật/xóa bit, nhân/chia 2, đổi dấu âm,...B Giai thừaB Số Fibonacci - cổ điển và dạng đóngB Thừa số nguyên tố - tìm và đếm thừa số nguyên tố sử dụng định luật Hardy-Ramanujan'sB Kiểm tra tính nguyên tố (phân chia thử nghiệm)B Thuật toán Euclid - tính ước số chung lớn nhất (GCD)B Bội số chung nhỏ nhất (LCM)B Sàng số nguyên tố - tìm tất cả các số nguyên tố trong bất kỳ phạm vi nhất định nàoB Xác định lũy thừa của 2 - kiểm tra xem số có phải là lũy thừa của 2 hay không (thuật toán nguyên bản và theo bit)B Tam giác PascalB Số phức - số phức và các phép toán cơ bản với số phứcB Radian & độ - chuyển đổi giữa đơn vị radian và độB Tính nhanh lũy thừaB Phương pháp Horner's - tính giá trị đa thứcB Ma trận - ma trận và các phép toán cơ bản (phép nhân, phép chuyển vị,...)B Khoảng cách Euclid - khoảng cách giữa hai điểm/véc-tơ/ma trậnA Phân hoạchA Căn bậc hai - phương pháp NewtonA Thuật cắt đường tròn - Lưu Huy - phép tính gần đúng số π dựa vào đa giácA Biến đổi Fourier rời rạc - phân giải tín hiệu thời gian thành các tần số tạo nên tín hiệu đóB Tích Đề-các - tích của nhiều tập hợpB Thuật toán xáo trộn - dãy hữu hạn hoán vị ngẫu nhiênA Tập lũy thừa - tập hợp chứa tất cả các tập con (theo bit và quay lui)A Hoán vị (lặp và không lặp)A Tổ hợp (lặp và không lặp)A Dãy con chung dài nhất (LCS)A Dãy con chung tăng dần dài nhấtA Dãy con chung ngắn nhất (SCS)A Bài toán xếp ba lô - dạng 0-1 và không bị chặnA Mảng con lớn nhất - phiên bản vét cạn và quy hoạch động (Kadane)A Tổ hợp của tổng - tìm tất cả các tổ hợp tạo thành tổng cụ thểB Khoảng cách Hamming - số các vị trí các ký hiệu khác nhauA Khoảng cách Levenshtein - khoảng cách thay đổi nhỏ nhất giữa hai chuỗi ký tựA Thuật toán Knuth–Morris–Pratt (thuật toán KMP) - tìm chuỗi con (đối sánh mẫu)A Thuật toán Z - tìm chuỗi con (đối sánh mẫu)A Thuật toán Rabin Karp - tìm chuỗi conA Xâu con chung dài nhấtA Phối biểu thức chính quyB Tìm kiếm tuyến tínhB Tìm kiếm nhảy (tìm khối) - tìm kiếm trong mảng đã sắp xếpB Tìm kiếm nhị phân - tìm kiếm trong mảng đã sắp xếpB Tìm kiếm nội suy - Tìm kiếm strong mảng có thứ tự được phân phối đồng nhấtB Sắp xếp nổi bọtB Sắp xếp chọnB Sắp xếp chènB Sắp xếp vun đốngB Sắp xếp trộnB Sắp xếp nhanh - Tại chỗ và không tại chỗB ShellsortB Sắp xếp đếmB Sắp xếp theo cơ sốB Depth-First Search (DFS)B Breadth-First Search (BFS)B Tìm kiếm theo chiều sâu (DFS)B Tìm kiếm theo chiều rộng (BFS)B Thuật toán Kruskal - tìm cây bao trùm nhỏ nhất (MST) cho đồ thị vô hướng có trọng sốA Thuật toán Dijkstra Algorithm - tìm những đường ngắn nhất từ một định tới tất cả các đỉnhA Thuật toán Bellman-Ford - tìm những đường ngắn nhất từ một đỉnh tới tất cả các đỉnh của đồ thịA Thuật toán Floyd-Warshall - tìm những đường ngắn nhất giữa tất cả các cặp đỉnhA Phát hiện vòng - cho cả đồ thị có hướng và vô hướng (dựa trên DFS và tập không giao)A Thuật toán Prim - tìm cây bao trùm nhỏ nhất (MST) cho đồ thị vô hướng có trọng sốA Sắp xếp tô pô - phương pháp DFSA Điểm khớp - Thuật toán Tarjan (dựa trên DFS)A Cầu nối - dựa trên DFSA Đường đi Euler và Chu trình Euler - thuật toán Fleury - đi qua các cạnh chỉ một lần duy nhấtA Chu trình Hamilton - đi qua các đỉnh chỉ một lần duy nhấtA Các thành phần kết nối chặt - Thuật toán KosarajuA Bài toán người bán hàng - tuyến đường ngắn nhất có thể đến thăm từng thành phố và trở về thành phố gốcB Băm đa thức - lăn hàm băm dựa trên đa thứcB Mật mã hàng rào đường sắt - một thuật toán mật mã chuyển vị để mã hóa thông điệpB Mật mã Caesar - mật mã chuyển vị đơn giảnB Mật mã Hill - mật mã chuyển vị đơn giản dựa trên đại số tuyến tínhB NanoNeuron - 7 hàm JS đơn giản minh họa cách máy tính thực sự có thể học (truyền thuận / truyền ngược)B k-NN - thuật toán phân loại k láng giềng gần nhấtB k-Means - thuật toán phân cụm k-MeansB Tháp Hà NộiB Xoay ma trận vuông - thuật toán tại chỗB Trò chơi nhảy - ví dụ quay lui, quy hoạch động (từ trên xuống + từ dưới lên), dynamic programming (top-down + bottom-up) và tham lamB Các đường đi đặc trưng duy nhất - ví dụ quay lui, quy hoạch động và tam giác PascalB Thu thập nước mưa - bài toán bẫy nước mưa (phiên bản quy hoạch động và vét cạn)B Cầu thang đệ quy - đếm số cách lên đến đỉnh (4 lời giải)B Thời điểm tốt nhất để mua bán cổ phiếu - ví dụ chia để trị và một đường chuyềnA Bài toán n quân hậuA Mã đi tuầnMẫ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.
B Tìm kiếm tuyến tínhB Thu thập nước mưa - bài toán bẫy nước mưaB Cầu thang đệ quy - đếm số cách lên đến đỉnhA Mảng con lớn nhấtA Bài toán người bán hàng - tuyến đường ngắn nhất có thể đến thăm từng thành phố và trở về thành phố gốcA Biến đổi Fourier rời rạc - phân giải tín hiệu thời gian thành các tần số tạo nên tín hiệu đóB Trò chơi nhảyA Bài xếp ba lô không bị chặnA Thuật toán Dijkstra - tìm những đường ngắn nhất từ một định tới tất cả các đỉnhA Thuật toán Prim - tìm cây bao trùm nhỏ nhất (MST) cho đồ thị vô hướng có trọng sốA Thuật toán Kruskal - tìm cây bao trùm nhỏ nhất (MST) cho đồ thị vô hướng có trọng sốB Tìm kiếm nhị phânB Tháp Hà NộiB Tam giác PascalB Thuật toán Euclid - tính ước số chung lớn nhấtB Sắp xếp trộnB Sắp xếp nhanhB Cây tìm kiếm theo chiều sâu (DFS)B Đồ thị tìm kiếm theo chiều sâu (DFS)B Ma trận - tạo và duyệt các ma trận có kích thước khác nhauB Trò chơi nhảyB Tính nhanh lũy thừaB Thời điểm tốt nhất để mua bán cổ phiếu - ví dụ chia để trị và một đường chuyềnA Hoán vị (lặp và không lặp)A Tổ hợp (lặp và không lặp)B Số FibonacciB Trò chơi nhảyB Đường đi độc nhấtB Thu thập nước mưa - bài toán bẫy nước mưaB Cầu thang đệ quy - đếm số cách lên đến đỉnhA Khoảng cách Levenshtein - khoảng cách thay đổi nhỏ nhất giữa hai chuỗi ký tựA Dãy con chung dài nhất (LCS)A Xâu con chung dài nhấtA Dãy con chung tăng dần dài nhấtA Dãy con chung ngắn nhấtA Bài xếp ba lô dạng 0-1A Integer PartitionA Mảng con lớn nhấtA Thuật toán Bellman-Ford - tìm những đường ngắn nhất từ một đỉnh tới tất cả các đỉnh của đồ thịA Thuật toán Floyd-Warshall - tìm những đường ngắn nhất giữa tất cả các cặp đỉnhA Phối biểu thức chính quyB Trò chơi nhảyB Đường đi độc nhấtB Tập lũy thừa - tập hợp chứa tất cả các tập conA Chu trình Hamilton - đi qua các đỉnh một lần duy nhấtA Bài toán n quân hậuA Mã đi tuầnA Tổ hợp của tổng - tìm tất cả các tổ hợp tạo thành tổng cụ thể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'
▶ Data Structures and Algorithms on YouTube
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.
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 |
| 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 |
| 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 | n<sup>2</sup> | n<sup>2</sup> | 1 | Có | |
| Sắp xếp chèn | n | n<sup>2</sup> | n<sup>2</sup> | 1 | Có | |
| Sắp xếp chọn | n<sup>2</sup> | n<sup>2</sup> | n<sup>2</sup> | 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 | Có | |
| Sắp xếp nhanh | n log(n) | n log(n) | n<sup>2</sup> | 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))<sup>2</sup> | 1 | Không | |
| Sắp xếp đếm | n + r | n + r | n + r | n + r | Có | r - số lớn nhất trong mảng |
| Sắp xếp theo cơ số | n * k | n * k | n * k | n + k | Có | k - độ dài của khóa dài nhất |
Bạn có thể hỗ trợ dự án này qua ❤️️ GitHub hoặc ❤️️ Patreon.