Đây là repository về các giải thuật và cấu trúc dữ liệu phổ biến được viết bằng JavaScript.
Mỗi giải thuật sẽ có một folder và file README giải thích cùng các liên kết khác.
Cấu trúc dữ liệu là một phương thức 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 chức năng hoặc hoạt động có thể được triển khai cho dữ liệu.
B - Beginner (Cơ bản), A - Advanced (Nâng cao)
BLinked ListBDoubly Linked ListBQueueBStackBHash TableBHeapBPriority QueueATrieATreeAGraphADisjoint SetABloom Filter
Giải thuật hay thuật toán là một tập hợp hữu hạn các hướng dẫn được xác định rõ ràng, có thể thực hiện được bằng máy tính, thường để giải quyết một lớp vấn đề hoặc để thực hiện một phép tính.
B - Beginner (Cơ bản), A - Advanced (Nâng cao)
- Các phép toán (Math)
BBit Manipulation - set/get/cập nhật/xoá bit, nhân/chia hai bit, tạo bit âm etc.BBinary Floating Point - biểu diễn nhị phân của dấu phẩy động.BFactorialBFibonacci Number - dạng cổ điển và dạng đóngBPrime Factors - tìm thừa số nguyên tố và đếm chúng bằng định lý Hardy-Ramanujan.BPrimality Test (kiểm tra nguyên hàm)BEuclidean Algorithm - tìm ước số chung lớn nhất (GCD)BLeast Common Multiple - tìm bội số chung nhỏ nhất (LCM)BSieve of Eratosthenes - tìm tất cả số nguyên tố trong giới hạn được cho.BIs Power of Two - kiểm tra một số có phải luỹ thừa của 2.BPascal's Triangle - tam giác Pascal.BComplex Number - số phức và các phép toán cơ bản.BRadian & Degree - chuyển từ radian sang độ và ngược lại.BFast PoweringBHorner's method - lược đồ Horner.BMatrices - ma trận và các phép toán cơ bản (cộng, nhân, chuyển đổi, etc.)BEuclidean Distance - khoảng cách giữa hai điểm/vector/ma trận.AInteger PartitionASquare Root - phương thức Newton.ALiu Hui π Algorithm - tính gần đúng π dựa trên N-gons(Pending)ADiscrete Fourier Transform - phép biến đổi Fourier.(Pending)
- Tập hợp (Sets)
BCartesian Product - tích Descartes.BFisher–Yates Shuffle - thuật toán ngẫu nhiên không trùng.APower Set - tất cả các tập hợp con của một tập hợp (dùng phương pháp quay lùi)APermutations (sử dụng và không sử dụng vòng lặp)ACombinations (sử dụng và không sử dụng vòng lặp)ALongest Common Subsequence (LCS)ALongest Increasing SubsequenceAShortest Common Supersequence (SCS)AKnapsack Problem (Pending)AMaximum Subarray (Pending)ACombination Sum (Pending)
- Chuỗi (Strings)
BHamming Distance - khoảng cách HammingALevenshtein Distance - khoảng cách LevenshteinAKnuth–Morris–Pratt Algorithm (Thuật toán KMP) - tìm kiếm chuỗi con (so sánh mẫu)(Pending)AZ Algorithm - tìm kiếm chuỗi con (so sánh mẫu)(Pending)ARabin Karp Algorithm - tìm kiếm chuỗi con(Pending)ALongest Common Substring(Pending)ARegular Expression Matching(Pending)
- Thuật toán tìm kiếm (Searches)
BLinear SearchBJump Search (or Block Search) - tìm kiếm trong mảng đã sắp xếp.BBinary Search - tìm kiếm trong mảng đã sắp xếp.BInterpolation Search - tìm kiếm trong mảng được sắp xếp được phân phối thống nhất.
- Thuật toán sắp xếp (Sorting)
BBubble SortBSelection SortBInsertion SortBHeap SortBMerge SortBQuicksortBShellsortBCounting SortBRadix Sort
- Danh sách liên kết (Linked Lists)
- Cây (Trees)
BDepth-First Search (DFS)BBreadth-First Search (BFS)
- Lưu đồ (Graphs)
BDepth-First Search (DFS)BBreadth-First Search (BFS)BKruskal’s Algorithm - tìm cây con nhỏ nhất của một đồ thị vô hướng có trọng số.ADijkstra Algorithm - tìm đường đi ngắn nhât của một đồ thị có hướng không trọng số.(Pending)ABellman-Ford Algorithm - tính các đường đi ngắn nhất trong một đồ thị có hướng có trọng số. (Pending)AFloyd-Warshall Algorithm - tìm đường đi ngắn nhât của một đồ thị có hướng dựa trên đỉnh trung gian. (Pending)ADetect Cycle - cho cả đồ thị có hướng và vô hướng (DFS and Disjoint Set based versions). (Pending)APrim’s Algorithm - giống thuật toán Kruskal's. (Pending)ATopological Sorting - phương thức DFS. (Pending)AArticulation Points - thuật toán của Tarjan(dựa trên DFS). (Pending)ABridgesAEulerian Path and Eulerian Circuit - giải thuật Fleury(Pending)AHamiltonian Cycle - Đi qua mọi đỉnh chính xác một lần.(Pending)AStrongly Connected Components - giải thuật Kosaraju(Pending)ATravelling Salesman Problem - đường đi ngắn nhất qua mọi điểm và trở về vị trí ban đầu.(Pending)
- Mã hoá
BPolynomial Hash - hàm băm dựa trên đa thứcBRail Fence Cipher - mã hoá bằng phương pháp chuyển vị.BCaesar Cipher - mã hoá bằng phương pháp thay thế.BHill Cipher - má hoá bằng phương pháp tuyến tính.
- Máy học(Pending)
BNanoNeuron - 7 hàm JS đơn giản minh họa cách máy móc thực sự có thể học (truyền tiến / lùi)Bk-NN - thuật toán K láng giềng gần nhấtBk-Means - thuật toán phân cụm k-Means
- Xứ lý hình ảnh(Pending)
BSeam Carving - thuật toán thay đổi kích thước hình ảnh.
- Khác
BTower of Hanoi - bài toán tháp Hà Nội.BSquare Matrix RotationBJump Game - ví dụ về giải thuât quay lùi, tham lam và quy hoạch động.BUnique Paths - ví dụ về giải thuật quay lùi, quy hoạch động và tam giác Pascal.BRain Terraces -BRecursive Staircase - đếm số cách đi hết cầu thang (4 giải pháp)BBest Time To Buy Sell Stocks - ví dụ về chia để trị.AN-Queens Problem - bài toán N quân hậu.AKnight's Tour - bài toán ngựa đi đường.
Mô 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à sự trừu tượng cao hơn một chương trình máy tính.
- Phá mã Brute Force - xem xét tất cả các khả năng và chọn giải pháp tốt nhất
BLinear SearchBRain TerracesBRecursive StaircaseAMaximum SubarrayATravelling Salesman ProblemADiscrete Fourier Transform - biến đổi Fourier.
- Giải thuật tham lam - chọn phương án tốt nhất tại thời điểm hiện tại mà không cần cân nhắc đến các lựa chọn khác trong tương lai.
- Giải thuật chia để trị - chia nhỏ vấn đề và giải quyết các vấn đề nhỏ đấy.
BBinary SearchBTower of HanoiBPascal's TriangleBEuclidean AlgorithmBMerge SortBQuicksortBTree Depth-First Search (DFS)BGraph Depth-First Search (DFS)BMatrices -tạo và duyệt các ma trận có hình dạng khác nhau.BJump GameBFast PoweringBBest Time To Buy Sell StocksAPermutationsACombinations
- Quy hoạch động - xây dựng một giải pháp bằng cách sử dụng các giải pháp phụ đã tìm thấy trước đây.
BFibonacci NumberBJump GameBUnique PathsBRain TerracesBRecursive StaircaseBSeam Carving -ALevenshtein DistanceALongest Common Subsequence (LCS)ALongest Common SubstringALongest Increasing SubsequenceAShortest Common SupersequenceA0/1 Knapsack ProblemAInteger PartitionAMaximum SubarrayABellman-Ford AlgorithmAFloyd-Warshall AlgorithmARegular Expression Matching
- Giải thuật quay lùi - tương tự brute force ta cũng tìm tất cả các khả năng nhưng trong quá trình tìm kiếm, nếu ta gặp một hướng lựa chọn không thỏa mãn, ta quay lùi về điểm lựa chọn nơi có các hướng khác và thử hướng lựa chọn tiếp theo. Khi đã thử hết các lựa chọn xuất phát từ điểm lựa chọn đó, ta quay lại điểm lựa chọn trước đó và thử hướng lựa chọn tiếp theo tại đấy. Quá trình tìm kiếm thất bại khi không còn điểm lựa chọn nào nữa.
- Giải thuật nhánh cận - ghi nhớ chi phí thấp nhất được tìm thấy ở các giải pháp của giải thuật quay lùi, và sự dụng chi phí đấy như là một ràng buộc để loại bỏ các giải pháp có chi phí lớn hơn. Nói các khác giải thuật nhánh cận là tối ưu của giải thuật quay lùi.
Ký hiệu O được sử dụng để phân loại các thuật toán theo cách thời gian thực thi hoặc yêu cầu không gian bổ sung của chúng. Trong biểu đồ dưới đây, bạn có thể thấy thứ tự phát triển của hầu hết các thuật toán phổ biến được chỉ định trong ký hiệu Big O.
Source: Big O Cheat Sheet.
Dưới đây là danh sách một số ký hiệu Big O được sử dụng nhiều nhất và so sánh hiệu suất của chúng so với các kích thước khác nhau của dữ liệu đầu vào.
| Big O Notation | Computations for 10 elements | Computations for 100 elements | Computations for 1000 elements |
|---|---|---|---|
| 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 |
| Data Structure | Access | Search | Insertion | Deletion | Comments |
|---|---|---|---|---|---|
| Array | 1 | n | n | n | |
| Stack | n | n | 1 | 1 | |
| Queue | n | n | 1 | 1 | |
| Linked List | n | n | 1 | n | |
| Hash Table | - | n | n | n | In case of perfect hash function costs would be O(1) |
| Binary Search Tree | n | n | n | n | In case of balanced tree costs would be O(log(n)) |
| B-Tree | log(n) | log(n) | log(n) | log(n) | |
| Red-Black Tree | log(n) | log(n) | log(n) | log(n) | |
| AVL Tree | log(n) | log(n) | log(n) | log(n) | |
| Bloom Filter | - | 1 | 1 | - | False positives are possible while searching |
| Name | Best | Average | Worst | Memory | Stable | Comments |
|---|---|---|---|---|---|---|
| Bubble sort | n | n2 | n2 | 1 | Yes | |
| Insertion sort | n | n2 | n2 | 1 | Yes | |
| Selection sort | n2 | n2 | n2 | 1 | No | |
| Heap sort | n log(n) | n log(n) | n log(n) | 1 | No | |
| Merge sort | n log(n) | n log(n) | n log(n) | n | Yes | |
| Quick sort | n log(n) | n log(n) | n2 | log(n) | No | Quicksort is usually done in-place with O(log(n)) stack space |
| Shell sort | n log(n) | depends on gap sequence | n (log(n))2 | 1 | No | |
| Counting sort | n + r | n + r | n + r | n + r | Yes | r - biggest number in array |
| Radix sort | n * k | n * k | n * k | n + k | Yes | k - length of longest key |
