CS-第 5 週
資料結構
訊息結構是記憶中組織訊息的形式。在記憶體中組織資料的方法有很多種。
抽象資料結構是我們概念上想像的結構。熟悉這些抽象結構,以後在實務上實作資料結構就更容易了。
堆疊和佇列
隊列是一種抽象資料結構。
佇列資料結構依照 FIFO (先進先出,「第一個加入的元素先出現」) 規則運作。
可以想像為人們在景點排隊的例子:第一個排隊的人先進去,最後一個人最後進去。
佇列執行以下操作:
- 入隊:將新元素加入隊列末端。
- 出隊:從隊列開頭移除一個元素。
Stack 資料結構依照 LIFO (後進先出,「最後新增的元素先出現」) 規則運作。
例如,廚房裡疊盤子:先拿最後一個盤子。
- 壓入:將新元素放入堆疊。
- 彈出:從堆疊中移除一個元素。
大批
Array 是一種在記憶體中依序儲存資料的方法。數組可以可視化為:
:
如果我們將元素移動到數組並添加新值,新值將覆蓋新分配的記憶體中舊的不必要的值:
這種方法的缺點是每次新增元素時都需要複製整個陣列。
如果我們把 4 放在記憶體的其他地方會怎麼樣?那麼,根據定義,這不再是一個數組,因為 4 與記憶體中的數組元素不連續。
有時,程式設計師會分配比所需更多的記憶體(例如,300 個元素對應30 個元素)。但這是一個糟糕的設計,因為它浪費了系統資源,而且在大多數情況下額外的記憶體是不必要的。因此,根據具體需要分配記憶體非常重要。
鍊錶
鍊錶是C程式語言中最強大的資料結構之一。它們允許將位於不同記憶體區域的值組合到一個清單中。它還允許我們根據需要動態擴展或縮小清單。
每個節點儲存兩個值:
- 值;
- 是一個指針,保存下一個節點的記憶體位址。 最後一個節點包含NULL,表示其後沒有其他元素。
我們將鍊錶第一個元素的位址保存到一個指標(指標).
在C語言中,我們可以將節點寫成:
typedef struct node { int number; struct node *next; } node;
鍊錶的建立過程:
- 我們聲明節點 *list:
- 為節點分配記憶體:
- 輸入節點的值:n->number = 1:
- 我們將節點的下一個索引設為 NULL: n->next = NULL:
- 讓我們將列表等於:
- 依照相同的順序,我們建立一個值為 2 的新節點:
- 為了連接兩個節點,我們將 n 的下一個索引設為列表:
- 最後,我們將列表設為 n。現在我們有一個由兩個元素組成的鍊錶:
在C語言中,我們可以將這個過程的程式碼寫成如下:
typedef struct node { int number; struct node *next; } node;
使用鍊錶時有幾個缺點:
- 更多記憶體:對於每個元素,不僅需要儲存元素本身的值,還需要儲存指向下一個元素的指標。
- 透過索引呼叫元素:在陣列中我們可以透過索引來呼叫某個元素,但在鍊錶中這是不可能的。要找到特定元素的位置,需要從第一個元素開始依序遍歷所有元素。
樹
二元搜尋樹 (BST)是一種可以有效儲存、搜尋和擷取資料的資訊結構。
讓我們得到一個已排序的數字序列:
我們將中心的元素放在頂部,比中心元素小的值放在左邊,較大的值放在右邊:
我們使用指標將每個元素相互連接:
以下程式碼展示如何實作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) 時間內傳回該元素。字典可以透過散列來提供精確的速度。
雜湊是使用特殊演算法將輸入數組中的資料轉換為位元序列的過程。
雜湊函數是一種從任意長度的字串產生固定長度位的字串的演算法。
雜湊表是陣列和鍊錶的完美組合。我們可以這樣想:
碰撞 (碰撞) 是指兩個不同的輸入產生一個雜湊值。在上圖中,發生碰撞的元素以鍊錶的形式連接起來。透過改進哈希函數,可以降低碰撞機率。
雜湊函數的一個簡單範例是:
typedef struct node { int number; struct node *next; } node;
本文使用 CS50x 2024 原始碼。
以上是CS-第 5 週的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

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

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

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

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

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

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

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

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等會議有助於職業
