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