20172323 2018-2019-1 《程序設計與數據結構》第一週學習總結

20172323 2018-2019-1 《程序設計與數據結構》第一週學習總結

教材學習內容總結

第一章——概述

  • 1.1 軟件質量
    • 軟件工程(Software Engineering)是一門關於高質量軟件開發的技術和理論的學科。
    • 解決的問題:控制開發過程,實現高質量的軟件
    • 軟件工程的目標
      php

    • 高質量軟件的特徵
      html

  • 1.2 數據結構
    • 數據結構:計算機存儲、組織數據的形式。
      程序 = 數據結構 + 算法
      軟件 = 程序 + 軟件工程
    • 棧會顛倒數據的順序,而隊列能夠保持數據的順序。

第二章——算法分析

  • 算法效率分析
    • 算法分析是計算機科學的基礎
  • 增加函數與大O記法
    • 增加函數(growth function)表示與該問題大小相對應的時間或空間的使用。表示問題(n)大小與咱們但願最優化的值之間的關係。表示了該算法的時間複雜度或空間複雜度。
    • 漸進複雜度(asymptotic complexity)稱爲算法的階次,隨着問題大小的增長時增加函數的通常性質,這一性質取決於該表達式的主項,即n增長時表達式中增加最快的那一項。算法的階次是忽略該算法的增加函數中的常量和其餘次要項,只保留主項而得出的。算法的階次爲增加函數提供了一個上界。web

      第二個洗盤子算法具備階次爲n^2^的時間複雜度,記爲O(n^2)。第一個洗盤子的事例,其增加函數爲t(n)=60n,其階次爲n,記爲O(n)。算法

    • 這種記法稱爲O(n)或大O記法。不管問題是大是小,運行賦值語句和if語句一次,其複雜度就爲O(1)。
  • 增加函數的比較
    • 處理器速度的提升只會給增加函數添加常量。若是算法的運行速率低,那麼從長遠來講,使用更快的處理器也無濟於事。
    如圖,處理器速度提升10倍,時間複雜度爲n^2的B算法的運行效率僅僅提高了3.16倍,即10的平方根倍。
  • 增加函數的比較圖

  • 時間複雜度分析
    • 循環運行的複雜度分析:要肯定某個算法的階次,經常須要肯定某個特定語句或某個語句集運行的次數。
      ==eg1==假設某個循環體的複雜度爲O(1),那麼下面循環的時間複雜度爲O(n)
for (int count = 0; count < n; count++)
{
  // 複雜度爲O(1)的步驟系列
}

==eg2==若是該循環的複雜度是對數級的,則該循環是O(logn)數據結構

count = 1;
while(count < n)
{
count *=2;
//複雜度爲O(1)的步驟系列
}
  • 嵌套循環的複雜度分析
    ==eg3==下例中,內層循環體的複雜度爲O(1),而且該內層循環將運行n次,則其複雜度爲O(n^2)。
for(int count = 0;count < n;count++)
{
   for(int count2 = 0;count2<n;count2++)
    {
        //複雜度爲O(1)的步驟系列
    }
}
  • 方法調用的複雜度分析
    ==eg4==時間複雜度爲O(n^2)
for(int count = 0;count<n;count++)
{
    printsum(count);
}

public void printsum(int count)
{
    int sum = 0;
    for(int I = 1;I<count;I++)
        sum += I;
    System.out.println(sum);
}
  • 時間複雜度的計算規則
    1) 加法規則
    T(n,m) = T1(n) + T2(n) = O (max ( f(n), g(m) )

2) 乘法規則
T(n,m) = T1(n) * T2(m) = O (f(n) * g(m))函數

3) 一個特例(問題規模爲常量的時間複雜度)
在大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) )。也就是說,在大O表示法中,任何非0正常數都屬於同一數量級,記爲O(1)。學習

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

  • 問題1:高質量軟件的兩個特徵可重用性和可移植性有什麼區別
  • 問題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);
        }
}

解答:內循環循環n/2次,外循環循環n次,故增加函數爲F(n)=(n^2)/2,階次爲n^2。調試

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

解答:外層循環n次,內層循環log₂(n-1)次。故增加函數爲F(n)=nlog₂(n-1),階次爲nlog₂(n-1)。

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

上學期的Java課沒有打下堅實的基礎,但我仍是王老師課上說的,亡羊補牢,爲時不晚。但願這個學期可以有始有終,努力學好專業知識,學有所用。

學習進度條

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

結對及互評

  • 基於評分標準,我給譚鑫的博客打分:7分。得分狀況以下:
    正確使用Markdown語法(加1分)
    模板中的要素齊全(加1分)
    教材學習中的問題和解決過程, 三個問題加3分
    代碼調試中的問題和解決過程, 無問題
    感想,體會不假大空的加1分
    點評認真,能指出博客和代碼中的問題的加1分
  • 基於評分標準,我給方藝雯的博客打分:4分。得分狀況以下:
    正確使用Markdown語法(加1分)
    模板中的要素齊全(加1分)
    感想,體會不假大空的加1分
    點評認真,能指出博客和代碼中的問題的加1分

    點評過的同窗博客和代碼

  • 本週結對學習狀況

參考資料

相關文章
相關標籤/搜索