数据结构和算法 —— 时间复杂度+空间复杂度
算法效率的度量方法
事后統(tǒng)計方法
這種方法主要是通過設(shè)計好的測試程序和數(shù)據(jù),利用計算機計時器對不同算法編制的程序的運行時間進行比較,從而確定算法效率的高低。
但這種方法顯然是有很大缺陷的:
必須依據(jù)算法事先編制好測試程序,通常需要花費大量時間和精力;
不同測試環(huán)境差別不是一般的大!
事前分析估算方法
在計算機程序編寫前,依據(jù)統(tǒng)計方法對算法進行估算。
由此可見,拋開這些與計算機硬件、軟件有關(guān)的因素,一個程序的運行時間依賴于算法的好壞和問題的輸入規(guī)模。(所謂的問題輸入規(guī)模是指輸入量的多少)
不關(guān)心編寫程序所用的語言是什么,也不關(guān)心這些程序?qū)⑴茉谑裁礃拥挠嬎銠C上,只關(guān)心它所實現(xiàn)的算法。
這樣,不計那些循環(huán)索引的遞增和循環(huán)終止條件、變量聲明、打印結(jié)果等操作。
最終,在分析程序的運行時間時,最重要的是把程序看成是獨立于程序設(shè)計語言的算法或一系列步驟。
在分析一個算法的運行時間時,重要的是把基本操作的數(shù)量和輸入模式關(guān)聯(lián)起來。
函數(shù)的漸近增長
給定兩個函數(shù)f(n)和g(n),如果存在一個整數(shù)N,使得對于所有的n>N,f(n)總是比g(n)大,那么,我們說f(n)的增長漸近快于g(n)。
最高次項的指數(shù)大的,函數(shù)隨著n的增長,結(jié)果也會變得增長特別快。
判斷一個算法的效率時,函數(shù)中的常數(shù)和其他次要項常常可以忽略,而更應(yīng)該關(guān)注主項(最高項)的階數(shù)。
算法時間復(fù)雜度
算法時間復(fù)雜度的定義:在進行算法分析時,語句總的執(zhí)行次數(shù)T(n)是關(guān)于問題規(guī)模n的函數(shù),進而分析T(n)隨n的變化情況并確定T(n)的數(shù)量級。
算法的時間復(fù)雜度,也就是算法的時間量度,記作:T(n)= O(f(n))。它表示隨問題規(guī)模n的增大,算法執(zhí)行時間的增長率和f(n)的增長率相同,稱作算法的漸近時間復(fù)雜度,簡稱為時間復(fù)雜度。其中f(n)是問題規(guī)模n的某個函數(shù)。
這樣用大寫O()來體現(xiàn)算法時間復(fù)雜度的記法,我們稱之為大O記法。
一般情況下,隨著輸入規(guī)模n的增大,T(n)增長最慢的算法為最優(yōu)算法。
如何推導(dǎo)大O階?
1.用常數(shù)1取代運行時間中的所有加法常數(shù)。
2.在修改后的運行次數(shù)函數(shù)中,只保留最高階項。
3.如果最高階項存在且不是1,則去除與這個項相乘的常數(shù)。
4.得到的最后結(jié)果就是大O階。
常見的時間復(fù)雜度
常用的時間復(fù)雜度所耗費的時間從小到大依次是:
O(1) < O(logn) < (n) < O(nlogn) < O(n ^ 2) < O(n ^ 3) < O(2 ^ n) < O(n!) < O(n ^ n)
空間復(fù)雜度
算法的空間復(fù)雜度通過計算算法所需的存儲空間實現(xiàn),算法的空間復(fù)雜度的計算公式記作:S(n)=O(f(n)),其中,n為問題的規(guī)模,f(n)為語句關(guān)于n所占存儲空間的函數(shù)。
通常,我們都是用“時間復(fù)雜度”來指運行時間的需求,是用“空間復(fù)雜度”指空間需求。
當(dāng)直接要讓我們求“復(fù)雜度”時,通常指的是時間復(fù)雜度。
總結(jié)
以上是生活随笔為你收集整理的数据结构和算法 —— 时间复杂度+空间复杂度的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2018第九届蓝桥杯C/C++ B国赛
- 下一篇: 2018第九届蓝桥杯C/C++ B国赛