首頁 後端開發 C++ CS-第 5 週

CS-第 5 週

Dec 28, 2024 am 11:38 AM

資料結構

訊息結構是記憶中組織訊息的形式。在記憶體中組織資料的方法有很多種。

抽象資料結構是我們概念上想像的結構。熟悉這些抽象結構,以後在實務上實作資料結構就更容易了。


堆疊和佇列

隊列是一種抽象資料結構。
佇列資料結構依照 FIFO (先進先出,「第一個加入的元素先出現」) 規則運作。
可以想像為人們在景點排隊的例子:第一個排隊的人先進去,最後一個人最後進去。

可以使用

佇列執行以下操作:

  • 入隊:將新元素加入隊列末端。
  • 出隊:從隊列開頭移除一個元素。

Stack 資料結構依照 LIFO (後進先出,「最後新增的元素先出現」) 規則運作。 例如,廚房裡疊盤子:先拿最後一個盤子。

堆疊有以下操作:

  • 壓入:將新元素放入堆疊。
  • 彈出:從堆疊中移除一個元素。

大批

Array 是一種在記憶體中依序儲存資料的方法。數組可以可視化為:

CS- Week 5

記憶體可能包含其他程式、函數和變數儲存的其他值,以及先前使用過且不再使用的冗餘值:

CS- Week 5

如果我們想為陣列新增一個新元素 - 4 -,我們需要分配新的記憶體並將舊數組移入其中。這個新記憶體可能充滿了垃圾值

:

CS- Week 5如果我們將元素移動到數組並添加新值,新值將覆蓋新分配的記憶體中舊的不必要的值:

這種方法的缺點是每次新增元素時都需要複製整個陣列。
如果我們把 4 放在記憶體的其他地方會怎麼樣?那麼,根據定義,這不再是一個數組,因為 4 與記憶體中的數組元素不連續。

有時,程式設計師會分配比所需更多的記憶體(例如,300 個元素對應30 個元素)。但這是一個糟糕的設計,因為它浪費了系統資源,而且在大多數情況下額外的記憶體是不必要的。因此,根據具體需要分配記憶體非常重要。


鍊錶

鍊錶是C程式語言中最強大的資料結構之一。它們允許將位於不同記憶體區域的值組合到一個清單中。它還允許我們根據需要動態擴展或縮小清單。

CS- Week 5

每個節點儲存兩個值:

  • 值;
  • 是一個指針,保存下一個節點的記憶體位址。 最後一個節點包含NULL,表示其後沒有其他元素。

CS- Week 5

我們將鍊錶第一個元素的位址保存到一個指標(指標).

CS- Week 5

在C語言中,我們可以將節點寫成:

typedef struct node
{
    int number;
    struct node *next;
}
node;
登入後複製
登入後複製
登入後複製
我們來看看

鍊錶的建立過程:

  • 我們聲明節點 *list:

CS- Week 5

  • 為節點分配記憶體:

CS- Week 5

  • 輸入節點的值:n->number = 1:

CS- Week 5

  • 我們將節點的下一個索引設為 NULL: n->next = NULL:

CS- Week 5

  • 讓我們將列表等於:

CS- Week 5

  • 依照相同的順序,我們建立一個值為 2 的新節點:

CS- Week 5

  • 為了連接兩個節點,我們將 n 的下一個索引設為列表:

CS- Week 5

  • 最後,我們將列表設為 n。現在我們有一個由兩個元素組成的鍊錶:

CS- Week 5

在C語言中,我們可以將這個過程的程式碼寫成如下:

typedef struct node
{
    int number;
    struct node *next;
}
node;
登入後複製
登入後複製
登入後複製

使用鍊錶時有幾個缺點:

  • 更多記憶體:對於每個元素,不僅需要儲存元素本身的值,還需要儲存指向下一個元素的指標。
  • 透過索引呼叫元素:在陣列中我們可以透過索引來呼叫某個元素,但在鍊錶中這是不可能的。要找到特定元素的位置,需要從第一個元素開始依序遍歷所有元素。

二元搜尋樹 (BST)是一種可以有效儲存、搜尋和擷取資料的資訊結構。
讓我們得到一個已排序的數字序列:

CS- Week 5

我們將中心的元素放在頂部,比中心元素小的值放在左邊,較大的值放在右邊:

CS- Week 5

我們使用指標將每個元素相互連接:

CS- Week 5

以下程式碼展示如何實作BST:

#include <cs50.h>
#include <stdio.h>
#include <stdlib.h>

typedef struct node
{
    int number;
    struct node *next;
}
node;

int main(int argc, char *argv[])
{
    // Linked list'ni e'lon qilamiz
    node *list = NULL;

    // Har bir buyruq qatori argumenti uchun
    for (int i = 1; i < argc; i++)
    {
        // Argumentni butun songa o‘tkazamiz
        int number = atoi(argv[i]);

        // Yangi element uchun xotira ajratamiz
        node *n = malloc(sizeof(node));
        if (n == NULL)
        {
            return 1;
        }
        n->number = number;
        n->next = NULL;

        // Linked list'ning boshiga node'ni qo‘shamiz
        n->next = list;
        list = n;
    }

    // Linked list elementlarini ekranga chiqaramiz
    node *ptr = list;
    while (ptr != NULL)
    {
        printf("%i\n", ptr->number);
        ptr = ptr->next;
    }

    // Xotirani bo‘shatamiz
    ptr = list;
    while (ptr != NULL)
    {
        node *next = ptr->next;
        free(ptr);
        ptr = next;
    }
}
登入後複製

我們為每個節點分配內存,其值以數位形式存儲,因此每個節點都有左和右指示器。 print_tree 函數從左到右依序遞歸列印每個節點。 free_tree 函數遞歸地從記憶體釋放資料結構的所有節點。

BST的優點:

  • 動態性:我們可以有效地新增或刪除元素。
  • 搜尋效率:在BST中搜尋給定元素所需的時間為O(log n),因為每次搜尋時都會排除一半的樹。

BST 的缺點:

  • 如果樹的平衡被打破(例如所有元素都放在一行),搜尋效率就會下降到O(n)。
  • 需要為每個節點儲存左指針和右指針,這會增加電腦的記憶體消耗。

字典

字典就像一本字典,它包含一個單字及其定義,它的元素key (key)value(值)

如果我們查詢

Dictionary 中的某個元素,它會在 O(1) 時間內傳回該元素。字典可以透過散列來提供精確的速度。

雜湊是使用特殊演算法將輸入數組中的資料轉換為位元序列的過程。

雜湊函數是一種從任意長度的字串產生固定長度位的字串的演算法。

雜湊表是陣列和鍊錶的完美組合。我們可以這樣想:

CS- Week 5

碰撞 (碰撞) 是指兩個不同的輸入產生一個雜湊值。在上圖中,發生碰撞的元素以鍊錶的形式連接起來。透過改進哈希函數,可以降低碰撞機率。

雜湊函數的一個簡單範例是:

typedef struct node
{
    int number;
    struct node *next;
}
node;
登入後複製
登入後複製
登入後複製

本文使用 CS50x 2024 原始碼。

以上是CS-第 5 週的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1662
14
CakePHP 教程
1418
52
Laravel 教程
1311
25
PHP教程
1261
29
C# 教程
1234
24
C#與C:歷史,進化和未來前景 C#與C:歷史,進化和未來前景 Apr 19, 2025 am 12:07 AM

C#和C 的歷史與演變各有特色,未來前景也不同。 1.C 由BjarneStroustrup在1983年發明,旨在將面向對象編程引入C語言,其演變歷程包括多次標準化,如C 11引入auto關鍵字和lambda表達式,C 20引入概念和協程,未來將專注於性能和系統級編程。 2.C#由微軟在2000年發布,結合C 和Java的優點,其演變注重簡潔性和生產力,如C#2.0引入泛型,C#5.0引入異步編程,未來將專注於開發者的生產力和雲計算。

C和XML的未來:新興趨勢和技術 C和XML的未來:新興趨勢和技術 Apr 10, 2025 am 09:28 AM

C 和XML的未來發展趨勢分別為:1)C 將通過C 20和C 23標準引入模塊、概念和協程等新特性,提升編程效率和安全性;2)XML將繼續在數據交換和配置文件中佔據重要地位,但會面臨JSON和YAML的挑戰,並朝著更簡潔和易解析的方向發展,如XMLSchema1.1和XPath3.1的改進。

繼續使用C:耐力的原因 繼續使用C:耐力的原因 Apr 11, 2025 am 12:02 AM

C 持續使用的理由包括其高性能、廣泛應用和不斷演進的特性。 1)高效性能:通過直接操作內存和硬件,C 在系統編程和高性能計算中表現出色。 2)廣泛應用:在遊戲開發、嵌入式系統等領域大放異彩。 3)不斷演進:自1983年發布以來,C 持續增加新特性,保持其競爭力。

C多線程和並發:掌握並行編程 C多線程和並發:掌握並行編程 Apr 08, 2025 am 12:10 AM

C 多線程和並發編程的核心概念包括線程的創建與管理、同步與互斥、條件變量、線程池、異步編程、常見錯誤與調試技巧以及性能優化與最佳實踐。 1)創建線程使用std::thread類,示例展示瞭如何創建並等待線程完成。 2)同步與互斥使用std::mutex和std::lock_guard保護共享資源,避免數據競爭。 3)條件變量通過std::condition_variable實現線程間的通信和同步。 4)線程池示例展示瞭如何使用ThreadPool類並行處理任務,提高效率。 5)異步編程使用std::as

C和XML:探索關係和支持 C和XML:探索關係和支持 Apr 21, 2025 am 12:02 AM

C 通過第三方庫(如TinyXML、Pugixml、Xerces-C )與XML交互。 1)使用庫解析XML文件,將其轉換為C 可處理的數據結構。 2)生成XML時,將C 數據結構轉換為XML格式。 3)在實際應用中,XML常用於配置文件和數據交換,提升開發效率。

C深度潛水:掌握記憶管理,指針和模板 C深度潛水:掌握記憶管理,指針和模板 Apr 07, 2025 am 12:11 AM

C 的內存管理、指針和模板是核心特性。 1.內存管理通過new和delete手動分配和釋放內存,需注意堆和棧的區別。 2.指針允許直接操作內存地址,使用需謹慎,智能指針可簡化管理。 3.模板實現泛型編程,提高代碼重用性和靈活性,需理解類型推導和特化。

現代C設計模式:構建可擴展和可維護的軟件 現代C設計模式:構建可擴展和可維護的軟件 Apr 09, 2025 am 12:06 AM

現代C 設計模式利用C 11及以後的新特性實現,幫助構建更靈活、高效的軟件。 1)使用lambda表達式和std::function簡化觀察者模式。 2)通過移動語義和完美轉發優化性能。 3)智能指針確保類型安全和資源管理。

C社區:資源,支持和發展 C社區:資源,支持和發展 Apr 13, 2025 am 12:01 AM

C 學習者和開發者可以從StackOverflow、Reddit的r/cpp社區、Coursera和edX的課程、GitHub上的開源項目、專業諮詢服務以及CppCon等會議中獲得資源和支持。 1.StackOverflow提供技術問題的解答;2.Reddit的r/cpp社區分享最新資訊;3.Coursera和edX提供正式的C 課程;4.GitHub上的開源項目如LLVM和Boost提陞技能;5.專業諮詢服務如JetBrains和Perforce提供技術支持;6.CppCon等會議有助於職業

See all articles