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

教材學習內容總結

概述

  • 軟件工程:是一門關於高質量軟件開發的技術和理論的學科,用來控制開發過程,實現高質量的軟件。
  • 軟件工程的目標:正確性、可靠性、健壯性、可用性、可維護性、可重用性、可移植性、運行效率。
    對於可靠性和健壯性這兩個較難區分的特徵個人理解是:可靠性能夠看作一我的容易不容易生病,健壯性能夠當作一我的生病後恢復的難易程度,是身體強壯康復快仍是落下病根罒ω罒html

  • 程序=數據結構+算法 ;軟件=程序+軟件工程
  • 數據結構:數據結構是計算機存儲、組織數據的方式。數據結構是指相互之間存在一種或多種特定關係的數據元素的集合。一般狀況下,精心選擇的數據結構能夠帶來更高的運行或者存儲效率。數據結構每每同高效的檢索算法和索引技術有關。
  • 經常使用的數據結構好比棧(先入後出)和隊列(先入先出)算法

算法分析

  • 算法分析:是對一個算法須要多少計算時間和存儲空間做定量的分析。算法是解題的步驟,能夠把算法定義成解一肯定類問題的任意一種特殊的方法。算法分析是計算機科學的一個基礎,並涉及多種技術和概念。
  • 算法效率:算法效率是指算法執行的時間,算法執行時間需經過依據該算法編制的程序在計算機上運行時所消耗的時間來度量,一般是CPU的使用時間。
  • 增加函數:表示問題(n)大小與咱們但願最優化的值之間的關係。該函數表示了該算法的時間複雜度(CPU的使用時間)或空間複雜度(內存空間)。
  • 漸進複雜度(隨着n增長時增加函數的通常性質)稱爲算法的階次。算法的階次是忽略該算法的增加函數中的常量和其餘次要項,只保留主項而得出的。
  • 大O記法/O():與問題大小無關、執行時間恆定的增加函數稱爲具備O(1)的複雜度。
  • 具備相同階次的算法,從運行效率的角度來講都認爲是等價的。
  • 更快的CPU只能給函數增長常量,增長的值是固定的,而算法分析能夠隨着函數的變化提升增值,因此不能經過提升處理器速度來替代算法分析。
  • 增加函數的比較:
    • n相對較小時各類增加函數的比較
      數據結構

    • n很大時,各類增加函數的比較
      函數

  • 循環運行的時間複雜度分析:循環體的階次n乘以該循環要運行的次數。
    • 例1:時間複雜度爲n * O(1) = O(n)
    for(int count=0;count<n;count++)
    {
        /*複雜度爲O(1)的步驟系列*/
    }
    • 例2:時間複雜度爲O(log2(n));進行次數爲x,因此2^x=n,x=log2(n),複雜度爲O(1),因此爲O(log2(n))
    count=1
    while(count<n)
    {
        count *=2
        /*複雜度爲O(1)的步驟系列*//
    }
  • 嵌套循環的複雜度分析
    • 例1:內層複雜度爲O(n),外層爲O(n),故爲O(n^2)
    for{int count=0;count<n;count++)
    {
        for(int count2=0;count2<n;count2++)
        {
            /*複雜度爲O(1)的步驟系列*/
        }
    }
  • 方法調用的複雜度分析
    • 例1:複雜度爲printsum方法的複雜度乘以該循環的運行次數,即爲O(n)*O(n)=O(n^2)
      printsum方法爲
    for (int count=0 ;  count<n; count++)
    {
        Printsum(count);
    }
    public void printsum(int count)
    {
    int sum =0;
    for(int i=0; i<count; i++)
        sum += i;
    System.out.println(sum);
    }
    • 例2:增加函數爲複雜度相加,f(n)=1+n+n^2;得出時間複雜度爲O(n^2)
    public void sample (int n)
    {
        printsum(n);  //該方法調用複雜度爲O(1)
        for(int count =0;count<n;count++)  //該循環複雜度爲O(n)
            printsum(count);
        for(int count =0;count<n;count++)  //該循環複雜度爲O(n^2)
            for(int count2 =0;count2<n;count2++)
                System.out.println(count,count2);
    }

做業解答

  • EX2.1求階次學習

    • a.10n^2+100n+1000優化

      解:階次是n^2。式子中漸進複雜度最高的是n^2,它的增加速度最快。3d

    • b.10n^3-7code

      解:增加速度最快的是n^3htm

    • c. 2^n+100n^3blog

      解:2^n的增加速度大於n^3,因此階次是2^n

    • d. n^2logn

      解:因爲是相乘,因此爲原式n^2logn
  • EX2.4

    for(int count = 0 ; count < n ; count++)
        for(int count2 = 0 ; count2 < n ; count2 = count2 + 2)
            {
                System.out.println(count,count2);
            }
    }

    解:外層循環進行次數爲n,內層循環爲1/2n,因此增加函數f(n)=n* 1/2n=1/2n^2;階次爲n^2

  • EX2.5

    for(int count = 0 ; count < n ; count++)
        for(int count2 = 1 ; count2 < n ; count2 = count2 * 2)
            {
                System.out.println(count,count2);
            }
    }

    解:外層循環須要進行次數爲n,內層循環須要進行次數爲爲x,則2^x=n,x=log2(n),因此增加函數是f(n)=nlog2(n),而階數與增加函數的最高階項有關,要忽略次項與常數項,階次是nlog2(n).

學習進度條

代碼行數(新增/累積) 博客量(新增/累積) 學習時間(新增/累積)
積累 0/7359 3/17 30/330
第一週 0/0 1/1 8/8

結對及互評

點評模板:

  • 博客中值得學習的或問題:
  • 基於評分標準,我給譚鑫的博客打分:7分。得分狀況以下:
    • 問題加分3分
    • 感悟不假大空加1分
    • 排版精美的加1分
      -正確使用Markdown語法加1分
      -模板中的要素齊全加1分
  • 基於評分標準,我給王禹涵的博客打分:5分。得分狀況以下:
    • 排版精美的加1分
    • 問題加分1分
    • 感悟不假大空加1分
      -正確使用Markdown語法加1分
      -模板中的要素齊全加1分

感悟

有一段時間沒有學習了,假期有點點懈怠,忽然學習兩章內容,看了好久,感受還沒進入狀態比較生疏,有些概念較難分清,新的一學期仍需繼續努力,多多聯繫,對課本的理解要到位,加油吧!

參考

相關文章
相關標籤/搜索