算法的时间复杂度表示法(大O表示法)
大 O 復(fù)雜度表示法
算法的執(zhí)行效率,粗略地講,就是算法代碼執(zhí)行的時(shí)間。但是,如何在不運(yùn)行代碼的情況下,用“肉眼”得到一 段代碼的執(zhí)行時(shí)間呢?
for a in range(0, 1001):for b in range(0, 1001): for c in range(0, 1001): if a**2 + b**2 == c**2 and a+b+c == 1000:print("a, b, c: %d, %d, %d" % (a, b, c))通過這段代碼執(zhí)行時(shí)間的推導(dǎo)過程,我們可以得到一個(gè)非常重要的規(guī)律,那就是,所有代碼的執(zhí)行時(shí)間 T(n) 與每 行代碼的執(zhí)行次數(shù) n 成正比。
其中,T(n)表示代碼執(zhí)行的時(shí)間;n 表示數(shù)據(jù)規(guī)模的大小;f(n) 表示每行代碼執(zhí)行的次數(shù)總 和。因?yàn)檫@是一個(gè)公式,所以用 f(n) 來表示。公式中的 O,表示代碼的執(zhí)行時(shí)間 T(n) 與 f(n) 表達(dá)式成正比。
T(n) = O(n^3*2) 這就是大 O 時(shí)間復(fù)雜度表示法,大 O 時(shí)間復(fù)雜度實(shí)際上并不具體表示代碼真正的執(zhí)行時(shí) 間,而是表示代碼執(zhí)行時(shí)間隨數(shù)據(jù)規(guī)模增長(zhǎng)的變化趨勢(shì),所以,也叫作漸進(jìn)時(shí)間復(fù)雜度(asymptotic time complexity),簡(jiǎn)稱時(shí)間復(fù)雜度。 當(dāng)n很大時(shí),你可以把它想象成 10000、100000。而公式中的低階、常量、系數(shù)三部分并不左右增長(zhǎng)趨勢(shì),所以 都可以忽略。我們只需要記錄一個(gè)最大量級(jí)就可以了
時(shí)間復(fù)雜度分析
大 O 這種復(fù)雜度表示方法只是表示一種變化趨勢(shì)。我們通常會(huì)忽略掉公式中的常量、低階、系數(shù),只需要記錄一 個(gè)最大階的量級(jí)就可以了。所以,我們?cè)诜治鲆粋€(gè)算法、一段代碼的時(shí)間復(fù)雜度的時(shí)候,也只關(guān)注循環(huán)執(zhí)行次數(shù) 最多的那一段代碼就可以了。這段核心代碼執(zhí)行次數(shù)的 n 的量級(jí),就是整段要分析代碼的時(shí)間復(fù)雜度。
def cal(n): sum = 0 i = 1for i in rang(n+1): sum += i i+=1 return sum其中第 2、3 行代碼都是常量級(jí)的執(zhí)行時(shí)間,與 n 的大小無關(guān),所以對(duì)于復(fù)雜度并沒有影響。循環(huán)執(zhí)行次數(shù)最多 的是第 4、5 行代碼,所以這塊代碼要重點(diǎn)分析。前面我們也講過,這兩行代碼被執(zhí)行了 n 次,所以總的時(shí)間復(fù) 雜度就是 O(n)。
綜合這三段代碼的時(shí)間復(fù)雜度,我們?nèi)∑渲凶畲蟮牧考?jí)。所以,整段代碼的時(shí)間復(fù)雜度就為 O(n2)。也就是說: 總的時(shí)間復(fù)雜度就等于量級(jí)最大的那段代碼的時(shí)間復(fù)雜度
最壞時(shí)間復(fù)雜度
分析算法時(shí),存在幾種可能的考慮:
- 算法完成工作最少需要多少基本操作,即最優(yōu)時(shí)間復(fù)雜度
- 算法完成工作最多需要多少基本操作,即最壞時(shí)間復(fù)雜度
- 算法完成工作平均需要多少基本操作,即平均時(shí)間復(fù)雜度
對(duì)于最優(yōu)時(shí)間復(fù)雜度,其價(jià)值不大,因?yàn)樗鼪]有提供什么有用信息,其反映的只是最樂觀最理想的情況,沒有參考價(jià)值。
對(duì)于最壞時(shí)間復(fù)雜度,提供了一種保證,表明算法在此種程度的基本操作中一定能完成工作。
對(duì)于平均時(shí)間復(fù)雜度,是對(duì)算法的一個(gè)全面評(píng)價(jià),因此它完整全面的反映了這個(gè)算法的性質(zhì)。但另一方面,這種衡量并沒有保證,不是每個(gè)計(jì)算都能在這個(gè)基本操作內(nèi)完成。而且,對(duì)于平均情況的計(jì)算,也會(huì)因?yàn)閼?yīng)用算法的 實(shí)例分布可能并不均勻而難以計(jì)算。 因此,我們主要關(guān)注算法的最壞情況,亦即最壞時(shí)間復(fù)雜度。
常見時(shí)間復(fù)雜度
常見的復(fù)雜度并不多,從低階到高階有:O(1)、O(logn)、O(n)、O(nlogn)、O(n2)。
| 12 | O(1) | 常數(shù)階 |
| 2n + 3 | O(n) | 線性階 |
| 3n^2 + 3n + 1 | O(n^2) | 平方階 |
| log2n + 20 | O(logn) | 對(duì)數(shù)階 |
| 2n+3nlog2n+19 | O(nlogn) | nlogn階 |
| 2^n | O(2^n) | 指數(shù)階 |
總結(jié)
以上是生活随笔為你收集整理的算法的时间复杂度表示法(大O表示法)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ZYNQ上无DDR加载应用
- 下一篇: 高学历就意味着高薪资?低学历转行3D建模