20172304 《程序設計與數據結構》 第一週學習總結

20172304 《程序設計與數據結構》 第一週學習總結

教材學習內容總結

  • 第一章 概述
    1.1軟件質量:
    高質量軟件的幾個特徵:
    javascript

    正確性:軟件在多大程度上知足其特定需求
    可靠性:軟件故障發生頻率和危險程度
    健壯性:出錯狀況下能夠獲得恰當處理的程度
    可用性:用戶學習和執行任務的難易程度
    可維護性:對軟件進行修改的難易程度
    可重用性:軟件組件可重用於其餘軟件系統開發的難易程度
    可移植性:軟件組件能夠在多個計算機環境下使用的難易程度
    運行效率:在不浪費資源的狀況下軟件完成其目標的程度
    1.2數據結構(計算機存儲、組織數據的方式)
    程序=數據結構+算法
    軟件=程序+軟件工程
  • 第二章 算法分析
    2.1算法效率分析
    算法效率一般用CPU使用時間來表示
    算法分析是從效率的角度對算法進行分析
    算法分析是計算機科學的基礎
    2.2增加函數與大O記法
    增加函數:表示問題(n)大小與咱們但願最優化的值之間的關係該函數表示了該算法的時間複雜度(CPU的使用時間)和空間複雜度(內存空間)
    算法的漸進複雜度(隨着n增加時增加函數的通常性質)
    主要關注函數的主項(即增加速度最快的的那一項)
    漸進複雜度稱爲算法的階次
    增加函數的項之間的比較php

盤子的數量 15n² 15n 15n²+45n
1 15 45 60
2 60 90 150
5 375 225 600
10 1500 450 1950
100 150 000 4500 154500
1000 15 000 000 45000 15045000
10 000 1 500 000 000 000 450 000 1 5000 450 000
100 000 150 000 000 000 4 500 000 150 004 500 000
1 000 000 15 000 000 000 000 15 000 000 15 000 045 000 000
10 000 000 1 500 000 000 000 000 450 000 000 1 500 000 450 000 000

一些增加函數及其漸進複雜度html

增加函數 階次 標記
t(n)=17 O(1) 常量型
t(n)=3log n O(log n) 對數型
t(n)=20n-4 O(n) 線性
t(n)=12n log n+100n O(n log n) n log n
t(n)=3n²+5n-2 O(n²) 平方型
t(n)= 8n^3+3n² O(n^3) 立方型
t(n)=2^n+18n²+3n O(2^n) O(2^n)

若是兩個算法完成相同任務具備不一樣的增加函數,好比都是O(n²),那麼從運行效率上來講,二者大致上是相等的。java

2.3增加函數的比較


2.4 時間複雜度分析c++

2.4.1 循環運行的複雜度分析
要肯定某個算法的階次,經常須要肯定某個特定語句或某個語句集運行的次數。要肯定該循環的階數n,而後要運行的次數乘以它。程序員

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

2.4.2 嵌套循環的複雜度分析
用內層循環的複雜度乘之外層循環的複雜度。例如,下面嵌套循環web

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

其複雜程度爲O(n²),內層循環體的複雜度爲O(1),而且該內層循環將運行n次。這意味着內層循環的複雜度爲O(n).算法

2.4.3 方法調用的複雜度分析
要肯定循環體的階要先肯定調用方法的階編程

教材學習中遇到的問題和解決的方法

問題一:爲何java擁有良好的可移植性
1.java做爲一種編程語言:源代碼可移植性
做爲一種編程語言java提供了一種最簡單同時也是人們最熟悉的的可移植性--源代碼可移植。這就意味着任何一個java程序,不論它運行在何種cpu、操做系統或者java編譯器器上都產生同樣的結果。這是否是一個新概念,人們使用c或者c++也產生一樣的效果,可是使用c或者c++的人們有太多的選擇,在許多細節上它都沒有嚴格的定義。這樣就致使了同一段程序在不一樣的環境下會產生不一樣意外的結果。而java就不一樣了,因爲嚴密的語義結構,而使編譯器不承擔這一職責。數據結構

2.java做爲一個虛擬機:cpu可移植性
大多數編譯器產生的目標代碼只能運行在一種cpu(如Intel的x86系列),即便那種支持多種編譯器的目標代碼,也不能產生適合多種cpu的目標代碼。 而java不同,java編譯器產生的目標代碼針對的是一種並不存在的cpu--java虛擬機,而不是一種具體的cpu。java虛擬機能掩蓋不一樣cpu之間的差異,從而使java-code運行在安裝有虛擬機的機器上。

3.java做爲一種虛擬的操做系統和圖形用戶界面:操做系統的可移植。

即便通過從新編譯,大多數的用C和C++編寫的Windows程序也不能在Unix或Macintosh系統上運行。這是爲何呢?由於程序員在編寫Windows程序時使用了大量的WindowsAPI和中斷調用,而Windows程序對系統功能的調用與Unix和Macintosh程序有很大的差異,因此除非將全套WindowsAPI移植到其它操做系統上,不然重編譯的程序仍不能運行。

JAVA採用了提供一套與平臺無關的庫函數(包括AWT、UTIL、LANG等等)的方法來解決這個問題。就象JVM提供了一個虛擬的CPU同樣,JAVA庫函數提供了一個虛擬的GUI環境。

課後習題

練習題
EX2.1 下列增加函數的階次是多少
a.10n² + 100n + 1000
解答:易知最高次項爲10n²故階次表示爲O(n²)
b.10n^3 - 7
解答:易知最高次項爲n^3故階次表示爲O(n^3)
c.2^n + 100n^3
解答:易知最高次項爲2^n因此階次表示爲O(2^n)
d.n²logn
解答:易知階次爲O(n²logn)

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

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

解答:由於內循環進行的次數是n/2,外循環進行的次數是n,故增加函數f(n)=n²/2,階次爲O(n)= n²。

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

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

解答:由於內循環進行的次數是log 2 n(以二爲底n的對數),外循環進行的次數是n次,故增加函數爲f(n)= nlog 2 n,階次爲O(n)= nlog 2 n。

結對互評

  • 20172301 郭愷
    博客中的問題和值得學習的地方:
    郭愷同窗的博客中體現了本身的思考,對不少問題進行了解答。充分體現了其認真的態度以及嚴謹的學習做風。

  • 20172328 李馨雨
    博客中的問題和值得學習的地方。李馨雨同窗充分的歸納了教材的知識,整個界面簡潔大方而不散亂,佈局層次分明。各個環節設計充分。

    學習進度條

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

感悟

新學期又開始了又見到了闊別已久的同窗,又有了新的助教,感受這又會是一個不平凡的新學期,又是一個在未知的道路上探索的過程,又要去體會無知---抓狂----懵懂------抓狂--------懵懂的過程但願在新的學期能更好地提高本身。

參考資料

藍墨雲班課
java軟件結構與數據結構

相關文章
相關標籤/搜索