0
章節
1.4到1.5小節。
掌握算法概念、特性、描述、算法性能時間復雜度和空間復雜度;
理解遞歸含義?
掌握實現遞歸的條件和時機;
應用簡單遞歸問題的算法設計;
重點
算法概念與特征,算法表示;
難點
算法的分析與算法設計;
遞歸算法的理解與使用;
作業或思考題
作業2:算法設計與表達
內容達成以下標準(考核點):
????????理解與陳述算法概念;
????????理解并設計與表達算法:設計算法,使用工具表達,分析算法
算法設計與實現作業
摘要: 本文旨在為求1+(1+2)+(1+3)+(1+2+4)+(1+3+5)+....+(1+2+...+2n)+(1+3+5+...+2n-1)的和,設計算法,并分別使用自然語言、N-S圖,偽代碼來表示。分析算法的時間和空間效率, 和評價算法,然后使用java 完成算法的實現。
關鍵詞:算法設計;評價;Java實現;
abstract
The purpose of this article is to design an algorithm to calculate the sum of the series 1 + (1+2) + (1+3) + (1+2+4) + (1+3+5) + ... + (1+2+...+2n) + (1+3+5+...+2n-1). The algorithm will be represented using natural language, an N-S diagram, and pseudo?code. The time and space efficiency of the algorithm will be analyzed, and the algorithm will be evaluated. Finally, the algorithm will be implemented in Java.
Keywords: Algorithm Design; Evaluation; Java Implementation
1 實現方法一
1.1算法表示
1.1.1自然語言表示
1.創建一個變量sum并將其初始化為0,用于保存總和。
2.使用for循環從1迭代到n,迭代變量i表示當前迭代的數字。
3.在每次迭代開始時,創建兩個臨時變量s1和s2,分別用于保存奇數項和偶數項的和,并將它們初始化為0。
4.判斷i是否大于1,如果是,則計算s1的值為(i-1) * (i-1) + i,表示從1到2n-1的所有奇數的和,如果不是,則s1保持為0。
5.計算s2的值為i * i,表示從1到2n的所有偶數的和。
6.將s1和s2分別累加到總和sum中。
7.循環結束后,返回總和sum作為最終結果。
1.1.2 N-S圖表示
1.1.3偽代碼表示
輸入:n
輸出:sum // 1+(1+2)+(1+3)+(1+2+4)+(1+3+5)+....+(1+2+...+2n)+(1+3+5+...+2n-1)的和
????function calculateSum(n):
????sum = 0
????for i from 1 to n:
????????s1 = 0
????????s2 = 0
????????if i > 1:
????????????s1 = (i-1)^2 + i
????????s2 = i^2
????????sum += s1 + s2
????return sum
1.2算法分析
時間復雜度分析:外層循環迭代n次,所以時間復雜度為O(n)。內部計算s1和s2的操作是常數時間的,不會隨輸入規模變化,因此對時間復雜度沒有影響。
空間復雜度分析:算法使用了常數個變量來保存中間結果,所以空間復雜度為O(1),即為常數級別。不會隨輸入規模變化。
1.3算法實現
public class Algorithm {public static int calculateSum(int n) {int sum = 0;for (int i = 1; i <= n; i++) {int s1 = 0;int s2 = 0;if (i > 1){s1 = (i-1) * (i-1) ?+ i;//單獨的和, 偶數項}s2 = i * i;//單獨的和, 奇數項sum += s1 + s2;}return sum;}public static void main(String[] args) {int n = 4;int result = calculateSum(n);System.out.println("當n=" + n + "時,sum=" + result);}
}
1.4算法總結
????????該算法是一個簡單直觀的解決方案,它通過循環迭代計算每一項的和,并將其累加到總和中。由于只有一個循環,算法的時間復雜度是線性的,具有較好的效率。同時,算法的空間復雜度也是常數級別的,節省了內存的使用。總體而言,這個算法是一個有效且可行的解決方案。
2實現方法二
2.1算法表示
2.1.1自然語言表示
1.初始化兩個數組s1和s2,長度為n。
2.對于從1到n的每個數i:
如果i大于1,計算s1[i-1]的值為 (i-1) * (i-1) + i。
計算s2[i-1]的值為 i * i。
3.定義變量sum并初始化為0。
4.對于數組s1和s2的每個索引i:
將s1[i]和s2[i]的值累加到sum上。
5.返回sum作為結果。
2.1.2N-S圖表示
2.1.3偽代碼表示
輸入:n
輸出:sum // 1+(1+2)+(1+3)+(1+2+4)+(1+3+5)+....+(1+2+...+2n)+(1+3+5+...+2n-1)的和
function calculateSum(n):
????s1 = new int[n]
????s2 = new int[n]
????for i = 1 to n:
????????if i > 1:
????????????s1[i-1] = (i-1) * (i-1) + i
????????s2[i-1] = i * i
????sum = 0
????for i = 0 to n-1:
????????sum += s1[i]
????????sum += s2[i]
????return sum
2.2算法分析
時間復雜度分析:該算法的時間復雜度為O(n),其中n是輸入的參數。因為算法包含兩個for循環,兩個循環的迭代次數都是n。
空間復雜度分析:該算法的空間復雜度為O(n),其中n是輸入的參數。因為算法使用了兩個長度為n的數組s1和s2來存儲中間結果。此外,還有幾個整型變量用于計算和累加過程,它們的空間占用可以忽略不計。
2.3算法實現
public class Algorithm {public static int calculateSum(int n) {int[] s1 = new int[n];int[] s2 = new int[n];for (int i = 1; i <= n; i++) {if (i > 1){s1[i-1] = (i-1) * (i-1) + i; // 計算s1的值}s2[i-1] = i * i; // 計算s2的值}int sum = 0;for (int i = 0; i < n; i++) {sum += s1[i] + s2[i]; // 累加s1和s2的值}return sum;}public static void main(String[] args) {int n = 4;int result = calculateSum(n);System.out.println("當n=" + n + "時,sum=" + result);}
}
?2.4算法總結
算法優點:?這個算法有效地解決了問題,具有線性時間復雜度,適用于大多數輸入規模。它的實現相對簡單,易于理解。
算法缺點: 該算法使用了額外的空間來存儲兩個數組s1和s2,這可能會在輸入規模很大的情況下導致內存消耗較大。如果對空間效率有更高的要求,可以考慮在計算過程中動態生成s1和s2的值而不存儲它們。
總的來說,這個算法是一個有效的解決方案,適用于大多數情況,但在某些特定情況下,可能需要優化空間復雜度。
總結性分析:
第二個算法的優點在于將括號內部的和分別存放在兩個數組中,方便計算和累加。但是它的缺點在于需要占用較多的空間,且計算s1的時候會產生一定的重復計算。
而第一個算法則沒有使用數組,而是在每次循環的過程中直接計算出s1和s2并進行累加,避免了數組帶來的空間占用和計算重復的問題。但是其缺點在于代碼可讀性不如第一個算法。
參考文獻
[1] 王紅梅, 黨源源, 劉冰. 數據結構--從概念到Java實現[M]. 清華大學出版社, 2019.