用PHP的方式實(shí)現(xiàn)的各類算法合集

簡(jiǎn)易結(jié)構(gòu)

要做什么借宵?

image.png

10年架構(gòu)師領(lǐng)你架構(gòu)-成長之路-(附面試題(含答案))

(騰訊T3-T4)打造互聯(lián)網(wǎng)PHP架構(gòu)師教程目錄大全枣察,只要你看完,薪資立馬提升2倍(持續(xù)更新)

點(diǎn)擊與我交流企鵝群.

原文轉(zhuǎn)發(fā):segmentfault.com

當(dāng)然

用 PHP 實(shí)現(xiàn)算法并替代官方提供的函數(shù)是愚蠢的事情 .但這覺不代表斟酌算法就是件無意義的事 , 每個(gè)算法都是一種思想的結(jié)晶 , 學(xué)習(xí)優(yōu)秀的思想 , 開拓思維

什么是算法?

直白地說趁怔,算法就是任何明確定義的計(jì)算過程,它接收一些值或集合作為輸入薪前,并產(chǎn)生一些值或集合作為輸出润努。這樣,算法就是將輸入轉(zhuǎn)換為輸出的一系列計(jì)算過程示括。來源:Thomas H. Cormen, Chales E. Leiserson (2009), 《算法導(dǎo)論第三版》铺浇。

簡(jiǎn)而言之,我們可以說算法就是用來解決一個(gè)特定任務(wù)的一系列步驟(是的垛膝,不止計(jì)算機(jī)在使用算法随抠,人類也同樣如此)。目前繁涂,一個(gè)有效的算法應(yīng)該含有三個(gè)重要特性:

  • 它必須是有限的:如果你設(shè)計(jì)的算法永無休止地嘗試解決問題拱她,那么它是無用的。

  • 它必須具備明確定義的指令:算法的每一步都必須準(zhǔn)確定義扔罪,在任何場(chǎng)景下指令都應(yīng)當(dāng)沒有歧義秉沼。

  • 它必須是有效的:一個(gè)算法被設(shè)計(jì)用以解決某個(gè)問題,那么它就應(yīng)當(dāng)能解決這個(gè)問題,并且僅僅使用紙和筆就能證明該算法是收斂的唬复。

對(duì)數(shù)

log10100 相當(dāng)于問"降多少個(gè)10相乘的結(jié)果為100"矗积,答案當(dāng)然是2個(gè)了 因此log10100=2,即對(duì)數(shù)運(yùn)算是冪運(yùn)算的逆運(yùn)算

image

運(yùn)行時(shí)間

以二分查找為例敞咧,使用它可節(jié)省多少時(shí)間呢棘捣?簡(jiǎn)單查找諸葛地檢查數(shù)字,如果列表包含100個(gè)數(shù)字休建,最多需要猜100次乍恐。 換而言之最多需要猜測(cè)的次數(shù)與列表長度相同,這被稱為線性時(shí)間(linear time)测砂,而二分查找則不同茵烈,如果列表包含100個(gè)元素 最多需要7次,如果列表包含40億個(gè)數(shù)字砌些,最多需猜32次呜投,而分查找的運(yùn)行時(shí)間為對(duì)數(shù)時(shí)間 O(log)

大O表示法

大O表示法是一種特殊的表示法 ,指出了算法的速度有多快存璃。有個(gè)屌用啊仑荐,實(shí)際上,你經(jīng)常要去復(fù)制別人的代碼纵东。 在這種情況下释漆,知道這些算法的速度有快有慢

  • 算法的運(yùn)行時(shí)間以不同的速度增加

  • 例如簡(jiǎn)單查找與二分查找的區(qū)別

image
  • 大O表示發(fā)指出了算法有多快,例如列表包含n個(gè)元素篮迎,簡(jiǎn)單查找需要檢查每個(gè)元素男图,因此需要執(zhí)行n次操作 使用大O表示發(fā)這個(gè)運(yùn)行時(shí)間為O(n),二分查找需要執(zhí)行l(wèi)ogn次操作,使用大O表示為O(log n)

點(diǎn)擊與我交流企鵝群.

感謝大家一直來支持甜橱,這是我準(zhǔn)備的1000粉絲福利

【1000粉絲福利】10年架構(gòu)師分享PHP進(jìn)階架構(gòu)資料逊笆,助力大家都能30K

  • 一些常見的大O運(yùn)行時(shí)間

  • O(log n) ,也叫對(duì)數(shù)時(shí)間,這樣的算法包括二分算法

  • O(n),也叫線性時(shí)間岂傲,這樣的算法包括簡(jiǎn)單查找难裆。

  • O(n * log n) 快速排序

  • O(n2),選擇排序

  • O(n!) 即階乘時(shí)間

  • 這里是重點(diǎn)

  • 算法的速度指的并非時(shí)間,而是操作數(shù)的增速

  • 談?wù)撍惴ǖ乃俣葧r(shí)間時(shí)镊掖,我們說的是隨著輸入的增加乃戈,其運(yùn)行時(shí)間將以什么樣的速度增加

  • 算法的運(yùn)行時(shí)間用大O表示發(fā)表示

  • O(log n)比O(n)快,當(dāng)需要搜索的元素越多時(shí)亩进,前者比后者快的越多

編寫解決實(shí)際問題的程序過程

  • 如何用數(shù)據(jù)形式描述問題症虑,即將問題抽象為一個(gè)數(shù)學(xué)模型

  • 問題所涉及到的數(shù)據(jù)量的大小及數(shù)據(jù)之間的關(guān)系

  • 如何在計(jì)算機(jī)中儲(chǔ)存數(shù)據(jù)及體現(xiàn)數(shù)據(jù)之間的關(guān)系

  • 處理數(shù)據(jù)時(shí)需要對(duì)數(shù)據(jù)執(zhí)行的操作

  • 編寫的程序的性能是否良好

數(shù)據(jù)(Data)

  • 是客觀事物的符號(hào)表示,在計(jì)算機(jī)科學(xué)中指的是所有能輸入到計(jì)算機(jī)中并被計(jì)算機(jī)程序處理的符號(hào)的總稱归薛。

  • 數(shù)據(jù)元素(Data Element) :是數(shù)據(jù)的基本單位谍憔,在程序中通常作為一個(gè)整體來進(jìn)行考慮和處理匪蝙。一個(gè)數(shù)據(jù)元素可由若干個(gè)數(shù)據(jù)項(xiàng)(Data Item)組成。

  • 數(shù)據(jù)項(xiàng)(Data Item) : 是數(shù)據(jù)的不可分割的最小單位习贫。數(shù)據(jù)項(xiàng)是對(duì)客觀事物某一方面特性的數(shù)據(jù)描述逛球。

  • 數(shù)據(jù)對(duì)象(Data Object) :是性質(zhì)相同的數(shù)據(jù)元素的集合,是數(shù)據(jù)的一個(gè)子集苫昌。如字符集合C={‘A’,’B’,’C,…} 颤绕。

  • 數(shù)據(jù)結(jié)構(gòu) :相互之間具有一定聯(lián)系的數(shù)據(jù)元素的集合。

  • 數(shù)據(jù)的邏輯結(jié)構(gòu) : 數(shù)據(jù)元素之間的相互關(guān)系稱為邏輯結(jié)構(gòu)祟身。

  • 數(shù)據(jù)操作 : 對(duì)數(shù)據(jù)要進(jìn)行的運(yùn)算

  • 數(shù)據(jù)類型(Data Type):指的是一個(gè)值的集合和定義在該值集上的一組操作的總稱奥务。

大廠2000道面試題(含答案)

PHP面試題匯總,看完這些面試題助力你面試成功月而,工資必有20-25K

點(diǎn)擊與我交流企鵝群.

數(shù)據(jù)的邏輯結(jié)構(gòu)有四種基本類型

  • 集合:結(jié)構(gòu)中數(shù)據(jù)元素之間除了“屬于同一個(gè)集合"外,再也沒有其他的關(guān)系

  • 線性結(jié)構(gòu):結(jié)構(gòu)中的數(shù)據(jù)元素存在一對(duì)一的關(guān)系

  • 樹形結(jié)構(gòu):結(jié)構(gòu)中的數(shù)據(jù)元素存在一對(duì)多的關(guān)系

  • 網(wǎng)狀或者圖狀結(jié)構(gòu):結(jié)構(gòu)中的數(shù)據(jù)元素存在多對(duì)多的關(guān)系

數(shù)據(jù)結(jié)構(gòu)的儲(chǔ)存方式

由數(shù)據(jù)元素之間的關(guān)系在計(jì)算機(jī)中有兩種不同的表示方法——順序表示和非順序表示,從則導(dǎo)出兩種儲(chǔ)存方式议纯,順序儲(chǔ)存結(jié)構(gòu)和鏈?zhǔn)絻?chǔ)存結(jié)構(gòu)

  • 順序存儲(chǔ)結(jié)構(gòu):用數(shù)據(jù)元素在存儲(chǔ)器中的相對(duì)位置來表示數(shù)據(jù)元素之間的邏輯結(jié)構(gòu)(關(guān)系)父款,數(shù)據(jù)元素存放的地址是連續(xù)的

  • 鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu):在每一個(gè)數(shù)據(jù)元素中增加一個(gè)存放另一個(gè)元素地址的指針(pointer),用該指針來表示數(shù)據(jù)元素之間的邏輯結(jié)構(gòu)(關(guān)系)瞻凤,數(shù)據(jù)元素存放的地址是否連續(xù)沒有要求

數(shù)據(jù)的邏輯結(jié)構(gòu)和物理結(jié)構(gòu)是密不可分的兩個(gè)方面憨攒,一個(gè)算法的設(shè)計(jì)取決于所選定的邏輯結(jié)構(gòu),而算法的實(shí)現(xiàn)依賴于所采用的存儲(chǔ)結(jié)構(gòu)

算法(Algorithm)

是對(duì)特定問題求解方法(步驟)的一種描述阀参,是指令的有限序列肝集,其中每一條指令表示一個(gè)或多個(gè)操作。

算法具有以下五個(gè)特性

  • 有窮性: 一個(gè)算法必須總是在執(zhí)行有窮步之后結(jié)束蛛壳,且每一步都在有窮時(shí)間內(nèi)完成

  • 確定性:算法中每一條指令必須有確切的含義杏瞻,不存在二義性,且算法只有一個(gè)入口和一個(gè)出口

  • 可行性: 一個(gè)算法是能行的衙荐,即算法描述的操作都可以通過已經(jīng)實(shí)現(xiàn)的基本運(yùn)算執(zhí)行有限次來實(shí)現(xiàn)

  • 輸入: 一個(gè)算法有零個(gè)或多個(gè)輸入捞挥,這些輸入取自于某個(gè)特定的對(duì)象集合

  • 輸出: 一個(gè)算法有一個(gè)或多個(gè)輸出,這些輸出是同輸入有著某些特定關(guān)系的量

算法和程序是兩個(gè)不同的概念

一個(gè)計(jì)算機(jī)程序是對(duì)一個(gè)算法使用某種程序設(shè)計(jì)語言的具體實(shí)現(xiàn)忧吟。算法必須可終止意味著不是所有的計(jì)算機(jī)程序都是算法砌函。

評(píng)價(jià)一個(gè)好的算法有以下幾個(gè)標(biāo)準(zhǔn)

  • 正確性(Correctness ): 算法應(yīng)滿足具體問題的需

  • 可讀性(Readability): 算法應(yīng)容易供人閱讀和交流,可讀性好的算法有助于對(duì)算法的理解和修改

  • 健壯性(Robustness): 算法應(yīng)具有容錯(cuò)處理溜族,當(dāng)輸入非法或錯(cuò)誤數(shù)據(jù)時(shí)讹俊,算法應(yīng)能適當(dāng)?shù)刈鞒龇磻?yīng)或進(jìn)行處理,而不會(huì)產(chǎn)生莫名其妙的輸出結(jié)果

  • 通用性(Generality): 算法應(yīng)具有一般性 煌抒,即算法的處理結(jié)果對(duì)于一般的數(shù)據(jù)集合都成立

效率與存儲(chǔ)量需求: 效率指的是算法執(zhí)行的時(shí)間仍劈;存儲(chǔ)量需求指算法執(zhí)行過程中所需要的最大存儲(chǔ)空間,一般地寡壮,這兩者與問題的規(guī)模有關(guān)

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

算法中基本操作重復(fù)執(zhí)行的次數(shù)是問題規(guī)模n的某個(gè)函數(shù)耳奕,其時(shí)間量度記作T(n)=O(f(n))绑青,稱作算法的漸近時(shí)間復(fù)雜度(Asymptotic Time complexity),簡(jiǎn)稱時(shí)間復(fù)雜度

算法的空間復(fù)雜度

是指算法編寫成程序后屋群,在計(jì)算機(jī)中運(yùn)行時(shí)所需存儲(chǔ)空間大小的度量闸婴,記作:S(n)=O(f(n)),其中n為問題規(guī)模

遞歸和循環(huán)的簡(jiǎn)單比較:

  1. 從程序上看,遞歸表現(xiàn)為自己調(diào)用自己芍躏,循環(huán)則沒有這樣的形式邪乍。

  2. 遞歸是從問題的最終目標(biāo)出發(fā),逐漸將復(fù)雜問題化為簡(jiǎn)單問題对竣,并且簡(jiǎn)單的問題的解決思路和復(fù)雜問題一樣庇楞,同時(shí)存在基準(zhǔn)情況,就能最終求得問題否纬,是逆向的吕晌。而循環(huán)是從簡(jiǎn)單問題出發(fā),一步步的向前發(fā)展临燃,最終求得問題睛驳,是正向的。

  3. 任意循環(huán)都是可以用遞歸來表示的膜廊,但是想用循環(huán)來實(shí)現(xiàn)遞歸(除了單向遞歸和尾遞歸)乏沸,都必須引入棧結(jié)構(gòu)進(jìn)行壓棧出棧。

  4. 一般來說爪瓜,非遞歸的效率高于遞歸蹬跃。而且遞歸函數(shù)調(diào)用是有開銷的,遞歸的次數(shù)受堆棧大小的限制铆铆。

一起進(jìn)步學(xué)習(xí)

  1. Fork 我的項(xiàng)目并提交你的 idea

  2. Pull Request

  3. Merge

糾錯(cuò)

如果大家發(fā)現(xiàn)有什么不對(duì)的地方蝶缀,可以發(fā)起一個(gè)issue或者pull request,我會(huì)及時(shí)糾正

補(bǔ)充:發(fā)起pull request的commit message請(qǐng)參考文章Commit message 和 Change log 編寫指南

喜歡我的文章就關(guān)注我吧薄货,持續(xù)更新中.....

以上內(nèi)容希望幫助到大家扼劈,很多PHPer在進(jìn)階的時(shí)候總會(huì)遇到一些問題和瓶頸,業(yè)務(wù)代碼寫多了沒有方向感菲驴,不知道該從那里入手去提升荐吵,對(duì)此我整理了一些資料,包括但不限于:分布式架構(gòu)赊瞬、高可擴(kuò)展先煎、高性能、高并發(fā)巧涧、服務(wù)器性能調(diào)優(yōu)薯蝎、TP6,laravel谤绳,YII2占锯,Redis袒哥,Swoole、Swoft消略、Kafka堡称、Mysql優(yōu)化、shell腳本艺演、Docker却紧、微服務(wù)、Nginx等多個(gè)知識(shí)點(diǎn)高級(jí)進(jìn)階干貨需要的可以免費(fèi)分享給大家胎撤,需要的可以點(diǎn)擊進(jìn)入暗號(hào):知乎晓殊。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市伤提,隨后出現(xiàn)的幾起案子巫俺,更是在濱河造成了極大的恐慌,老刑警劉巖肿男,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件介汹,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡次伶,警方通過查閱死者的電腦和手機(jī)痴昧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門稽穆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來冠王,“玉大人,你說我怎么就攤上這事舌镶≈梗” “怎么了?”我有些...
    開封第一講書人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵餐胀,是天一觀的道長哟楷。 經(jīng)常有香客問我,道長否灾,這世上最難降的妖魔是什么卖擅? 我笑而不...
    開封第一講書人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮墨技,結(jié)果婚禮上惩阶,老公的妹妹穿的比我還像新娘。我一直安慰自己扣汪,他們只是感情好断楷,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著崭别,像睡著了一般冬筒。 火紅的嫁衣襯著肌膚如雪恐锣。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,692評(píng)論 1 305
  • 那天舞痰,我揣著相機(jī)與錄音土榴,去河邊找鬼。 笑死匀奏,一個(gè)胖子當(dāng)著我的面吹牛鞭衩,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播娃善,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼论衍,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了聚磺?” 一聲冷哼從身側(cè)響起坯台,我...
    開封第一講書人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎瘫寝,沒想到半個(gè)月后蜒蕾,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡焕阿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年咪啡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片暮屡。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡撤摸,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出褒纲,到底是詐尸還是另有隱情准夷,我是刑警寧澤,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布莺掠,位于F島的核電站衫嵌,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏彻秆。R本人自食惡果不足惜楔绞,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望唇兑。 院中可真熱鬧酒朵,春花似錦、人聲如沸幔亥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽帕棉。三九已至针肥,卻和暖如春饼记,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背慰枕。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來泰國打工具则, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人具帮。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓博肋,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蜂厅。 傳聞我的和親對(duì)象是個(gè)殘疾皇子匪凡,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355