20172303 2018-2019-1 《程序設計與數據結構》第1周學習總結

20172303 2018-2019-1 《程序設計與數據結構》第1周學習總結

教材學習內容總結

第1章 概述

1.軟件工程

  • 定義:一門關於高質量軟件開發的技術和理論的學科。
  • 目標:軟件工程的目標與其餘工程學科相似
    • 解決正確性問題————客戶所需實現的需求
    • 按時且在預算以內給出解決方案————預算和給出方案的質量相匹配,學會折中
    • 給出高質量的解決方案————「高質量」由他人定義
    • 以合情合理的方式完成上面的事情————ACM職業道德規範(Code of Ethics and Professional Conduct)

2.軟件質量的特徵

  • 在必定程度上講,軟件質量體系在旁觀者的眼中,不一樣的身份對軟件質量的要求存在差別。同時,一些軟件質量特徵之間有時是互斥的,不可能設計出一種軟件符合全部的質量特徵。
  • 以每一個學校都有的教務管理系統爲例來具體闡述一下八個質量特徵
    • 正確性:一個教務管理系統要給用戶提供選課、查分等功能,但絕對不可能有食堂點餐這個功能,由於它是一個有關教學相關事務的系統。而若是一個教務管理系統裏不只沒有查分選課的功能,反而有各類各樣的點餐功能、點外賣功能,那麼這個教務管理系統的正確性不好。
    • 可靠性:在期末有不少同窗會進入教務系統查分,若是當進入人數稍微多了一點系統就崩了,那麼說明這個教務系統的可靠性不好。
    • 健壯性:假如出現了上一個特徵中出現的狀況,學校用了好久好久都沒有修好,等同窗們下個學期都快開學了纔剛剛修好,那麼這個系統的健壯性就不好。
    • 可用性:一個同窗想要查詢一下本學期的課表,結果在教務系統的網站內搜尋了幾個小時最後在一個角落裏找到了查詢課表的入口,那麼這個教務系統的可用性就不好。
    • 可維護性:過了幾年以後有人發現了教務系統存在漏洞,因而有關人員決定對教務系統進行維護修復,可是以前開發這個系統的人都已經退休不幹了,新來的程序員進行修復的時候發現當初寫程序的人寫的極爛無比亂七八糟根本找不到該修復的代碼在哪兒,那麼這個系統的可維護性就不好。
    • 可重用性:學校決定原來的教務系統太老了想從新作一個,可是從零開始過於費時間,就想着可否借用先前的老系統的相關組件來節省時間,可是發現以前的老系統作的太奇葩了並且太過期了真的沒辦法借鑑,那麼原來這個老的教務系統的可重用性就不好。
    • 可移植性:假如一個教務系統用Windows能夠打開而且很好的使用,結果有個同窗用的MacBook根本打不開教務系統,只好含淚借其餘同窗的電腦上教務系統,那麼這個教務系統的可移植性就不好。
    • 運行效率:一個同窗上教務系統查分,結果查了一天一晚上分都沒有出來,那麼這個系統的運行效率就不好。

3.數據結構

第2章 算法分析

1.算法效率分析

  • 算法效率一般用CPU的使用時間表示。
  • 算法分析是計算機科學的基礎。
  • 算法的效率能夠根據該問題的大小和處理步驟數來定義。

2.增加函數

  • 定義:表示問題(n)大小與咱們但願最優化的值之間的關係。該函數表示了算法的時間複雜度(CPU的使用時間)空間複雜度(內存空間)
  • 通常咱們不須要知道某一算法確切的增加函數,而須要知道算法的漸進複雜度,又稱爲算法的階次
    • 漸進複雜度:基於增加函數中的主項,即表達式中增加最快的一項。
    • 階次爲增加函數提供了一個上界。除此以外,Ω表示函數的下界,Θ表示函數的上下界。
  • 處理器速度的提升只會給增加函數增長常量

3.大O記法

  • 全部具備相同階次的算法,從運行效率的角度來講都是等價的。
  • 須要注意的是,大O記法只關注一個增加函數的主項,這句話看起來簡單,但實際上有些時候很容易讓人產生模糊概念,好比課上留的時間複雜度的計算題的第四個:
void fun (int n){
   int i=0;
   while(i*i*i<=n)
       i++;
}
  • 有些同窗經過將n帶入不一樣常數計算後認爲這段代碼的時間複雜度是O(n的立方根+1),就是混淆了階次的概念,這段代碼的增加函數是n的立方根+1,而它的時間複雜度則是O(n的立方根)。

4.增加函數的比較

  • 若是能保證問題(n)很小,那麼使用何種算法是可有可無的。
  • 可是當問題(n)很大時,各類算法之間的差距就會很明顯。

5.時間複雜度分析

  • 步驟:首先肯定循環體的階n,而後乘以循環次數。
  • 規則
    • 加法規則:T(n,m) = T1(n) + T2(n) = O (max ( f(n), g(m) )
    • 乘法規則:T(n,m) = T1(n) * T2(m) = O (f(n) * g(m))
    • 一個特例(問題規模爲常量的時間複雜度):在大O表示法裏面有一個特例,若是T1(n) = O(c), c是一個與n無關的任意常數,T2(n) = O ( f(n) ) 則有T(n) = T1(n) * T2(n) = O ( c*f(n) ) = O( f(n) )
  • 循環運行的複雜度分析
for(int count = 0; count < n; count++)
{
    //複雜度爲O(1)的步驟系列
}
//複雜度爲O(1×n)即O(n)
  • 嵌套循環的複雜度分析
for(int count = 0; count < n; count++)
{
    for(int count2 = 0; count2 < n; count2++)
    {
        //複雜度爲O(1)的步驟系列
    }
}
//複雜度爲O(1×n×n)即O(n^2)
  • 方法調用的複雜符分析
for(int count = 0; count < n; count++)
{
    printsum(count);
}
  • 該代碼段的複雜度要根據printsum方法的複雜度來肯定,假如printsum方法爲
public void printsum(int count)
{
    int sum = 0;
    for (int I = 1; I < count; I++)
        sum += I;
    System.out.println(sum);
}
  • 那麼上面的代碼段的複雜度就爲O(n^2)。而假如printsum方法爲
public void printsum(int count)
{
    int sum = 0;
    sum = count * (count + 1)/2;
    System.out,println(sum);
}
  • 那麼代碼段的複雜度爲O(n)。

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

  • 問題1:可靠性和健壯性都與軟件的故障相關,那麼它們之間的區別和聯繫究竟在哪兒?
  • 問題1解決方案:書上的第九頁有這麼一段話:可靠性關注的是軟件系統發生故障的頻率以及在什麼環境下發生故障,而健壯性關注的是軟件系統出現故障時會發生什麼
  • 個人理解是可靠性關注的是故障發生以前的相關內容,而健壯性關注的是故障發生以後的相關內容。

教材課後練習題

EX 2.1 下列增加函數的階次是多少?

  • a.10n^2+100n+1000
  • 解答:階次爲O(n^2)
  • b.10n^3-7
  • 解答:階次爲O(n^3)
  • c.2^n + 100n^3
  • 解答:階次爲O(2^n)
  • d.n^2×logn
  • 解答:階次爲O(n^2×logn)

2.4 請肯定下面代碼段的增加函數和階次

for(int count = 0 ; count < n ; count++)
    for(int count2 = 0 ; count2 < n ; count2 = count2 + 2)
        {
            System.out.println(count,count2);
        }
}
  • 解答:增加函數爲f(n)=n^2/2, 階次爲O(n^2)。
for(int count = 0 ; count < n ; count++)//循環次數爲n,複雜度爲O(n^2)
    for(int count2 = 0 ; count2 < n ; count2 = count2 + 2)//循環次數爲n/2,複雜度爲O(n)
        {
            System.out.println(count,count2);//複雜度爲O(1)
        }
}
  • 爲了確保正確性,我寫了一個程序來實際測試了一下,發現的確內層的循環次數爲n/2,外層的循環次數爲n,證實增加函數和階次是對的。

2.5 請肯定下面代碼段的增加函數和階次

for(int count = 0 ; count < n ; count++)
    for(int count2 = 1 ; count2 < n ; count2 = count2 * 2)
        {
            System.out.println(count,count2);
        }
}
  • 解答:增加函數爲f(n)=n×log2n,階次爲O(n×log2n)。
for(int count = 0 ; count < n ; count++)//循環次數爲n,複雜度爲O(n×log2n)
    for(int count2 = 1 ; count2 < n ; count2 = count2 * 2)//循環次數爲log2n,複雜度爲O(log2n)
        {
            System.out.println(count,count2);//複雜度爲O(1)
        }
}
  • 再拿程序來測試一下:

結對及互評

  • 本週結對學習狀況
    • 20172322
    • 結對學習內容:本週內容相對簡單,且時間比較緊迫,課本內容都是各自自行學習的。
  • 博客中值得學習的或問題:
    • 優勢:雖然很殘忍.....可是感受....沒有優勢....
    • 問題:內容有些過於簡單,感受不少東西都沒有本身深刻的理解。

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

  • 新的一個學期又開始了,很慚愧上個學期期末靠着背單詞和寫博客拿了一個不錯的分數。本學期的學習目標是但願本身的動手能力可以有所增強,不會的東西要多去試一試,不要只侷限於知識,必定要學會應用。

學習進度條

代碼行數(新增/累積) 博客量(新增/累積) 學習時間(新增/累積) 重要成長
目標 5000行 30篇 400小時
第一週 10/10 1/1 10/10
  • 計劃學習時間:5小時
  • 實際學習時間:10小時
  • 改進狀況:原本感受這周東西很少,老師還在課上都講過了,沒想到仍是廢了很多時間。原本嘗試使用markdown語法去編輯公式,結果發現用不了,好像博客裏給的方法只能在CSDN裏面用o(╥﹏╥)o

參考資料

相關文章
相關標籤/搜索