第一章 概述
1.1軟件質量:
高質量軟件的幾個特徵:
javascript
第二章 算法分析
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 |
新學期又開始了又見到了闊別已久的同窗,又有了新的助教,感受這又會是一個不平凡的新學期,又是一個在未知的道路上探索的過程,又要去體會無知---抓狂----懵懂------抓狂--------懵懂的過程但願在新的學期能更好地提高本身。