2024-2025-1 20241328 《計算機基礎與程式設計》第六週學習總結

Eureka23662發表於2024-11-03

2024-2025-1 20241328 《計算機基礎與程式設計》第六週學習總結

作業資訊

課程 2024-2025-1-計算機基礎與程式設計
作業要求 2024-2025-1計算機基礎與程式設計第六週作業
作業目標 Polya如何解決問題,簡單型別與組合型別,複合資料結構,查詢與排序演算法,演算法複雜度,遞迴,程式碼安全
作業正文 2024-2025-1 20241328 《計算機基礎與程式設計》第六週學習總結

教材學習內容總結

一、簡單型別與組合型別
(一)簡單型別
簡單型別(Primitive Types)是程式語言中最基本的資料型別,通常包括整數、浮點數、字元、布林值等,它們是不可再分的基本資料單元。

(二)組合型別
組合型別(Composite Types)是由簡單型別組合而成的資料型別,例如陣列、結構體、類等。它們可以包含多個簡單型別的資料,並且可以進行復雜的操作。

二、複合資料結構
(一)陣列
陣列(Array)是一組相同型別的元素的集合。

(二)連結串列
連結串列(Linked List)是由節點組成的線性資料結構,每個節點包含資料和指向下一個節點的指標。

(三)棧
棧(Stack)是後進先出(LIFO)的資料結構。

(四)佇列
佇列(Queue)是先進先出(FIFO)的資料結構。

(五)樹
樹(Tree)是由節點和邊組成的層次結構,如二叉樹、B樹等。

(六)圖
圖(Graph)是由節點和邊組成的非線性資料結構,用於表示複雜的關係。

三、查詢與排序演算法
(一)查詢演算法

  1. 線性查詢
    線性查詢(Linear Search)是逐個檢查每個元素,直到找到目標元素。

  2. 二分查詢
    二分查詢(Binary Search)是在有序陣列中透過不斷縮小查詢範圍來查詢目標元素。

(二)排序演算法

  1. 氣泡排序
    氣泡排序(Bubble Sort)是透過多次遍歷陣列,比較相鄰元素並交換位置。

  2. 選擇排序
    選擇排序(Selection Sort)是每次選擇最小(或最大)的元素放到已排序部分的末尾。

  3. 插入排序
    插入排序(Insertion Sort)是將未排序部分的元素逐個插入到已排序部分的正確位置。

  4. 快速排序
    快速排序(Quick Sort)是透過選擇一個基準元素,將陣列分為兩部分並遞迴排序。

  5. 歸併排序
    歸併排序(Merge Sort)是將陣列分為兩部分,分別排序後再合併。

四、演算法複雜度
(一)時間複雜度
時間複雜度(Time Complexity)表示演算法執行時間隨輸入規模增長的變化趨勢,常用大O表示法(O(n)、O(n^2)等)。

(二)空間複雜度
空間複雜度(Space Complexity)表示演算法執行過程中所需的額外空間隨輸入規模增長的變化趨勢。

五、遞迴
遞迴是一種程式設計技術,函式直接或間接呼叫自身來解決問題。遞迴通常用於解決可以分解為相同問題的子問題的情況。遞迴的關鍵在於定義遞迴基(終止條件)和遞迴關係(如何將問題分解為子問題)。

六、程式碼安全
(一)輸入驗證
輸入驗證(Input Validation)確保使用者輸入的資料符合預期格式和範圍。

(二)邊界檢查
邊界檢查(Boundary Checking)防止陣列越界、緩衝區溢位等錯誤。

(三)加密
加密(Encryption)對敏感資料進行加密,防止資料洩露。

(四)許可權控制
許可權控制(Access Control)限制不同使用者對系統資源的訪問許可權。

(五)日誌記錄
日誌記錄(Logging)記錄系統操作和錯誤資訊,便於追蹤和分析問題。

(六)安全編碼實踐
安全編碼實踐(Secure Coding Practices)遵循安全編碼規範,避免常見的安全漏洞。

基於AI的學習

我:我在學習C語言查詢與排序演算法的相關知識,對我進行蘇格拉底式的提問,一次一個問題
AI:好的,我們從基礎開始,透過一系列問題來幫助你深入理解C語言中的查詢與排序演算法。

首先,讓我們談談查詢演算法:

問題1:在C語言中,什麼是線性查詢(Linear Search),它的時間複雜度是多少?

請詳細描述,並解釋你的答案。
我:線性查詢是一種簡單的搜尋演算法,用於在無序陣列或列表中查詢特定元素。它的工作原理是從陣列的第一個元素開始,逐一檢查每個元素,直到找到目標元素或遍歷完整個陣列。如果找到目標元素,演算法返回其位置;如果遍歷完整個陣列仍未找到目標元素,則返回一個表示未找到的值。線性查詢的時間複雜度是O(n),其中n是陣列中元素的數量。這是因為最壞情況下,演算法可能需要檢查陣列中的每一個元素才能找到目標元素或確定目標元素不存在。
AI:非常好!你對線性查詢的概念和時間複雜度有了清晰的理解。接下來,讓我們討論排序演算法:

問題2:在C語言中,什麼是氣泡排序(Bubble Sort),它的基本思想是什麼?另外,你能推斷出它的時間複雜度嗎?

請詳細解釋這兩個方面。
我:氣泡排序是一種簡單的排序演算法,它透過重複地遍歷要排序的列表,比較相鄰的元素並交換它們的位置,直到整個列表排序完成。氣泡排序的時間複雜度可以透過分析其最壞情況下的比較次數來推斷。
AI:你正確地描述了氣泡排序的基本思想以及其時間複雜度。

儘管你的表述有些簡化,但對於我們的目的來說已經足夠。

總結一下,你現在對線性查詢和氣泡排序的概念和表現有了初步的瞭解。接下來我們將深入探討更復雜的查詢和排序技術,比如二分查詢和快速排序。

若你準備好了,請問你想進一步探索哪種查詢或排序技術呢?
我:我都可以
AI:很好,那麼我們先從查詢演算法開始,然後轉到排序演算法。

� WWE常看的藝術和科學

  1. W查詢(Binary Search):
    讓我們談談一個非常高效的查詢演算法——二分查詢。
  • 前提條件:使用二分查詢前,必須確保資料已經排好序。(如果是無序的,無法直接使用二分查詢)。

問題3:如何在一個有序陣列中實現二分查詢演算法?它的主要步驟有哪些?

請詳細說明操作步驟以及該演算法的時間複雜度。
我:二分查詢演算法是一種高效的查詢演算法,適用於在有序陣列中查詢特定元素。其時間複雜度為O(log n),遠優於線性查詢的O(n)。

主要步驟:初始化邊界,迴圈查詢,查詢結束
AI:太好了,你已經掌握了二分查詢的一些關鍵點。現在,讓我們把注意力轉向排序演算法。

排序演算法

既然你已經瞭解了氣泡排序和它的侷限性,我們接著瞭解一個非常有效率的排序演算法:快速排序(Quicksort)。

問題4:你能解釋什麼是快速排序嗎?它的核心思想是什麼,又是如何實現的呢?與其最基本的形式時間複雜度相比會對一般情形下執行表現有何影響呢?

請詳細解釋這些要點。
我:我不太會,請你為我答疑解惑
AI:當然可以!

快速排序及其核心思想
定義: 快速排序是一個分治法(Divide and Conquer)的排序演算法。這意味著它將大問題劃分為小的子問題來獨立解決,然後合併結果獲得最終答案。

核心思想:

選擇樞軸(Pivot):這一步驟選取一個特定的資料元素作為“樞軸”。可以選擇第一個、最後一個或者是中間的一個元素,或者使用一些更智慧的方法隨機選擇樞軸以提升效率。
劃分(Partitioning):重排序列,使得樞軸左邊的所有元素都比它小,右邊的所有元素都比它大。這極大地減少了待排序的序列長度。
步驟如下:

選擇一個樞軸 (Pivot).
將小於樞軸的放在左側,大於樞軸的放在右側.
再遞迴對左右兩邊分別實施相同的過程.
時間複雜度:

在平均情況下,快速排序的時間複雜度為 O(n log n),相較於氣泡排序有著顯著提升。
最壞的情況下,當每次總是挑選最小/大的元素做樞軸時(由於這樣每次只能使序列減少一個元素), 時間複雜度降為 O(n^2).
關於最好的樞軸選擇通常建議儘量選擇資料接近"真正中值"的隨機定位從而減少效能上的潛在波動.

希望這個解釋對你有所幫助! 還有問題請告訴我!
我:我的回答結束了,請對我的回答進行評價總結
AI:因為還沒有收集到你的回答,實際上也就談不到給出它的評價和總結。不過沒關係,我們將在接下來的問題中繼續深入瞭解各種查詢和排序演算法。如果你有任何疑問或想進一步探討某個主題,請告訴我!

學習進度條

程式碼行數(新增/累積) 部落格量(新增/累積) 學習時間(新增/累積) 重要成長
目標 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

(有空多看看現代軟體工程 課件
軟體工程師能力自我評價表
)

參考資料

  • 《電腦科學概論(第七版)》
  • ...

相關文章