時空復(fù)雜度(時間復(fù)雜度/空間復(fù)雜度)O(1)漓概、O(n)、O(n^2)病梢、O(log n)胃珍、O(n log n)是什么意思?

大O符號是算法復(fù)雜度的相對表示,它描述了時空復(fù)雜度(時間復(fù)雜度/空間復(fù)雜度)蜓陌。

大O符號是我在大學(xué)里學(xué)過的東西之一觅彰,我了解過這個算法的概念。我知道的不算多钮热,可以回答一些基本的問題填抬,僅此而已。從大學(xué)畢業(yè)以后隧期,我對這個算法的了解基本沒有改變飒责,因為自從我開始工作以來,我沒有使用過它仆潮,也沒有聽到任何同事提到過它宏蛉。所以我想我應(yīng)該花點時間回顧一下它,并在這篇文章中總結(jié)大O符號的基礎(chǔ)知識性置,以及一些代碼示例來幫助解釋它拾并。

什么是大O符號?簡而言之:

  1. 它是算法復(fù)雜度的相對表示。

  2. 它描述了一個算法如何執(zhí)行和縮放鹏浅。

  3. 它描述了函數(shù)增長率的上限嗅义,可以考慮最壞的情況。

現(xiàn)在快速看一下語法:O(n2)隐砸。

n是函數(shù)作為輸入接收的元素個數(shù)芥喇。這個例子是說,對于n個輸入凰萨,它的復(fù)雜度等于n2。

共同復(fù)雜性的比較

從這個表中可以看出械馆,隨著函數(shù)復(fù)雜度的增加胖眷,完成一個函數(shù)所需的計算量或時間可能會顯著增加。因此霹崎,我們希望將這種增長保持在盡可能低的水平珊搀,因為如果函數(shù)不能很好地伸縮而增加了輸入,可能會出現(xiàn)性能問題尾菇。

顯示操作數(shù)量如何隨復(fù)雜性增加的圖表

一些代碼示例應(yīng)該有助于澄清一些關(guān)于復(fù)雜性如何影響性能的問題境析。下面的代碼是用Java編寫的囚枪,但是很明顯,它可以用其他語言編寫劳淆。

image

O(1)

public boolean isFirstNumberEqualToOne(List<Integer> numbers) {
  return numbers.get(0) == 1;
}

O(1) 表示一個函數(shù)链沼,無論輸入大小如何,該函數(shù)總是取相同的值沛鸵。

O(n)

public boolean containsNumber(List<Integer> numbers, int comparisonNumber) {
  for(Integer number : numbers) {
    if(number == comparisonNumber) {
      return true;
    }
  }
  return false;
}

O(n)表示一個函數(shù)的復(fù)雜度括勺,該函數(shù)的復(fù)雜度與輸入的個數(shù)成線性正比增長。這是一個很好的例子曲掰,說明大O符號如何描述最壞的情況疾捍,因為函數(shù)在讀取第一個元素后返回true,或者在讀取所有n個元素后返回false栏妖。

O(n2)

public static boolean containsDuplicates(List<String> input) {
  for (int outer = 0; outer < input.size(); outer++) {
    for (int inner = 0; inner < input.size(); inner++) {
      if (outer != inner && input.get(outer).equals(input.get(inner))) {
        return true;
      }
    }
  }
  return false;
}

O(n2) 表示一個函數(shù)乱豆,其復(fù)雜度與輸入大小的平方成正比。通過輸入添加更多的嵌套迭代將增加復(fù)雜性吊趾,然后可以用3次總迭代表示O(n3)宛裕,用4次總迭代表示*O(n4) *。

public int fibonacci(int number) {
  if (number <= 1) {
    return number;
  } else {
    return fibonacci(number - 1) + fibonacci(number - 2);
  }
}

O(2n) 表示一個函數(shù)趾徽,其性能對輸入中的每個元素都加倍续滋。這個例子是斐波那契數(shù)列的遞歸計算。函數(shù)屬于O(2n)孵奶,因為函數(shù)對每個輸入數(shù)遞歸地調(diào)用自身兩次疲酌,直到該數(shù)小于或等于1。

O(log n)

public boolean containsNumber(List<Integer> numbers, int comparisonNumber) {
  int low = 0;
  int high = numbers.size() - 1;
  while (low <= high) {
    int middle = low + (high - low) / 2;
    if (comparisonNumber < numbers.get(middle)) {
      high = middle - 1;
    } else if (comparisonNumber > numbers.get(middle)) {
      low = middle + 1;
    } else {
      return true;
    }
  }
  return false;
}

O(log n)表示一個函數(shù)了袁,該函數(shù)的復(fù)雜度隨輸入大小的增加呈對數(shù)增長朗恳。這使得O(log n)函數(shù)可以很好地伸縮,這樣處理較大的輸入就不太可能導(dǎo)致性能問題载绿。
上面的示例使用二分查找來檢查輸入列表是否包含某個數(shù)字粥诫。簡單地說,它在每次迭代中將列表一分為二崭庸,直到找到數(shù)字或讀取最后一個元素怀浆。此方法具有與O(n)示例相同的功能,盡管實現(xiàn)完全不同且更難于理解怕享。但是执赡,這樣做的回報是更大的輸入會帶來更好的性能(如表中所示)。

這種實現(xiàn)的缺點是二進(jìn)制搜索依賴于元素已經(jīng)處于正確的順序函筋。如果在遍歷元素之前需要對元素進(jìn)行排序沙合,那么這就增加了一些開銷。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末跌帐,一起剝皮案震驚了整個濱河市首懈,隨后出現(xiàn)的幾起案子绊率,更是在濱河造成了極大的恐慌,老刑警劉巖究履,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件滤否,死亡現(xiàn)場離奇詭異,居然都是意外死亡挎袜,警方通過查閱死者的電腦和手機(jī)顽聂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來盯仪,“玉大人紊搪,你說我怎么就攤上這事∪埃” “怎么了耀石?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長爸黄。 經(jīng)常有香客問我滞伟,道長,這世上最難降的妖魔是什么炕贵? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任梆奈,我火速辦了婚禮,結(jié)果婚禮上称开,老公的妹妹穿的比我還像新娘亩钟。我一直安慰自己,他們只是感情好鳖轰,可當(dāng)我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布清酥。 她就那樣靜靜地躺著,像睡著了一般蕴侣。 火紅的嫁衣襯著肌膚如雪焰轻。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天昆雀,我揣著相機(jī)與錄音辱志,去河邊找鬼。 笑死狞膘,一個胖子當(dāng)著我的面吹牛揩懒,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播客冈,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼稳强!你這毒婦竟也來了场仲?” 一聲冷哼從身側(cè)響起和悦,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎渠缕,沒想到半個月后鸽素,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡亦鳞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年馍忽,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片燕差。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡遭笋,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出徒探,到底是詐尸還是另有隱情瓦呼,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布测暗,位于F島的核電站央串,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏碗啄。R本人自食惡果不足惜质和,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望稚字。 院中可真熱鬧饲宿,春花似錦、人聲如沸尉共。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽袄友。三九已至殿托,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間剧蚣,已是汗流浹背支竹。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留鸠按,地道東北人礼搁。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像目尖,于是被迫代替她去往敵國和親馒吴。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,916評論 2 344

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