20172310 《程序設計與數據結構》(下)第一週學習總結

20172310 《程序設計與數據結構》(下)第一週學習總結

教材第1、二章學習內容總結

  • 第一章 概述
    • 軟件質量:
      一、軟件工程是一門關於高質量軟件開發的技術和理論的學科
      二、高質量軟件的特徵
      html

    • 數據結構:
      算法

  • 第二章 算法分析
    算法分析是計算機科學的基礎。算法的效率是決定一個程序運行速度的主要因素。
    • 增加函數和大O記法:
      一、增加函數:表示與該問題大小相對應的時間或者空間的使用,表示問題(n)大小與咱們但願最優化的值之間的關係。該函數表示了該算法的事件複雜度或空間複雜度。
      二、漸進複雜度:稱爲算法的階次。如書,第二個洗盤子的算法具備階次爲n^2的時間複雜度,記爲O(n^2),這種記法稱爲O()或者大O記法。漸進複雜度這一特性基於該表達式的主項。算法的階次是忽略該算法的的增加函數中的常量和其餘次要項,只保留主項而得出的。其中,與問題大小無關、執行時間恆定的增加函數具備O(1)的複雜度

三、算法的階次爲增加函數提供了一個上界。
- 增加函數的比較:
一、漸進複雜度爲線性
數據結構

注:其中裏面3.1六、2.1五、3.3的算法爲,√10≈3.16227766016837九、³√10≈2.154四、log2(10)=lg(10)/lg(2)=1/lg(2)=3.321928
因此說,更快的CPU,並不能影響主項,只會給增加函數增長常量,仍須要重視算法分析,若是算法的運行效率低,那麼從長遠來看,再快的CPU也無濟於事。
二、n值較小和n 值較大時各類增加函數的比較
函數

- 時間複雜度分析

一、循環運行的複雜度分析
要肯定某個算法的階次,經常須要肯定某個特定語句或某個語句集運行的次數。要肯定該循環的階數n,而後要運行的次數乘以它,n表示問題的大小。學習

for(int count = 0;count<n;count++)
{
//*複雜度爲O(1)的步驟系列
}
count = 1;
while(count < n)
{
count *=2;
//複雜度爲O(1)的步驟系列
}

二、嵌套循環的複雜度分析
分析嵌套循環的複雜度是,必須jiang 內層循環的複雜度乘之外層循環都考慮進來。優化

for(int count = 0;count < n;count++)
{
   for(int count2 = 0;count2<n;count2++)
    {
        //複雜度爲O(1)的步驟系列
    }
}

內層循環的複雜度根據上述的算法獲得複雜度爲O(n),再與外層循環次數相乘,獲得嵌套循環的複雜度爲O(n^2)。設計

三、方法調用的複雜度分析
考慮清楚調用方法的複雜度,在進行接下來的分析
若是調用多個方法或屢次方法,最後可忽略常量和非主要項。3d

教材學習中的問題和解決過程

  • 問題1:高質量軟件的幾個特徵中有幾個性質比較難以區分,須要好好理解。
  • 問題1解決方案:
    • 可靠性和健壯性:可靠性是指可靠的軟件不多發生故障,即便發生了故障,也能夠將該故障的影響降到最低。健壯性而是指一個系統可以處理各類各樣的問題的或反饋錯誤信息的能力
    • 可重用和可移植性:可重用是軟件組件能夠應用在另外一個軟件系統中,不須要從零開始。設計可移植性則是指Java的源代碼被編譯成了字節碼,這是一種低級語言,他不是任何特定CPU的機器語言。字節碼運行在Java虛擬上(JVM)。JVM是一種解釋並執行字節碼的軟件。
  • 問題2:循環運行的複雜度分析中,課本上給出的兩個例子的複雜度的分析
for(int count = 0;count<n;count++)
{
//*複雜度爲O(1)的步驟系列
}
count = 1;
while(count < n)
{
count *=2;
//複雜度爲O(1)的步驟系列
}
  • 問題2解決方案:要解決這個問題最重要的是不要混淆循環體的複雜度和循環運行的複雜度。這裏兩個循環體的複雜度實際上是同樣的,循環設計會跳過某個數,只要所跳過的部分是線性部分,循環體的複雜度還是O(1)。
    其實課本上各處的複雜度分析的基礎都是要先弄懂簡單循環複雜度的分析,而後再慢慢地有裏向外分析就好。

課後習題

  • EX 2.1:下列增加函數的階次是多少?解題關鍵是忽略常量和非主要項
    a.10n^2+100n+1000
    解:階次爲:n^2。
    b.10n^3-7
    解:階次爲:n^3
    c.2^n+100n^3
    解:階次爲:n^3
    d.n^2 ·log(n)
    解:階次:n^2 ·log(n)
  • EX 2.4:請肯定下面代碼段的增加函數和階次
for(int count = 0 ; count < n ; count++)
    for(int count2 = 0 ; count2 < n ; count2 = count2 + 2)
        {
            System.out.println(count,count2);
        }
}

解:內層循環複雜度爲O(n/2),外層循環須要進行的次數是n,故增加函數爲F(n)=(n^2)/2,階次爲n^2code

  • EX 2.5:請肯定下面代碼段的增加函數和階次
for(int count = 0 ; count < n ; count++)
    for(int count2 = 1 ; count2 < n ; count2 = count2 * 2)
        {
            System.out.println(count,count2);
        }
}

解:內層循環進行的次數是O(log₂n),外層循環須要進行的次數是n,故增加函數爲F(n)=n·log₂n,因此階次爲n·log2n。htm

結對及互評

點評的同窗博客和代碼

  • 本週結對學習狀況
    • 20172309
    • 結對學習內容
      • 教材一二章學習

點評:

  • 博客中值得學習的或問題:
    • 教材內容總結詳細,簡潔明瞭地總結出重點內容,而不是照搬教材。
    • 教材問題的提出頗有用,解答也很正確。

其餘(感悟、思考等,可選)

這個學期的Java課又要開始了,我只想說,革命還沒有成功,同志仍需努力,Java的學習道路還有很長,這個學期要更加努力啦٩(๑>◡<๑)۶

學習進度條

代碼行數(新增/累積) 博客量(新增/累積) 學習時間(新增/累積) 重要成長
目標 5000行 30篇 400小時
第一週 0/0 1/1 10/10

參考資料

相關文章
相關標籤/搜索