數據結構: C++實現常用算法及數據結構

一、數組與鏈表

1、數組是一組連續的內存空間,可以進行隨機訪問,其增刪操作較為低效。鏈表是由一系列結點組成,每個結點包含數據和指向下一個結點的指針,其插入刪除操作較為高效,但是訪問元素時需要遍歷整個鏈表,時間複雜度為O(n)。

2、示例代碼:

//定義一個數組
int arr[5] = {1,2,3,4,5};

//定義一個鏈表結點
struct ListNode {
    int val;
    ListNode* next;
    ListNode(int x) : val(x), next(NULL) {}
};

//創建鏈表
ListNode* head = new ListNode(1);
ListNode* node1 = new ListNode(2);
ListNode* node2 = new ListNode(3);
ListNode* node3 = new ListNode(4);
ListNode* node4 = new ListNode(5);
head->next = node1;
node1->next = node2;
node2->next = node3;
node3->next = node4;

二、棧和隊列

1、棧是一種後進先出的數據結構,其存儲方式可以使用數組或鏈表實現。可以使用棧來實現一些逆序輸出的問題,如字符串逆置、括號匹配等。隊列是一種先進先出的數據結構,其存儲方式同樣可以使用數組或鏈表實現。隊列可以用來解決廣度優先遍歷的問題。

2、示例代碼:

//定義一個棧
stack stk;
stk.push(1);
stk.push(2);
stk.push(3);
int x = stk.top(); //獲取棧頂元素
stk.pop(); //彈出棧頂元素

//定義一個隊列
queue q;
q.push(1);
q.push(2);
q.push(3);
int x = q.front(); //獲取隊首元素
q.pop(); //彈出隊首元素

三、哈希表

哈希表是一種根據鍵(key)直接訪問內存地址的數據結構,其查找、插入、刪除操作的平均時間複雜度為O(1)。哈希函數是實現哈希表的關鍵,決定了如何將鍵轉化為內存地址。哈希函數需要滿足以下兩個條件:(1)散列均勻;(2)盡量避免哈希衝突。常用的哈希函數包括取模法、乘法哈希等。

2、示例代碼:

//定義一個哈希表
unordered_map mp;
mp["apple"] = 10;
mp["orange"] = 3;

//查找元素
if (mp.find("apple") != mp.end()) {
    int x = mp["apple"];
}

//遍歷哈希表
for (auto& it : mp) {
    cout << it.first << ":" << it.second << endl;
}

四、堆

堆是一種動態的數據結構,它分為最大堆和最小堆。其中最大堆要求父結點的值大於或等於子結點的值,最小堆要求父結點的值小於或等於子結點的值。堆可以用於解決一些查找最大/小值的問題,如Top K 問題、求中位數等。

2、示例代碼:

//定義一個最小堆
priority_queue<int, vector, greater> pq;
pq.push(3);
pq.push(1);
pq.push(4);
int x = pq.top(); //獲取堆頂元素
pq.pop(); //彈出堆頂元素

五、圖

圖由結點和邊組成,其中結點可以包含任意信息,邊可以包含權值等信息。圖的遍歷方式有深度優先遍歷和廣度優先遍歷。深度優先遍歷可以使用遞歸或棧來實現,廣度優先遍歷可以使用隊列來實現。圖的常見算法包括最短路徑算法、最小生成樹算法、網絡流算法等。

2、示例代碼:

//定義一個圖(使用鄰接表表示)
vector<vector> graph(n);
graph[0].push_back(1);
graph[0].push_back(2);
graph[1].push_back(3);
graph[2].push_back(3);

//DFS遍歷
vector visited(n); //標記是否訪問過
void DFS(int node) {
    visited[node] = true;
    //訪問當前結點
    for (int i = 0; i < graph[node].size(); i++) {
        int next_node = graph[node][i];
        if (!visited[next_node]) {
            DFS(next_node);
        }
    }
}

//BFS遍歷
queue q;
vector visited(n); //標記是否訪問過
void BFS(int start) {
    q.push(start);
    visited[start] = true;
    while (!q.empty()) {
        int node = q.front();
        q.pop();
        //訪問當前結點
        for (int i = 0; i < graph[node].size(); i++) {
            int next_node = graph[node][i];
            if (!visited[next_node]) {
                q.push(next_node);
                visited[next_node] = true;
            }
        }
    }
}

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/190061.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-29 13:53
下一篇 2024-11-29 13:53

相關推薦

  • 蝴蝶優化算法Python版

    蝴蝶優化算法是一種基於仿生學的優化算法,模仿自然界中的蝴蝶進行搜索。它可以應用於多個領域的優化問題,包括數學優化、工程問題、機器學習等。本文將從多個方面對蝴蝶優化算法Python版…

    編程 2025-04-29
  • Python實現爬樓梯算法

    本文介紹使用Python實現爬樓梯算法,該算法用於計算一個人爬n級樓梯有多少種不同的方法。 有一樓梯,小明可以一次走一步、兩步或三步。請問小明爬上第 n 級樓梯有多少種不同的爬樓梯…

    編程 2025-04-29
  • Python 常用數據庫有哪些?

    在Python編程中,數據庫是不可或缺的一部分。隨着互聯網應用的不斷擴大,處理海量數據已成為一種趨勢。Python有許多成熟的數據庫管理系統,接下來我們將從多個方面介紹Python…

    編程 2025-04-29
  • AES加密解密算法的C語言實現

    AES(Advanced Encryption Standard)是一種對稱加密算法,可用於對數據進行加密和解密。在本篇文章中,我們將介紹C語言中如何實現AES算法,並對實現過程進…

    編程 2025-04-29
  • Harris角點檢測算法原理與實現

    本文將從多個方面對Harris角點檢測算法進行詳細的闡述,包括算法原理、實現步驟、代碼實現等。 一、Harris角點檢測算法原理 Harris角點檢測算法是一種經典的計算機視覺算法…

    編程 2025-04-29
  • 數據結構與算法基礎青島大學PPT解析

    本文將從多個方面對數據結構與算法基礎青島大學PPT進行詳細的闡述,包括數據類型、集合類型、排序算法、字符串匹配和動態規劃等內容。通過對這些內容的解析,讀者可以更好地了解數據結構與算…

    編程 2025-04-29
  • 瘦臉算法 Python 原理與實現

    本文將從多個方面詳細闡述瘦臉算法 Python 實現的原理和方法,包括該算法的意義、流程、代碼實現、優化等內容。 一、算法意義 隨着科技的發展,瘦臉算法已經成為了人們修圖中不可缺少…

    編程 2025-04-29
  • 數據結構學生成績管理系統

    在現代教育中,學生成績的管理已經成為了一個不可或缺的部分。藉助數據結構,一個高效、可靠的學生成績管理系統可以被輕鬆實現。 一、數據結構的選擇 在構建學生成績管理系統時,選擇合適的數…

    編程 2025-04-29
  • 神經網絡BP算法原理

    本文將從多個方面對神經網絡BP算法原理進行詳細闡述,並給出完整的代碼示例。 一、BP算法簡介 BP算法是一種常用的神經網絡訓練算法,其全稱為反向傳播算法。BP算法的基本思想是通過正…

    編程 2025-04-29
  • 粒子群算法Python的介紹和實現

    本文將介紹粒子群算法的原理和Python實現方法,將從以下幾個方面進行詳細闡述。 一、粒子群算法的原理 粒子群算法(Particle Swarm Optimization, PSO…

    編程 2025-04-29

發表回復

登錄後才能評論