算法筆記 1:時間復(fù)雜度/空間復(fù)雜度

一、概念

1.時間復(fù)雜度

這個與耗時并無直接聯(lián)系。時間復(fù)雜度的計算并不是計算程序具體運(yùn)行的時間财骨,而是算法執(zhí)行語句的次數(shù)。簡而言之,就是計算機(jī)執(zhí)行一個算法快慢的量度體現(xiàn)隆箩。

2.空間復(fù)雜度

Space Complexity
解決一個實際問題可能有多種算法來實現(xiàn)该贾,但是運(yùn)行時候所占用的內(nèi)存可能是不同的,空間復(fù)雜度是對一個算法在運(yùn)行過程中臨時占用存儲空間大小的量度體現(xiàn)摘仅。

二靶庙、表示

1.時間復(fù)雜度

我們一般用“大O符號表示法”來表示時間復(fù)雜度:T(n) = O(f(n))
n是影響復(fù)雜度變化的因子,f(n)是復(fù)雜度具體的算法娃属。

常見的時間復(fù)雜度量級

常數(shù)階O(1)
線性階O(n)
對數(shù)階O(log ?n)
線性對數(shù)階O(nlogN)
平方階O(n2)
立方階O(n3)
K次方階O(n^k)
指數(shù)階(2^n)
常用的時間復(fù)雜度所耗費(fèi)的時間從小到大依次是:
O(1) < O(log ?n) <O (n) < O(nlogn) < O(n^2) < O(n^3) < O(2^n) < O(n!) < O(n^n)

2.空間復(fù)雜度

空間復(fù)雜度是對一個算法在運(yùn)行過程中臨時占用存儲空間大小的一個量度六荒,同樣反映的是一個趨勢,我們用 S(n) 來定義矾端,一般也作為問題規(guī)模n的函數(shù)掏击,以數(shù)量級形式給出。
空間復(fù)雜度比較常用的有:O(1)秩铆、O(n)砚亭、O(n2),

三殴玛、復(fù)雜度計算

1.時間復(fù)雜度

求解算法的時間復(fù)雜度的具體步驟是:
⑴ 找出算法中的基本語句捅膘;算法中執(zhí)行次數(shù)最多的那條語句就是基本語句,通常是最內(nèi)層循環(huán)的循環(huán)體滚粟。
⑵ 計算基本語句的執(zhí)行次數(shù)的數(shù)量級寻仗;
只需計算基本語句執(zhí)行次數(shù)的數(shù)量級,這就意味著只要保證基本語句執(zhí)行次數(shù)的函數(shù)中的最高次冪正確即可凡壤,可以忽略所有低次冪和最高次冪的系數(shù)署尤。
⑶ 用大Ο記號表示算法的時間性能。將基本語句執(zhí)行次數(shù)的數(shù)量級放入大Ο記號中亚侠。
如果算法中包含嵌套的循環(huán)曹体,則基本語句通常是最內(nèi)層的循環(huán)。

時間復(fù)雜度為:O(1)

    private int getSum(int a) {
    int sum = 0;
     sum=sum+a;
    return sum;
}

時間復(fù)雜度用來表示代碼執(zhí)行時間的增長變化趨勢的硝烂。上面的算法并沒有隨著變量的增長而增長耗費(fèi)時間箕别,那么無論這類代碼有多長,都可以用O(1)來表示它的時間復(fù)雜度钢坦。
時間復(fù)雜度為:O(n)

 int i=0;
 while (i < n && arr[i]!=1){
    i++;
}

這段代碼究孕,for循環(huán)里面的代碼會執(zhí)行n遍,因此它消耗的時間是隨著n的變化而變化的爹凹,因此這類代碼都可以用O(n)來表示它的時間復(fù)雜度厨诸。但是如果arr[i]等于1的話,則循環(huán)執(zhí)行一次判斷跳出禾酱,時間復(fù)雜度是O(1)微酬。
時間復(fù)雜度為:O(log ?n)

 int i = 1;
 while(i<n){
   i = i * 2;
}

從上面代碼可以看到绘趋,在while循環(huán)里面,每次都將 i 乘以 2颗管,乘完之后陷遮,i 距離 n 就越來越近了。我們試著求解一下垦江,假設(shè)循環(huán)x次之后帽馋,i 就大于 2 了,此時這個循環(huán)就退出了比吭,也就是說 2 的 x 次方等于 n绽族,那么 x = log2^n
也就是說當(dāng)循環(huán) log2^n 次以后,這個代碼就結(jié)束了衩藤。因此這個代碼的時間復(fù)雜度為:O(logn)

時間復(fù)雜度為:O(nlogN)

for(m=1; m<n; m++){
   i = 1;
   while(i<n) {
    i = i * 2;
   }
}

線性對數(shù)階O(nlogN) 將時間復(fù)雜度為O(logn)的代碼循環(huán)N遍的話吧慢,那么它的時間復(fù)雜度就是 n * O(logN),也就是了O(nlogN)赏表。

時間復(fù)雜度為:O(n2)
如果把 O(n) 的代碼再嵌套循環(huán)一遍检诗,它的時間復(fù)雜度就是 O(n2) 了。

  for(x=1; i<=m; x++){
     for(i=1; i<=n; i++) {
       //
    }
}

它的時間復(fù)雜度為 O(m*n)瓢剿,如果m=n,Tn=O(n2),

時間復(fù)雜度為:O(n3)
O(n3)相當(dāng)于三層n循環(huán)逢慌,其它的類似還有K次方階O(n^k)。

2.空間復(fù)雜度

算法所占用的存儲空間主要包括:
1程序本身所占用的空間
2輸入輸出變量所占用的空間
3動態(tài)分配的臨時空間间狂,通常指輔助變量
輸入數(shù)據(jù)所占空間只取決于問題本身涕癣,和算法無關(guān)。我們所說的空間復(fù)雜度是對一個算法在運(yùn)行過程中臨時占用存儲空間大小的量度前标,即第三項。通常來說距潘,只要算法不涉及到動態(tài)分配的空間以及遞歸炼列、棧所需的空間,空間復(fù)雜度通常為0(1)音比。
舉個??:

 private void test1(int n) {
    int a = 0, b = 0, c = 0;
    int cnt;
    for (cnt = 0; cnt < n; cnt++) {
        a += cnt;
        b += a;
        c += b;
    }
}

空間復(fù)雜度為O(1)俭尖,因為只有a, b, c, cnt四個臨時變量。且臨時變量個數(shù)和輸入數(shù)據(jù)規(guī)模無關(guān)洞翩。

第二個??:

 private int test1(int n) {
    int a = 0;
    if (n == 0) {
        return 1;
    }
    n -= a;
    return test1(n);
}

S(n) = O(n).空間復(fù)雜度為O(n)稽犁,因為每次遞歸都會創(chuàng)建一個新的臨時變量a并且共遞歸執(zhí)行n次。

四骚亿、其他

0.算法復(fù)雜度通常指什么已亥?
算法復(fù)雜度是指算法在編寫成可執(zhí)行程序后,運(yùn)行時所需要的資源来屠,資源包括時間資源和內(nèi)存資源,簡而言之也就是時間復(fù)雜度和空間復(fù)雜度的統(tǒng)稱虑椎,一般求“復(fù)雜度”時震鹉,通常指的是時間復(fù)雜度。
1.為什么需要復(fù)雜度分析捆姜?
數(shù)據(jù)結(jié)構(gòu)和算法本身解決的是“快”和“省”的問題传趾,即如何讓代碼運(yùn)行得更快,如何讓代碼更省存儲空間泥技。所以浆兰,執(zhí)行效率是算法一個非常重要的考量指標(biāo),那就要進(jìn)行時間珊豹、空間復(fù)雜度分析簸呈。
2.算法復(fù)雜度中的O(logN)底數(shù)是多少?
from: 知乎
若算法的 T(n) = O(log n)平夜,則稱其具有對數(shù)時間蝶棋。由于計算機(jī)使用二進(jìn)制的記數(shù)系統(tǒng),對數(shù)常常以10為底(即log10 n忽妒,有時寫作 lg n)玩裙。然而,由對數(shù)的換底公式段直,loga n和 logb n只有一個常數(shù)因子不同吃溅,這個因子在大O記法中被丟棄。因此記作O(log n)鸯檬,而不論對數(shù)的底是多少决侈,是對數(shù)時間算法的標(biāo)準(zhǔn)記法。


我的理解是首先要明白的是時間復(fù)雜度是為了表明一種趨勢喧务, 不過無論底數(shù)是什么,log級別的漸進(jìn)意義是一樣的赖歌,log級別的時間復(fù)雜度都是由于使用了分治思想,這個底數(shù)直接由分治的復(fù)雜度決定。如果采用二分法,那么就會以2為底數(shù),三分法就會以3為底數(shù),其他亦然功茴。
3.時間復(fù)雜度和空間復(fù)雜度的關(guān)系庐冯?
沒有直接關(guān)系。首先時間復(fù)雜度并不等效于程序執(zhí)行速度坎穿,其次編程里的大部分空間換時間其實并沒有改善時間復(fù)雜度展父。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市玲昧,隨后出現(xiàn)的幾起案子栖茉,更是在濱河造成了極大的恐慌,老刑警劉巖孵延,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吕漂,死亡現(xiàn)場離奇詭異,居然都是意外死亡隙袁,警方通過查閱死者的電腦和手機(jī)痰娱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進(jìn)店門弃榨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人梨睁,你說我怎么就攤上這事鲸睛。” “怎么了坡贺?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵官辈,是天一觀的道長。 經(jīng)常有香客問我遍坟,道長拳亿,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任愿伴,我火速辦了婚禮肺魁,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘隔节。我一直安慰自己鹅经,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布怎诫。 她就那樣靜靜地躺著瘾晃,像睡著了一般。 火紅的嫁衣襯著肌膚如雪幻妓。 梳的紋絲不亂的頭發(fā)上蹦误,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天,我揣著相機(jī)與錄音肉津,去河邊找鬼强胰。 笑死,一個胖子當(dāng)著我的面吹牛妹沙,可吹牛的內(nèi)容都是我干的哪廓。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼初烘,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了分俯?” 一聲冷哼從身側(cè)響起肾筐,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎缸剪,沒想到半個月后吗铐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡杏节,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年唬渗,在試婚紗的時候發(fā)現(xiàn)自己被綠了典阵。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡镊逝,死狀恐怖壮啊,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情撑蒜,我是刑警寧澤歹啼,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站座菠,受9級特大地震影響狸眼,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜浴滴,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一拓萌、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧升略,春花似錦微王、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至腰根,卻和暖如春激才,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背额嘿。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工瘸恼, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人册养。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓东帅,卻偏偏與公主長得像,于是被迫代替她去往敵國和親球拦。 傳聞我的和親對象是個殘疾皇子靠闭,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容