| 作業屬於的課程:【計算機基礎與程式設計:https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP】 |
| 作業的要求:https://www.cnblogs.com/rocedu/p/9577842.html#WEEK06 |
| 作業的目標:Polya如何解決問題 簡單型別與組合型別 複合資料結構 查詢與排序演算法 演算法複雜度 遞迴 程式碼安全 |
| 作業的網址: https://www.cnblogs.com/wangxianglong999/p/18523612 |
教材學習內容解決:
一、Polya的解題思路:
1.理解問題
2.擬定計劃
3.執行計劃
4.回顧
二、簡單型別與組合型別:
1.特點的不同:
簡單型別: 具有固定的大小和表示方式。例如,在許多程式語言中,整數型別通常佔用一定數量的位元組,並且以二進位制補碼的形式儲存。
不能再被分解為其他更基本的型別。比如整數型別、字元型別、布林型別等都是簡單型別。
通常在記憶體中佔據連續的儲存區域,訪問速度相對較快。
組合型別: 具有更復雜的結構,可以包含多個不同型別的元素。
通常需要更多的記憶體空間來儲存,並且訪問其中的元素可能需要一定的計算開銷。
可以根據具體的需求進行靈活的定義和擴充套件。
2.使用區別: 簡單型別適用於表示基本的資料值,而組合型別則可以用於表示更復雜的物件和資料結構。
三、複合資料結構
複合資料結構是由多種基本資料型別或其他複合資料結構組合而成的資料結構,它能夠更加靈活地表示和處理複雜的資料。
Ⅰ常見的複合資料結構型別
-
陣列
- 由相同型別的元素組成的有序集合。可以是一維陣列、二維陣列或多維陣列。
- 特點:透過索引可以快速訪問特定位置的元素,但大小通常在建立時確定,不易動態改變。
- 例如:一個儲存整數的一維陣列,可以用於記錄一系列的成績資料。
-
結構體
- 由不同型別的成員變數組成的複合資料型別。
- 特點:可以將不同型別的資料組合在一起,方便表示具有多個屬性的物件。
- 例如:定義一個表示學生的結構體,包含學生的姓名(字串型別)、年齡(整數型別)、成績(浮點數型別)等成員變數。
-
連結串列
- 由一系列節點組成,每個節點包含資料和指向下一個節點的指標。
- 特點:可以動態地新增和刪除節點,適合頻繁進行插入和刪除操作的場景。
- 例如:實現一個連結串列來儲存一系列整數,當需要新增新的整數時,可以在連結串列的任意位置插入新節點。
-
棧和佇列
- 棧是一種後進先出(LIFO)的資料結構,而佇列是一種先進先出(FIFO)的資料結構。
- 特點:棧常用於函式呼叫、表示式求值等場景;佇列常用於任務排程、訊息傳遞等場景。
- 例如:用棧來實現逆波蘭表示式的求值,用佇列來模擬銀行排隊系統。
-
樹和圖
- 樹是一種層次結構的資料結構,每個節點可以有多個子節點。圖是由頂點和邊組成的非線性資料結構。
- 特點:樹可以用於表示檔案系統、組織結構等;圖可以用於表示網路、社交關係等複雜的關係結構。
- 例如:用二叉樹實現二叉搜尋樹,用於快速查詢和插入元素;用圖來表示城市之間的交通網路,以便進行路徑規劃。
Ⅱ、複合資料結構的優點
-
靈活性
- 可以根據具體需求組合不同型別的資料,更好地適應複雜的資料表示和處理要求。
-
可擴充套件性
- 可以方便地新增新的成員或修改現有結構,以滿足不斷變化的需求。
-
高效性
- 針對特定的問題,可以選擇最適合的複合資料結構來提高資料處理的效率。
Ⅲ、複合資料結構的應用場景
-
資料庫管理
- 資料庫中的表可以看作是一種複合資料結構,由多個欄位組成,用於儲存和管理大量的資料。
-
作業系統
- 作業系統中的程序管理、記憶體管理等都涉及到各種複合資料結構的使用。
-
圖形影像處理
- 影像可以用二維陣列表示,圖形的層次結構可以用樹來表示。
-
演算法設計
- 許多演算法需要使用特定的複合資料結構來實現高效的計算,如排序演算法、搜尋演算法等。
總之,複合資料結構在程式設計中起著重要的作用,它能夠幫助我們更好地組織和處理複雜的資料,提高程式的效率和可讀性。
四、查詢和排序演算法
查詢和排序演算法是電腦科學中非常重要的演算法型別,它們在資料處理、資料庫管理、搜尋引擎等領域有著廣泛的應用。
Ⅰ、查詢演算法
-
順序查詢
- 原理:從資料集合的一端開始,逐個檢查每個元素,直到找到目標元素或遍歷完整個集合。
- 特點:簡單直觀,適用於小型資料集合或無序資料集合。但對於大型資料集合,查詢效率較低。
- 時間複雜度:在最好情況下,目標元素在第一個位置,時間複雜度為 O(1);在最壞情況下,目標元素在最後一個位置或不在集合中,時間複雜度為 O(n),其中 n 是資料集合的大小。
-
二分查詢
- 原理:對於有序資料集合,每次將集合分成兩部分,根據目標元素與中間元素的大小關係,確定在左半部分還是右半部分繼續查詢。
- 特點:查詢效率高,適用於大型有序資料集合。但要求資料集合必須是有序的。
- 時間複雜度:時間複雜度為 O(log n),其中 n 是資料集合的大小。
-
雜湊查詢
- 原理:透過雜湊函式將目標元素的關鍵值對映到一個特定的位置,然後在該位置進行查詢。
- 特點:查詢速度非常快,平均時間複雜度為 O(1)。但需要選擇合適的雜湊函式,以避免衝突。
- 時間複雜度:在理想情況下,時間複雜度為 O(1)。但在存在衝突的情況下,時間複雜度可能會增加。
Ⅱ、排序演算法
-
氣泡排序
- 原理:重複地遍歷要排序的數列,一次比較兩個元素,如果它們的順序錯誤就把它們交換過來。
- 特點:簡單易懂,適用於小型資料集合。但效率較低,尤其是對於已經接近有序的數列。
- 時間複雜度:平均時間複雜度和最壞時間複雜度為 O(n²),其中 n 是資料集合的大小。最好時間複雜度為 O(n),當資料集合已經有序時。
-
快速排序
- 原理:透過一趟排序將待排記錄分隔成獨立的兩部分,其中一部分記錄的關鍵字均比另一部分的關鍵字小,然後分別對這兩部分記錄繼續進行排序,以達到整個序列有序。
- 特點:效率高,是實際應用中最常用的排序演算法之一。但對於小規模資料集合,效能可能不如其他簡單排序演算法。
- 時間複雜度:平均時間複雜度為 O(n log n),其中 n 是資料集合的大小。最壞時間複雜度為 O(n²),當資料集合已經有序或逆序時。
-
歸併排序
- 原理:將兩個或多個有序的子序列合併成一個有序的序列。
- 特點:穩定,適用於大型資料集合。但需要額外的儲存空間。
- 時間複雜度:時間複雜度始終為 O(n log n),其中 n 是資料集合的大小。
-
堆排序
- 原理:利用堆這種資料結構進行排序。首先將待排序的數列構建成一個大頂堆或小頂堆,然後將堆頂元素與最後一個元素交換,再調整堆,重複這個過程直到整個數列有序。
- 特點:效率高,不需要額外的儲存空間。但實現相對複雜。
- 時間複雜度:時間複雜度為 O(n log n),其中 n 是資料集合的大小。
總之,查詢和排序演算法各有特點,在實際應用中需要根據具體情況選擇合適的演算法。對於小型資料集合,可以選擇簡單的演算法;對於大型資料集合,需要考慮演算法的效率和穩定性。
五、演算法複雜度
演算法複雜度是衡量演算法效率的重要指標,它主要包括時間複雜度和空間複雜度。
Ⅰ、時間複雜度
-
定義
- 時間複雜度是指演算法執行所需的時間與輸入資料規模之間的關係。它反映了演算法隨著輸入資料規模的增長,執行時間的增長趨勢。
-
表示方法
- 通常用大 O 符號表示。例如,O(n)表示演算法的執行時間與輸入資料規模 n 成正比;O(n²)表示演算法的執行時間與輸入資料規模 n 的平方成正比。
-
常見時間複雜度型別及分析:
- O(1):常數時間複雜度,表示演算法的執行時間不隨輸入資料規模的增長而增長。例如,訪問陣列中的特定元素,無論陣列大小如何,時間都是固定的。
- O(log n):對數時間複雜度,表示演算法的執行時間隨著輸入資料規模的增長而以對數方式增長。例如,二分查詢演算法,每次查詢都將資料規模減半,所以時間複雜度為 O(log n)。
- O(n):線性時間複雜度,表示演算法的執行時間與輸入資料規模成正比。例如,遍歷一個陣列,時間與陣列的大小成正比。
- O(n log n):線性對數時間複雜度,常見於一些高效的排序演算法,如快速排序和歸併排序。
- O(n²):平方時間複雜度,表示演算法的執行時間與輸入資料規模的平方成正比。例如,氣泡排序等簡單的排序演算法。
- O(2ⁿ):指數時間複雜度,表示演算法的執行時間隨著輸入資料規模的增長呈指數增長。這種演算法通常在輸入資料規模較小時可行,但隨著資料規模的增大,很快就會變得非常耗時。
Ⅱ、空間複雜度
-
定義
- 空間複雜度是指演算法執行所需的儲存空間與輸入資料規模之間的關係。它反映了演算法在執行過程中所佔用的記憶體空間的增長趨勢。
-
表示方法
- 同樣用大 O 符號表示。例如,O(1)表示演算法所需的儲存空間是常數,不隨輸入資料規模的增長而增長;O(n)表示演算法所需的儲存空間與輸入資料規模成正比。
-
常見空間複雜度型別及分析:
- O(1):常數空間複雜度,表示演算法所需的儲存空間不隨輸入資料規模的增長而增長。例如,一些只需要幾個變數就能完成的演算法。
- O(n):線性空間複雜度,表示演算法所需的儲存空間與輸入資料規模成正比。例如,建立一個與輸入陣列大小相同的新陣列。
- O(n²):平方空間複雜度,表示演算法所需的儲存空間與輸入資料規模的平方成正比。這種情況相對較少見,通常出現在一些特殊的演算法中。
在分析演算法複雜度時,通常更關注時間複雜度,因為時間是演算法執行效率的直接體現。但在某些情況下,空間複雜度也很重要,特別是在處理大規模資料或記憶體受限的環境中。
總之,演算法複雜度是評估演算法效能的重要指標,透過分析時間複雜度和空間複雜度,可以選擇更高效的演算法來解決實際問題。
六、遞迴
遞迴是一種程式設計技術,它允許函式在其定義中呼叫自身。
Ⅰ、遞迴的基本概念
-
定義
- 遞迴是一種解決問題的方法,它將問題分解為更小的子問題,直到子問題可以直接解決。然後,透過組合子問題的解來得到原始問題的解。
-
組成部分
- 遞迴函式通常由兩部分組成:基本情況和遞迴情況。
- 基本情況是指可以直接解決的最小子問題。當函式遇到基本情況時,它不再進行遞迴呼叫,而是直接返回結果。
- 遞迴情況是指將問題分解為更小的子問題,並透過遞迴呼叫函式來解決這些子問題。
Ⅱ、遞迴的工作原理
-
呼叫過程
- 當函式呼叫自身時,程式會建立一個新的函式呼叫棧幀,用於儲存函式的區域性變數、引數和返回地址。
- 每次遞迴呼叫都會建立一個新的棧幀,直到達到基本情況。
- 當函式遇到基本情況時,它開始返回結果,並逐步彈出棧幀,將子問題的解組合起來,最終得到原始問題的解。
-
優點
- 遞迴可以使程式碼更加簡潔和易於理解,特別是對於一些具有遞迴性質的問題,如樹的遍歷、階乘計算等。
- 遞迴可以將複雜的問題分解為簡單的子問題,從而更容易解決。
-
缺點
- 遞迴可能會導致棧溢位錯誤,特別是當遞迴深度較大時。因為每次遞迴呼叫都會建立一個新的棧幀,佔用一定的記憶體空間。
- 遞迴的執行效率通常比非遞迴演算法低,因為它需要額外的棧空間和函式呼叫開銷。
Ⅲ、遞迴的應用場景
-
數學計算
- 計算階乘、斐波那契數列等。
- 例如,計算階乘可以用遞迴的方式實現:
factorial(n) = n * factorial(n-1)
,其中基本情況是factorial(0) = 1
。
-
資料結構操作
- 樹的遍歷、圖的搜尋等。
- 例如,二叉樹的前序遍歷可以用遞迴的方式實現:先訪問根節點,然後遞迴遍歷左子樹和右子樹。
-
問題求解
- 漢諾塔問題、八皇后問題等。
- 這些問題通常具有遞迴性質,可以透過遞迴的方式來求解。
總之,遞迴是一種強大的程式設計技術,但在使用時需要注意遞迴深度和執行效率等問題。在實際應用中,應根據具體情況選擇是否使用遞迴,或者結合其他程式設計技術來解決問題。
七、程式碼安全
程式碼安全是軟體開發中至關重要的一個方面,它涉及保護軟體系統免受各種惡意攻擊和漏洞的影響。
Ⅰ、程式碼安全的重要性
-
保護使用者資料
- 確保使用者的敏感資訊,如個人身份資訊、財務資料等,不被未經授權的訪問、竊取或篡改。
- 防止資料洩露可能導致的嚴重後果,如身份盜竊、財務損失和聲譽損害。
-
維護系統穩定性
- 防止惡意程式碼注入、緩衝區溢位等攻擊,這些攻擊可能導致系統崩潰、服務中斷或效能下降。
- 確保軟體系統能夠持續穩定地執行,為使用者提供可靠的服務。
-
遵守法律法規
- 許多國家和地區都有關於資料保護和資訊保安的法律法規,確保程式碼安全是遵守這些法規的必要條件。
- 避免因違反法律法規而面臨的法律責任和罰款。
Ⅱ、常見的程式碼安全問題
-
輸入驗證漏洞
- 未能對使用者輸入進行充分的驗證和過濾,可能導致 SQL 注入、跨站指令碼攻擊(XSS)等安全問題。
- 例如,在 Web 應用中,如果對使用者輸入的表單資料沒有進行嚴格的驗證,攻擊者可以透過構造惡意的輸入來執行 SQL 查詢或在網頁中插入惡意指令碼。
-
緩衝區溢位
- 當程式向緩衝區寫入資料時,如果寫入的資料超過了緩衝區的大小,就可能導致緩衝區溢位。
- 攻擊者可以利用緩衝區溢位漏洞來執行惡意程式碼或獲取系統許可權。
-
許可權提升漏洞
- 程式中存在的許可權提升漏洞可能允許攻擊者以較低許可權的使用者身份執行程式碼,從而獲得更高的許可權。
- 例如,在作業系統中,如果一個程式存在許可權提升漏洞,攻擊者可以利用這個漏洞來獲取管理員許可權。
-
程式碼注入漏洞
- 允許攻擊者將惡意程式碼注入到程式中執行,可能導致嚴重的安全問題。
- 例如,在動態指令碼語言中,如果對使用者輸入的指令碼沒有進行嚴格的過濾,攻擊者可以注入惡意指令碼並執行。
Ⅲ、提高程式碼安全的方法
-
輸入驗證和過濾
- 對使用者輸入進行嚴格的驗證和過濾,確保輸入的資料符合預期的格式和範圍。
- 可以使用正規表示式、白名單和黑名單等技術來進行輸入驗證。
-
安全編碼規範
- 遵循安全編碼規範,如避免使用不安全的函式、正確處理錯誤和異常等。
- 例如,在 C 和 C++語言中,應避免使用容易導致緩衝區溢位的函式,如 strcpy 和 sprintf。
-
程式碼審查
- 進行定期的程式碼審查,以發現潛在的安全漏洞和錯誤。
- 程式碼審查可以由開發團隊內部進行,也可以邀請外部安全專家參與。
-
安全測試
- 進行各種安全測試,如漏洞掃描、滲透測試等,以發現軟體系統中的安全漏洞。
- 安全測試可以幫助開發團隊在軟體釋出之前發現和修復安全問題。
-
許可權管理
- 正確管理使用者許可權,確保使用者只能訪問他們被授權的資源。
- 可以使用訪問控制列表(ACL)、角色-based 訪問控制(RBAC)等技術來管理使用者許可權。
總之,程式碼安全是軟體開發中不可忽視的一個方面。開發團隊應該採取一系列措施來提高程式碼的安全性,保護使用者資料和系統的穩定性。
蘇格拉底式提問:
程式碼除錯中的問題和解決過程
- 問題1:設定函式的時候無法使其賦值到變數上
- 問題1解決方案:將printf改成了return,就可以將返回值賦給變數
- 問題2:容易出現一些小的語法錯誤
- 問題2解決方案:邊寫邊改
學習進度條
程式碼行數(新增/累積) | 部落格量(新增/累積) | 學習時間(新增/累積) | 重要成長 | |
---|---|---|---|---|
目標 | 5000行 | 30篇 | 400小時 | |
第一週 | 200/200 | 2/2 | 20/20 | |
第二週 | 300/500 | 2/4 | 18/38 | |
第三週 | 500/1000 | 3/7 | 22/60 | |
第四周 | 300/1300 | 2/9 | 30/90 | |
第五週 | 500/1300 | 2/3 | 30/90 | |
第六週 | 300/800 | 2/5 | 30/90 |