學號 2018-2019-20172309 《程序設計與數據結構(下)》第一週學習總結

教材學習內容總結

教材學習內容總結

第一章

1. 軟件質量:爲了最大限度的提升軟件質量,高質量的軟件具備如下特性:

  • 1.1正確性:所設計出的軟件必須知足客戶的需求。
  • 1.2可靠性:就是軟件出現故障的次數,高質量的軟件不多出現故障。
  • 1.3健壯性:完美的健壯系統能夠完美的處理各類問題。
  • 1.4可用性:用戶學習和執行任務的難易程度。
  • 1.5可維護性:當想要對軟件進行修改時,對軟件進行修改的難易程度。
  • 1.6可重用性: 軟件的組件可用於其餘軟件系統的難易程度。
  • 1.7可移植性:軟件可在多種計算機環境下使用的難易程度。
  • 1.8運行效率:在佔用更少資源的狀況下CPU運行的時間。

2. 數據結構:數據結構是一個程序的基礎,程序=數據結構+算法。

3. 關鍵概念:

  • 可靠的軟件不多發生故障,即便發生了故障,也能夠將該故障的影響降到最低。
  • 軟件系統必須通過精心設計、編碼和文檔說明,以便爲開發人員、維護人員和用戶提供支持。
  • 軟件必須有效使用諸如CPU時間和內存之類的內存。
  • 質量特性必須優先考慮,並儘量最大化。
  • 棧可用於顛倒數據集的順序、隊列能夠保持其數據的順序。

第二章

1.算法效率:軟件質量的特徵之一是資源的使用效率,CPU的使用時間是最重要的資源之一。算法分析是計算機科學的基礎。

2.增加函數與大O記法:

  • 1.1增加函數標識問題(n)大小與咱們但願最優化的值之間的關係。該函數表示了該算法的時間複雜度空間複雜度。
  • 1.2咱們主要看重的是漸進複雜度,又稱爲階次。例如:在t(n)=15n²+45n中,當n逐漸變大時,一次項幾乎不計。故階次爲n²
    java

    3.時間複雜度的分析:

  • 3.1 要分析算法的複雜度,一般要分析循環的運行。
  • 3.2 循環的時間複雜度等於循環體的複雜度乘以該循環運行的次數。
  • 3.3 幾個相關的例題
// 例題一
for  (int count = 0 ; count < n ; count++)
{
    //複雜度爲O(1)的步驟系列
} 
//答案:循環體複雜度*循環運行次數=O(1)*O(n)=O(n)
//例題二:嵌套循環的複雜度分析
for (int count = 0 ; count < n;count++)
{
     for  ( int  count2 = 0 ; count2<n ; count2++)
        {
            /*複雜度爲0(1)的步驟系列*
         }
}
//答案:外層循環次數*內層循環次數*循環體=O(n)*O(n)*O(1)=O(n²)
//要點:分析嵌套循環的複雜度時,必須將內層循環和外層循環都考慮進來。
//例題三
for ( int count = 0 ; count < n ; count++)
{
      for ( int count2 = count ; count2 < n ;count2++)
        {
              //複雜度爲O(1)的步驟系列
        }
//此段代碼需注意:外層複雜度爲O(n),而內層運行次數分別是n , n-1 , n-2 , ... , 1.而咱們又必須知道:咱們只對主項感興趣,即只關心最大的。因此答案是O(n²)
}
  • 3.4 方法調用的複雜度分析:
  1. 記住,只有可運行的語句纔會增長時間複雜度。
    例如:
for ( int count = 0 ; count < n ;count++ )
{
    printsum(n);
}//此處只知道外層循環次數,不知道內層方法。不能知道此程序的複雜度。
  1. 還有一個比較難的題目:
public void sample ( int n )
{
       printsum(n);      /*該方法的複雜度爲O(1)*/
       for ( int count = 0 ; count < n ; count++)
             printsum(count);
       for (inr count = 0 ; count < n ; count++)
             for ( int count2 = 0 ;count2 < n ;count2 ++)
                   System.out.println(count,count2);    
}

咱們能夠這樣想:算法

public void sample ( int n )
{
       printsum(n); //O(1)
        for ( int count = 0 ; count < n ; count++)
         printsum(count);// O(n)
        for (inr count = 0 ; count < n ; count++)
               for ( int count2 = 0 ;count2 < n ;count2 ++)
                       System.out.println(count,count2);  //O(n²)
}//用數學來思考即: O(1)+O(n)+O(n²) 由於咱們只關注主項,因此階次爲O(n²)

3.關鍵概念

  • 軟件必須有效地使用諸如CPU時間和內存之類的資源。
  • 算法分析是i計算機科學的基礎。
  • 增加函數表示與該問題大小相對應的時間或空間的使用。
  • 算法的階次是忽略該算法的增加函數中的常量和其餘次要項,只保留主項而得出的。
  • 算法的階次爲增加函數提供了一個上界。
  • 若是算法的運行效率低, 那麼從長遠米說, 使用更快的處理器也無濟於事。要分析算法的複雜度,一般須要分析循環的運行。
  • 循環的時間複雜度等於循環體的複雜度乘以該循環運行的次數。分析嵌套循環的複雜度時,必須將內層循環和外層循環都考慮進來。

讀課本遇到的疑惑:

    1. 爲什麼說階次的算法給增加函數提供了一個上界?
  • 以爲這張圖能很好解決這個問題:markdown

  • 2.在書中例題:
count = 1;
while (count < n )
{
    count *= 2;
}

此程序的階爲何是O(log2 N)而不是O(log2 n/count)?數據結構

  • 手寫方便些:

點評模板

感想

  • 新的學期開始了,沒想到第一週就得寫博客。藍瘦香菇····· 但無論怎樣仍是但願本身能學好這門課程,加油吧!!!

參考資料

1.markdown基本格式函數

相關文章
相關標籤/搜索