計算思維、解決問題和程式設計
計算機科學有時被定義為對演算法及其在計算機中的高效實現的研究。現在的重點是它們在解決問題中的作用、開發它們的策略、遵循和測試它們的技巧。由於演算法對資料進行操作,我們研究了對資料進行結構化以便更有效地處理它的方法。
4.1.1 確定解決問題的適當程式。
一般來說,所有問題都從一個想法開始。找到這些資訊與解決方案之間的聯絡是解決問題的核心。為此,可以利用以下策略。
提出問題
當口頭給出一個問題或任務時,通常會提出問題,直到完全清楚地瞭解需要什麼。一般來說,詢問何時、為何和何地,直到任務完全明確。如果指令是書面的,可能會在頁邊空白處打問號;下劃線一個詞、一組詞或一個句子;或者以其他方式指示不清楚的任務部分。也許問題會在後面的段落中得到解答,或者可能需要與給出任務的人討論。如果任務是自定的,這種提問可能不是口頭的,而是發生在潛意識層面。
- 在這種情況下,應該考慮的一些典型問題是
- 我應該瞭解問題的什麼?
- 解決方案是什麼樣的?
- 存在哪些特殊情況?
- 我如何才能認出我已經找到了解決方案?
不要重新發明輪子。利用以前解決問題的相似之處。這是一種模式識別形式。
4.1.2 評估執行活動的順序是否會產生所需的結果。
我們不斷地將一個大問題分解成我們可以處理的更小的單元。打掃房子或公寓的任務可能看起來很可怕。由打掃客廳、餐廳、廚房、臥室和浴室組成的任務似乎更容易管理。這個原則對計算特別重要。
4.1.3 解釋子程式在解決問題中的作用。
不要重新發明輪子。如果存在解決方案,請使用它。如果你以前解決過相同或類似的問題,只需重複成功的解決方案。我們通常不會有意識地想,“我以前見過這個,我知道該怎麼做”——我們只是去做。人類擅長識別類似的情況。我們不必學習如何去商店買牛奶,然後買雞蛋,然後買糖果。我們知道去商店總是相同的,只有我們買的東西不同。
在計算中,識別熟悉的情況特別有用。在計算中,你會反覆看到某些問題以不同的形式出現。一個優秀的程式設計師會看到一個任務,或者可能是一個任務的一部分(子任務),它以前被解決過,並插入解決方案。例如,在溫度列表中找到每日最高和最低溫度與在測試分數列表中找到最高和最低分數完全相同的問題。你想要在一組數字中找到最大和最小值。
4.1.4 確定在特定情況下需要決策時。
4.1.5 確定解決特定問題的所需決策。
4.1.6 確定特定問題中給定決策相關的條件。
4.1.7 解釋系統決策和條件之間的關係。
4.1.8 推斷現實世界情況的邏輯規則。
4.1.9 確定解決方案中所需的輸入和輸出。
4.1.10 確定建議的問題和解決方案中的預先計劃。
4.1.11 解釋執行演算法時需要先決條件的原因。
4.1.12 概述特定問題的先決條件和後置條件。
4.1.13 確定需要在特定問題解決方案中考慮的例外情況。
4.1.14 確定解決方案中可以併發執行的部分。
4.1.15 描述如何使用併發處理來解決問題。
4.1.16 評估在解決問題時使用併發處理的決定。
併發處理允許更快的計算,因為多個任務同時執行。但是,併發處理的程式設計難度要大得多。
4.1.17 識別抽象的例子。
4.1.18 解釋為什麼在為特定情況推匯出計算解決方案時需要抽象。
4.1.19 從特定情況構建抽象。
4.1.20 區分現實世界實體及其抽象。
4.2.1 描述線性陣列上標準演算法的特徵。
在計算機科學領域存在著大量演算法,但排序和搜尋是最重要的兩種型別。
順序搜尋,或線性搜尋,是最簡單的搜尋演算法;它是暴力搜尋的一種特殊情況。其最壞情況下的成本與列表中元素的數量成正比;如果所有列表元素都等可能地被搜尋,則其預期成本也是如此。因此,如果列表包含多個元素,其他方法(如二分搜尋或雜湊)將更快,但它們也施加了額外的要求。
二分搜尋
這依賴於線性陣列按順序排序。假設我們要查詢 X。
- 從中間元素開始。
- X 大於或等於該元素嗎?
- 如果是,則從總體中移除所有小於該元素的元素。
- 移動到新總體的中間並重復。
注意“中間”始終是偶數集合中較大的元素。
氣泡排序
假設我們正在將數字列表從最低到最高排序。
- 從左邊開始,將該數字 X 與其右邊的數字 Y 進行比較。
- 如果 X>Y,則交換 X 和 Y 的位置。
- 重複整個列表。
- 重複整個過程,直到在完整遍歷中不需要任何切換。
選擇排序
從低到高排序的最簡單方法。
- 遍歷整個總體,找到最小的。
- 將最小的移動到最左邊。
- 忽略已排序的元素,以相同的方式遍歷總體中的其餘部分。
4.2.2 概述集合的標準操作。
4.2.3 討論解決特定問題的演算法。
4.2.4 分析作為流程圖呈現的演算法。
4.2.5 分析作為虛擬碼呈現的演算法。
4.2.6 構建虛擬碼來表示演算法。
4.2.7 建議合適的演算法來解決特定問題。
4.2.8 推斷演算法在其使用環境中的效率。
4.2.9 確定對於給定的輸入資料,演算法中的某個步驟將執行的次數。
4.3.1 陳述計算機的基本操作。
4.3.2 區分計算機的基本操作和複合操作。
4.3.3 解釋計算機語言的基本特徵。
4.3.4 解釋需要高階語言的原因。
4.3.5 概述從高階語言到機器可執行程式碼的翻譯過程的必要性。
4.3.6 定義術語:變數、常量、運算子、物件。
4.3.7 {{{2}}}
4.3.8 分析演算法中變數、常量和運算子的使用。
4.3.9 使用迴圈、分支構建演算法。
4.3.10 描述集合的特徵和應用。
4.3.11 使用集合的訪問方法構建演算法。
4.3.12 討論在程式化解決方案中需要子程式和集合的原因。
4.3.13 使用預定義的子程式、一維陣列和/或集合構建演算法。