Skip to content

kerong2002/CPlusPlus_Algorithm

Repository files navigation

C++_Algorithm

Coding Style

小駝峰式命名法(lower camel case):

第一個單字以小寫字母開始;第二個單字的首字母大寫,例如:firstName、lastName。

大駝峰式命名法(upper camel case):

每一個單字的首字母都採用大寫字母,例如:FirstName、LastName、CamelCase,也被稱為Pascal命名法(英語:Pascal Case)
命名種類 命名法 範例
變數名稱 camelCase myVariableName
函式名稱 camelCase myFunctionName()
類別名稱 PascalCase MyClassName
常數名稱 全大寫命名法 MY_CONSTANT_VALUE

Code example

code link

#include <iostream>
#include <memory>
#include <vector>

#include "a.h"

#define SIZE 10
#define ROW_SIZE 2
#define COL_SIZE 3

using std::vector;
using std::unique_ptr;
using std::cout;

void myFunction(int myInt, float myFloat);
void myFunction(MyClass& myObject);
void myFunction(int* myIntPtr);
void myFunction(int** myIntPtrPtr);

int main(int argc, char** argv) {
    
    unique_ptr<bool[]> arr(new bool[SIZE]);
    
    for (int x = 0; x < SIZE; ++x) {
        if (x & 1) {
            arr[x] = true;
        }
        else {
            arr[x] = false;
        }
    }
    
    for (int x = 0; x < SIZE; x++) {
        cout <<  arr[x] << " ";
    }
    cout << '\n';

    vector<vector<int>> v1(ROW_SIZE, vector<int>(COL_SIZE, 0));
    
    for (int y = 0; y < ROW_SIZE; ++y) {
        for (int x = 0; x < COL_SIZE; ++x) {
            v1[y][x] = y * COL_SIZE + x;
        }
    }
    
    for (size_t i = 0; i < v1.size(); ++i){
        for (size_t j = 0; j < v1[0].size(); ++j) {
            cout << v1[i][j] << " ";
        }
        cout << '\n';
    }
    
    int* ptr = nullptr;
    int value = NULL;
    int& ref = value;

    for (int x = 0; x < n; ++x) {
        . . .
    }

    if (condition) {
        . . .
    }
    else if (condition) {
        . . .
    }
    else {
        . . .
    }

    while (condition) {
        . . .
    }

    do {
        . . .
    } while (condition);


    switch (val) {
        case 0:
            . . .
            break;
        case 1:
            . . .
            break;
        default:
            . . .
            break;
    }


    return 0;
}

Pointer

特性 所有權轉移 引用計數 與裸指標互換 循環引用 空指標檢查 指向陣列 自定義刪除器
unique_ptr 是(move) 支持 不支持 支持 支持 支持
shared_ptr 是(copy) 支持 支持 支持 支持 支持
weak_ptr 支持 支持 支持 不支持 支持

Standard Template Library

容器 說明
array 固定大小的陣列
vector 可動態增減大小的陣列
forward_list 單向鏈結串列
list 雙向鏈結串列
queue 隊列
deque 雙向隊列
map 關聯式容器,以 key-value 配對儲存
unordered_map 關聯式容器,以 key-value 配對儲存,使用 hash table 實現
set 關聯式容器,以 key 儲存
unordered_set 關聯式容器,以 key 儲存,使用 hash table 實現

Data Structure

Data Structure 中文名稱 Access Search Insertion Deletion Space
Array 陣列 O(1) O(n) O(n) O(n) O(n)
Linked List 連結串列 O(n) O(n) O(1) O(1) O(n)
Linked List(Plus) 連結串列 O(n) O(n) O(1) O(1) O(n)
Linked List(Circle) 連結串列 O(n) O(n) O(1) O(1) O(n)
Linked List(Sentinel) 連結串列 O(n) O(n) O(1) O(1) O(n)
Stack 堆疊 O(n) O(n) O(1) O(1) O(n)
Stack(Linked List) 堆疊 O(n) O(n) O(1) O(1) O(n)
Queue 佇列 O(n) O(n) O(1) O(1) O(n)
Queue(Linked List) 環狀佇列 O(1) O(1) O(1) O(1) O(n)
Circular Queue 環狀佇列 O(1) O(1) O(1) O(1) O(n)

Evaluation of Expression

運算式 範例 時間複雜度 空間複雜度
Infix 2 + 3 O(n) O(n)
Infix (Plus) 2 + 3 O(n) O(n)
Prefix + 2 3 O(n) O(n)
Postfix 2 3 + O(n) O(n)

Matrix

矩陣類型 特點
普通矩陣(Matrix) 元素沒有限制,一般使用二維數組(vector)存儲
稀疏矩陣(Sparse Matrix) 元素中大部分為0,通常使用壓縮存儲方式,可以節省空間
動態矩陣(Dynamic Matrix) 可以動態調整大小的矩陣,通常使用vector<vector>來實現
對稱矩陣(Symmetric Matrix) 矩陣的上下三角形元素相等,可以使用一維數組(vector)存儲,以節省空間
上三角矩陣(Upper Triangular Matrix) 矩陣的下三角形元素均為0,可以使用一維數組(vector)存儲,以節省空間
下三角矩陣(Lower Triangular Matrix) 矩陣的上三角形元素均為0,可以使用一維數組(vector)存儲,以節省空間
布爾矩陣(Boolean Matrix) 矩陣元素只包含0和1,通常用於表示邏輯運算表。
前綴和矩陣(Prefix Sum Matrix) 計算矩陣中某一子矩陣的和,可以使用前綴和矩陣來優化計算速度。
循環矩陣(Circular Matrix) 矩陣中每一行的最後一個元素與下一行的第一個元素相鄰,可以用一維數組(vector)或二維數組(vector)存儲。
Toeplitz矩陣(Toeplitz Matrix) 矩陣中每一條對角線上的元素相等,可以使用一維數組(vector)存儲,以節省空間。

Search

演算法 時間複雜度 空間複雜度
Binary Search O(log n) O(1)
Linear Search O(n) O(1)
Jump Search O(√n) O(1)

Sort

排序演算法 時間複雜度(平均) 時間複雜度(最壞) 空間複雜度
Bubble Sort O(n^2) O(n^2) O(1)
Insertion Sort O(n^2) O(n^2) O(1)
Selection Sort O(n^2) O(n^2) O(1)
Merge Sort O(n log n) O(n log n) O(n)
Quick Sort O(n log n) O(n^2) O(log n)
Heap Sort O(n log n) O(n log n) O(1)
Counting Sort O(n + k) O(n + k) O(k)
Radix Sort O(d(n+k)) O(d(n+k)) O(n+k)

Graph Algorithm

演算法 時間複雜度 空間複雜度 應用
DFS (Depth-First Search) O(V+E) O(V) 遍歷整張圖,尋找連通分量,拓撲排序
BFS (Breadth-First Search) O(V+E) O(W) 遍歷整張圖,最短路徑,尋找連通分量
Dijkstra O((V+E)logV) O(V) 求最短路徑
Bellman-Ford O(VE) O(V) 求最短路徑
Floyd-Warshall O(V^3) O(V^2) 求任意兩點之間的最短路徑
Prim O((V+E)logV) O(V) 求最小生成樹
Kruskal O(ElogE) O(E) 求最小生成樹
Tarjan O(V+E) O(V) 求圖中的強連通分量
Kosaraju O(V+E) O(V) 求圖中的強連通分量
Topological Sort O(V+E) O(V) 拓撲排序
Bridges in a graph O(V+E) O(V) 尋找橋
Articulation points in a graph O(V+E) O(V) 尋找割點

Tree

Data Structure 中文名稱
Binary Tree 二叉樹
Binary Search Tree 二叉搜索樹
Balanced Binary Tree 平衡二叉樹
B-Tree B樹
B+ Tree B+樹
Trie 字典樹
Huffman Tree 哈夫曼樹
Ternary Tree 十叉樹
2-3 Tree 23樹
Quadtree 四分樹
Octree 八叉樹
KD-Tree K-Dimensional Tree
Suffix Tree 後綴樹
Splay Tree 節點數列樹
Max Heap 最大堆
Fibonacci Heap 斐波那契堆
Index Tree 索引樹
Merkle Tree 默克爾樹
Segment Tree 線段樹
Trie 前綴樹
Winner Tree 勝者樹
Loser Tree 敗者樹

String

演算法 時間複雜度 空間複雜度
KMP O(n+m) O(m)
Boyer-Moore O(nm) O(m)
Rabin-Karp O(nm) O(1)
Z Algorithm O(n) O(n)
Suffix Array O(nlogn) O(n)
Trie O(m*len_alph) O(m*len_alph)
Aho-Corasick O(n+m+k) O(m*len_alph)
Manacher O(n) O(n)
Longest Common Substring O(mn) O(mn)
Longest Common Subsequence O(mn) O(mn)
Edit Distance O(mn) O(mn)
  • n代表主字串的長度
  • m代表子字串的長度
  • k代表匹配次數
  • len_alph代表字元集合的大小

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages