老夫反手就是一張過(guò)去的CD饰潜,聽(tīng)聽(tīng)那是算法時(shí)間復(fù)雜度和大O表示法

現(xiàn)在是偉大美好的端午佳節(jié)時(shí)間初坠,你是在回家的路上嗎?祝各位簡(jiǎn)友們生日快樂(lè)E砦怼5獭!啪啪啪冠跷! 又調(diào)皮南誊,明明是中秋節(jié)快樂(lè)好咩~身诺。

今日有酒盡早醉蜜托,明日無(wú)酒老夫我開(kāi)蓋再來(lái)一瓶。 咱今天扒一下軟件編程中的算法時(shí)間復(fù)雜度霉赡。

“瑪?shù)麻衔瘢?........勇雙全。一說(shuō)算法之類(lèi)的東西晚生我就想打哈欠穴亏,犯困蜂挪。(o-ωq)).oO ”

“是不是感覺(jué)老有知識(shí)咳不出來(lái),又咽不下去嗓化?老夫反手就是一張過(guò)去的CD棠涮,聽(tīng)聽(tīng)那是我們的XX”

“巴拉拉能量,麻辣割雞小魔仙全身變刺覆。kuang严肪!別擔(dān)心,大雞排今天講的足夠簡(jiǎn)單、 粗暴不戴X驳糯,易理解篇梭。” 快坐上來(lái)吧酝枢,搞起恬偷。搞起。


目錄

  • 前言
  • 概念
  • 例子
  • 題外話

前言

到今天為止帘睦,可能我們的確不會(huì)自己再去經(jīng)常編寫(xiě)一個(gè)高效的算法袍患。因?yàn)樵诟鞔罂蚣芑蛘Z(yǔ)言原生的API里,它們已經(jīng)幫業(yè)務(wù)開(kāi)發(fā)的程序員將最優(yōu)的算法都實(shí)現(xiàn)了竣付。所以我們很少用到在實(shí)際場(chǎng)景中协怒,特別是作為大前端開(kāi)發(fā)人員更加很少接觸到。但是無(wú)論從計(jì)算機(jī)編程基礎(chǔ)卑笨、以及編寫(xiě)更優(yōu)秀的性能代碼孕暇,這塊的知識(shí)是任然是非常重要的。

基礎(chǔ)與流行

人的一生是有限的赤兴,個(gè)人認(rèn)為在編程技術(shù)棧中的學(xué)習(xí)即是一種投資行為妖滔。做我們這行的行業(yè)積累是會(huì)過(guò)期的。所以我將技術(shù)知識(shí)粗略的劃分為兩塊桶良。
即:基礎(chǔ)編程知識(shí)流座舍、流行編程知識(shí)流。
基礎(chǔ)知識(shí)是牢固而不容易過(guò)期的陨帆,而流行編程知識(shí)往往是偏向前沿技術(shù)而活潑不穩(wěn)定的曲秉,把時(shí)間軸拉長(zhǎng)來(lái)看,新技術(shù)是不斷的被迭代的疲牵。

也就是說(shuō)如果我們把 sql承二、算法、編程思想 ...歸結(jié)為基礎(chǔ)編程知識(shí)來(lái)看纲爸。java語(yǔ)言亥鸠、kotlin語(yǔ)言、android识啦、React ...這種知識(shí)是當(dāng)前流行編程知識(shí)流负蚊。

那么流行知識(shí)是一個(gè)反復(fù)學(xué)習(xí)新技術(shù),不斷的扔掉成舊知識(shí)的一個(gè)過(guò)程颓哮。而恰恰相反家妆,基礎(chǔ)知識(shí)是不會(huì)和新技術(shù)產(chǎn)生沖突交集的。所以如果你是一個(gè)剛剛?cè)胄胁痪玫墓コ仟{冕茅,那么從投資的角度來(lái)看伤极,我建議對(duì)基礎(chǔ)編程知識(shí)的前期投資是越豐厚越好腰鬼,而且是穩(wěn)賺不陪的賣(mài)買(mǎi)。
正式開(kāi)發(fā)環(huán)境中很多時(shí)候是飛機(jī)大炮造到一半塑荒,發(fā)現(xiàn)零件的質(zhì)量不夠好熄赡。框架子搞了一堆再牛逼齿税,卻寫(xiě)不出好東西或則說(shuō)無(wú)法發(fā)揮最大的性能彼硫。

用優(yōu)質(zhì)的代碼解決硬件成本

簡(jiǎn)單來(lái)說(shuō),就是如果你代碼的執(zhí)行算法太慢凌箕,將導(dǎo)致需要用硬件來(lái)?yè)纹疬\(yùn)行速度拧篮。這就是在過(guò)多的消耗硬件成本。而作為行業(yè)內(nèi)人員或者boss牵舱,你是愿意將刀刃(錢(qián))用在優(yōu)秀的工程師上串绩,還是高昂價(jià)格的機(jī)器上。相信這個(gè)問(wèn)題芜壁,我只需要提出,你就已經(jīng)有了結(jié)論礁凡。我不作過(guò)多的闡述。


概念

我們今天只弄明白兩點(diǎn)慧妄,到底什么是算法時(shí)間復(fù)雜度顷牌?什么是大O表示法?

算法時(shí)間復(fù)雜度

好塞淹,怎么理解窟蓝?一句話來(lái)說(shuō)就是
你用代碼做某一件事件,所消耗的總體時(shí)間長(zhǎng)度,就是該事件(算法)的時(shí)間復(fù)雜度饱普。
這里暫且不說(shuō)平均復(fù)雜度和實(shí)際復(fù)雜度运挫。我們后面再講這些。

大O表示法

大O表示法呢套耕?
一個(gè)用來(lái)表示算法時(shí)間復(fù)雜度的公式名稱(chēng)谁帕,用于指出該算法的效率有多快。在計(jì)算機(jī)領(lǐng)域我們用函數(shù)來(lái)表示
當(dāng)我第一次接觸到大O表示法時(shí)箍铲,我還在糾結(jié)雇卷,那小o表示法又是什么鬓椭。其實(shí)根本沒(méi)有這種東西颠猴。大O表示法僅僅是一個(gè)名稱(chēng)。

//表達(dá)式其中n表示要執(zhí)行的次數(shù)小染。
 O(n)

例子

  • O(n) 傻找算法(線性時(shí)間)
  • O(log n) 二分查找

黑魔法大雞排把你的老婆抓起來(lái)藏在召喚師峽谷的地窖中翘瓮。依照你過(guò)人的聰明智慧,你用敏銳的嗅覺(jué)一路上根據(jù)老婆的味道裤翩,靠鼻子聞到了地窖资盅。打開(kāi)一看调榄。里面有1000個(gè)和你老婆一模一樣的蠟像,但其中有一個(gè)是真正的老婆呵扛。放眼望去每庆,你并不知道哪個(gè)是你的老婆,因?yàn)樗麄儗?shí)在太像了今穿。由于被大雞排下了詛咒缤灵,真正的老婆被封印了起來(lái),只有通過(guò)真愛(ài)么么噠才能喚醒 (づ ̄3 ̄)づ╭?~蓝晒。

O(n) 傻找算法(線性時(shí)間)

此刻你急中生智腮出,罵道:“什么爛劇情例子,用鼻子聞到老婆的味道跟我聰明的智慧有個(gè)毛關(guān)系啊芝薇?,還tm要一個(gè)么么噠”胚嘲,你只好決定一個(gè)一個(gè)親下去。從第一個(gè)親到最后一個(gè)洛二。
我們用代碼來(lái)表示這個(gè)過(guò)程就是:

//999個(gè)假老婆+一個(gè)真的
List<Wife> Wifes= {蠟像馋劈,蠟像,蠟像...真老婆晾嘶,蠟像}侣滩;
// 我自己
 Lead myself =new Lead();

for(i=0; i<=Wifes.length; ++i){
  boolean  resurrection =kiss(Wifes.get(i))变擒; //么么噠喚醒
  if(resurrection ){
     Log.i(“已找到老婆他在”+i+“個(gè),趕緊抬回家君珠,遠(yuǎn)離召喚師峽谷”);
     return ;
  }
}

 boolean  kiss(Wife mWife){
  //調(diào)用自己的么么噠方法 返回真假
 return myself.kiss(mWife)娇斑;
}

這個(gè)過(guò)程是我們有一個(gè)Wifes容器裝下了999個(gè)蠟像和一個(gè)真正的老婆策添。然后myself 是自己,擁有一個(gè)kiss方法用來(lái)喚醒老婆并返回真假。這里模擬從第一個(gè)開(kāi)始kiss到最后一個(gè)毫缆。當(dāng)我們找到了老婆就停止一切行為唯竹。

那么我們的時(shí)間復(fù)雜度是:最多嘗試1000次,即** O(n)來(lái)表示苦丁,其中n**表示次數(shù)浸颓。是不是很簡(jiǎn)單。

這是最糟糕的結(jié)果旺拉,大雞排將你的wife放在最后一個(gè)位置产上,你從第一個(gè)開(kāi)始親,親到最后一個(gè)蛾狗。你需要嘗試1000次晋涣。但絕不會(huì)超過(guò)這個(gè)范圍。當(dāng)然實(shí)際情況也可能是O(1)沉桌,第一次成功了谢鹊。

我們通過(guò)這個(gè)算法得到了時(shí)間復(fù)雜度公式: O(n)

O(log n) 二分查找

接著上面的列子算吩。還記得召喚師峽谷里有個(gè)商店老爺爺嗎?他說(shuō)能為你打開(kāi)此次尋找的天機(jī)佃扼。將所有蠟像的序號(hào)都展示出來(lái)偎巢,并且他每次都能告訴你整個(gè)區(qū)間內(nèi)是否存在真正的老婆。你想了想那么我可以從中間對(duì)折拆分找呀兼耀,這樣可以每次直接排除掉一半艘狭。這個(gè)過(guò)程就像:

第一次詢(xún)問(wèn):** 500~1000** 他說(shuō)不存在, 1~499那么一定存在翠订。
第二次詢(xún)問(wèn):** 250~499** 他說(shuō)不存在巢音, 1~249那么一定存在。
第三次詢(xún)問(wèn):** 125~249** 他說(shuō)不存在尽超, 1~124那么一定存在官撼。
第四次詢(xún)問(wèn):** 63~124** 他說(shuō)不存在, 1~62那么一定存在似谁。
第五次詢(xún)問(wèn):** 31~62** 他說(shuō)不存在傲绣, 1~30那么一定存在。
第六次詢(xún)問(wèn):** 15~30** 他說(shuō)不存在巩踏, 1~15那么一定存在秃诵。
第七次詢(xún)問(wèn):** 7~14** 他說(shuō)不存在, 1~6那么一定存在塞琼。
第八次詢(xún)問(wèn):** 3~6** 他說(shuō)不存在菠净, 1~2那么一定存在。
第九次詢(xún)問(wèn):** 2** 他說(shuō)不對(duì)彪杉,那么結(jié)果只剩下1了毅往。

好,我們捋一捋派近。實(shí)際每次詢(xún)問(wèn)我們都可以排除一半絕對(duì)不可能存在的攀唯。也就是說(shuō)最多我們需要經(jīng)過(guò)9步即可完成從1000個(gè)老婆中出真正的老婆。
如果我們把它寫(xiě)成代碼就會(huì)是這個(gè)樣子:

//999個(gè)假老婆+一個(gè)真的
List<Wife> Wifes= {蠟像渴丸,蠟像侯嘀,蠟像...真老婆,蠟像}谱轨;
// 我自己
 Lead myself =new Lead()戒幔;

int low=0; //最低位
int high = Wifes.length-1; //最高位
int mid; //折中猜想數(shù)

  while( low<=high){
       mid=(low+higt)/2
      likeWife=Wifes.get(mid);
      if( kiss(likeWife)){
          Log.i(“已找到老婆他在”+mid+“個(gè),趕緊抬回家碟嘴,遠(yuǎn)離召喚師峽谷”)溪食;
          return ;
      }
    boolean  deviation=  elderlyHelp(likeWife);
      if(deviation){ //往左偏移 表示大了
      high=mid-1娜扇;
      }esle{  //往右偏移 表示小了
      low=mid+1错沃;
    }
  }

}

//老爺爺?shù)膸椭?返回區(qū)間內(nèi)是否包含
boolean   elderlyHelp(){
  ····
}  

 boolean  kiss(Wife mWife){
  //調(diào)用自己的么么噠方法 返回真假
 return myself.kiss(mWife);
}

這樣我們就推倒出二分法查找實(shí)際是是對(duì)數(shù)函數(shù)的反向冪運(yùn)算雀瓢。所以推倒出公式為:O(log n)

稍微說(shuō)一下log對(duì)數(shù)運(yùn)算枢析,也許你學(xué)過(guò)又忘了。log以10為底數(shù)多少次冪結(jié)果等于100刃麸,其實(shí)就是指多少個(gè)10相乘的結(jié)果為100醒叁。答案是兩個(gè):10 × 10 = 100。所以log以10為底數(shù)的 2次冪等于100泊业。

O(n)對(duì)比 O(log n)

假定我們每一次myself.kiss用于激活的方法需要1秒鐘執(zhí)行把沼。當(dāng)采用第一種算法時(shí),時(shí)間復(fù)雜度為O(n) 吁伺,那么需要1000秒才能找出老婆饮睬。但如果采用了二分查找,時(shí)間復(fù)雜度為 O(log n) 篮奄,那么僅需要9秒即可完成操作捆愁。其中n表示次數(shù)。那么由此可見(jiàn)O(log n) 比O(n)要快窟却。當(dāng)元素越多的時(shí)候昼丑,執(zhí)行的效率就尤其具有可比性。


題外話

好夸赫,那么到這里就講完了今天的內(nèi)容啦菩帝。如果你感興趣的話可以再去了解O(n!) n階乘的時(shí)間復(fù)雜度。當(dāng)n階越高茬腿,消耗的時(shí)間越長(zhǎng)胁附。這是計(jì)算機(jī)領(lǐng)域非常經(jīng)典的旅行商問(wèn)題。 感興趣戳這里過(guò)去繼續(xù)深入閱讀滓彰。

旅行推銷(xiāo)員問(wèn)題(英語(yǔ):Travelling salesman problem, TSP)是這樣一個(gè)問(wèn)題:給定一系列城市和每對(duì)城市之間的距離控妻,求解訪問(wèn)每一座城市一次并回到起始城市的最短回路。它是組合優(yōu)化中的一個(gè)NP困難問(wèn)題揭绑,在運(yùn)籌學(xué)理論計(jì)算機(jī)科學(xué)中非常重要弓候。

看完本篇并不能讓你成一個(gè)優(yōu)秀的工程獅,這是入門(mén)級(jí)別的基礎(chǔ)知識(shí)他匪。但如果因?yàn)槭悄憧赐赀@篇文章后產(chǎn)生了這種想法菇存,我的目的就達(dá)到了,至少已經(jīng)在通往優(yōu)秀工程獅的路上了邦蜜。那么更多的知識(shí)還需要長(zhǎng)久的打磨和學(xué)習(xí)依鸥。共勉 加油!


如何下次找到我?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末悼沈,一起剝皮案震驚了整個(gè)濱河市贱迟,隨后出現(xiàn)的幾起案子姐扮,更是在濱河造成了極大的恐慌,老刑警劉巖衣吠,帶你破解...
    沈念sama閱讀 218,036評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件茶敏,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡缚俏,警方通過(guò)查閱死者的電腦和手機(jī)惊搏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)忧换,“玉大人恬惯,你說(shuō)我怎么就攤上這事⊙遣纾” “怎么了酪耳?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,411評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)才写。 經(jīng)常有香客問(wèn)我葡兑,道長(zhǎng),這世上最難降的妖魔是什么赞草? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,622評(píng)論 1 293
  • 正文 為了忘掉前任讹堤,我火速辦了婚禮,結(jié)果婚禮上厨疙,老公的妹妹穿的比我還像新娘洲守。我一直安慰自己,他們只是感情好沾凄,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,661評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布梗醇。 她就那樣靜靜地躺著,像睡著了一般撒蟀。 火紅的嫁衣襯著肌膚如雪叙谨。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,521評(píng)論 1 304
  • 那天保屯,我揣著相機(jī)與錄音手负,去河邊找鬼。 笑死姑尺,一個(gè)胖子當(dāng)著我的面吹牛竟终,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播切蟋,決...
    沈念sama閱讀 40,288評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼统捶,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起喘鸟,我...
    開(kāi)封第一講書(shū)人閱讀 39,200評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤匆绣,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后迷守,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體犬绒,經(jīng)...
    沈念sama閱讀 45,644評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡旺入,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,837評(píng)論 3 336
  • 正文 我和宋清朗相戀三年兑凿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片茵瘾。...
    茶點(diǎn)故事閱讀 39,953評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡礼华,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出拗秘,到底是詐尸還是另有隱情圣絮,我是刑警寧澤,帶...
    沈念sama閱讀 35,673評(píng)論 5 346
  • 正文 年R本政府宣布雕旨,位于F島的核電站扮匠,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏凡涩。R本人自食惡果不足惜棒搜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,281評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望活箕。 院中可真熱鬧力麸,春花似錦、人聲如沸育韩。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,889評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)筋讨。三九已至埃叭,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間悉罕,已是汗流浹背赤屋。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,011評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蛮粮,地道東北人益缎。 一個(gè)月前我還...
    沈念sama閱讀 48,119評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像然想,于是被迫代替她去往敵國(guó)和親莺奔。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,901評(píng)論 2 355

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

  • 每一個(gè)優(yōu)秀的開(kāi)發(fā)者腦中都有時(shí)間概念。他們想給用戶更多的時(shí)間讓用戶做他們想做的事情令哟。他們通過(guò)最小化時(shí)間復(fù)雜度來(lái)實(shí)現(xiàn)這...
    唐先僧閱讀 16,509評(píng)論 3 38
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,129評(píng)論 25 707
  • 我覺(jué)得有時(shí)候逼自己一把真的很有必要恼琼,特別是在自己充滿不確定性的時(shí)候。要勇敢的嘗試屏富,逼自己走出舒適圈
    海莉小姐姐閱讀 252評(píng)論 0 0
  • 一如我閉上了眼,腦子里都是心中的亮神年。 不去看那些糟心的和無(wú)意義而浪費(fèi)精力擔(dān)憂的已维! 我生就只有一雙眼,沒(méi)睜開(kāi)已日,也沒(méi)閉...
    木土有阿杜閱讀 277評(píng)論 0 1
  • 平日里最討厭的就是過(guò)了時(shí)間還在等人飘千,約定好幾點(diǎn)見(jiàn)面堂鲜,我永遠(yuǎn)是那個(gè)提前幾分鐘到的人,我不要求別人跟我一樣會(huì)提前护奈,但請(qǐng)...
    68bed5e7a503閱讀 1,116評(píng)論 0 1