尊重原創,源博主位址前面學習過好多次,都是得過且過一直沒有學會(lll¬ω¬),這次下定決心(ง •_•)ง
演算法的效率主要有以下兩個複雜度開評估:
時間複雜度:評估執行程式所需要的時間,可以估算出程式對處理器的使用程度設計程式演算法的時候,考慮系統環境,然後權衡時間複雜度和空間複雜度,選取乙個平衡點。不過時間複雜度要比空間複雜度更容易產生問題,並且現在的計算機硬體的記憶體一半是充足的,所以研究的主要是時間複雜度,不特別說明的情況下,複雜度就是指時間複雜度。空間複雜度:評估程式執行所需要的儲存空間,可以估算出對計算機記憶體的實用程度
時間頻度
乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道哪個演算法花費的時間多,哪個演算法花費的時間少就可以了。並且乙個演算法花費的時間與演算法中語句的執行次數成正比例,哪個演算法中語句執行次數多,它花費時間就多。乙個演算法中的語句執行次數稱為語句頻度或時間頻度。記為t(n)。
時間複雜度
前面提到的時間頻度t(n)中,n稱為問題的規模,當n不斷變化時,時間頻度t(n)也會不斷變化。但有時我們想知道它變化時呈現什麼規律,為此我們引入時間複雜度的概念。一般情況下,演算法中基本操作重複執行的次數是問題規模n的某個函式,用t(n)表示,若有某個輔助函式f(n),使得當n趨近於無窮大時,t(n)/f(n)的極限值為不等於零的常數,則稱f(n)是t(n)的同數量級函式,記作t(n)=o(f(n)),它稱為演算法的漸進時間複雜度,簡稱時間複雜度。
像前面用o( )來體現演算法時間複雜度的記法,我們稱之為大o表示法。
演算法複雜度可以從最理想情況、平均情況和最壞情況三個角度來評估,由於平均情況大多和最壞情況持平,而且評估最壞情況也可以避免後顧之憂,因此一般情況下,我們設計演算法時都要直接估算最壞情況的複雜度。
大o表示法o(f(n)中的f(n)的值可以為1、n、logn、n²等,因此我們可以將o(1)、o(n)、o(logn)、o(n²)分別可以稱為常數階、線性階、對數階和平方階,那麼如何推導出f(n)的值呢?我們接著來看推導大o階的方法。
我們可以按照如下的規則來進行推導,得到的結果就是大o表示法:
1.用常數1來取代執行時間中所有加法常數。
2.修改後的執行次數函式中,只保留最高端項
3.如果最高端項存在且不是1,則去除與這個項相乘的常數。
int
sum = 0,n = 100; //執行一次
sum = (1+n)*n/2; //執行一次
system.out.println (sum); //執行一次
上面演算法的執行的次數的函式為f(n)=3,根據推導大o階的規則1,我們需要將常數3改為1,則這個演算法的時間複雜度為o(1)。如果sum = (1+n)*n/2這條語句再執行10遍,因為這與問題大小n的值並沒有關係,所以這個演算法的時間複雜度仍舊是o(1),我們可以稱之為常數階。(記得之前躲過一本書上說,複製語句是不計入的,這個可能有點問題,但是大致上沒什麼影響)
線性階主要要分析迴圈結構的運**況,如下所示。
for(int i=0;i1)的演算法
...}
上面演算法迴圈體中的**執行了n次,因此時間複雜度為o(n)
int number=1;
while(number2;
//時間複雜度為o(1)的演算法
...}
可以看出上面的**,隨著number每次乘以2後,都會越來越接近n,當number不小於n時就會退出迴圈。假設迴圈的次數為x,則由2^x=n得出x=log₂n,因此得出這個演算法的時間複雜度為o(logn)。
for(int i=0;ifor(int j=0;j1)的演算法
... }}
內層迴圈的時間複雜度在講到線性階時就已經得知是o(n),現在經過外層迴圈n次,那麼這段演算法的時間複雜度則為o(n²)。
舉乙個栗子~
for(int i=0;i除了常數階、線性階、平方階、對數階,還有如下時間複雜度:
f(n)=nlogn時,時間複雜度為o(nlogn),可以稱為nlogn階。
f(n)=n³時,時間複雜度為o(n³),可以稱為立方階。
f(n)=2ⁿ時,時間複雜度為o(2ⁿ),可以稱為指數階。
f(n)=n!時,時間複雜度為o(n!),可以稱為階乘階。
f(n)=(√n時,時間複雜度為o(√n),可以稱為平方根階。
其中x軸代表n值,y軸代表t(n)值(時間複雜度)。t(n)值隨著n的值的變化而變化,其中可以看出o(n!)和o(2ⁿ)隨著n值的增大,它們的t(n)值上公升幅度非常大,而o(logn)、o(n)、o(nlogn)隨著n值的增大,t(n)值上公升幅度則很小。
常用的時間複雜度按照耗費的時間從小到大依次是:
演算法複雜度計算 學習
1.1 大o表示法 上學的時候就學習了大o表示法表示乙個演算法的效率,也大概明白怎麼回事,知道如果沒有迴圈的一段程式的複雜度是常數,一層迴圈的複雜度是o n 兩層迴圈的複雜度是o n 2 我用 2表示平方,同理 3表示立方 但是一直對於嚴格的定義和用法稀里糊塗。1.1.1 定義 設乙個程式的時間複雜...
演算法複雜度的計算
演算法複雜度是在 資料結構 這門課程的第一章裡出現的,因為它稍微涉及到一些數學問題,所以很多同學感覺很難,加上這個概念也不是那麼具體,更讓許多同學學起來無從下手,下面我們就這個問題給各位考生進行分析。首先了解一下幾個概念。乙個是時間複雜度,乙個是漸近時間複雜度。前者是某個演算法的時間耗費,它是該演算...
演算法複雜度的計算
演算法複雜度是在 資料結構 這門課程的第一章裡出現的,因為它稍微涉及到一些數學問題,所以很多同學感覺很難,加上這個概念也不是那麼具體,更讓許多同學學起來無從下手,下面我們就這個問題給各位考生進行分析。首先了解一下幾個概念。乙個是時間複雜度,乙個是漸近時間複雜度。前者是某個演算法的時間耗費,它是該演算...