校招算法系列1:算法與數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí)基礎(chǔ)
? ???校招不同于社招,不管是科班的大數(shù)據(jù)/計(jì)算機(jī)相關(guān)類(lèi)專(zhuān)業(yè)的,還是其他專(zhuān)業(yè)轉(zhuǎn)行大數(shù)據(jù)的小伙伴。同樣大數(shù)據(jù)校招面試也是更看重基礎(chǔ)(尤其是中大廠),校招不僅需要掌握大數(shù)據(jù)相關(guān)技術(shù),還需要掌握一些基礎(chǔ)知識(shí)(如計(jì)算機(jī)基礎(chǔ),算法數(shù)據(jù)結(jié)構(gòu)),校招面試內(nèi)容雜而多,如何系統(tǒng)化備戰(zhàn)?
? ? ? 桐哥,壯哥,21年畢業(yè)研究生,目前在職快手,米哈游。倆人是校招收割機(jī),校招拿到了美團(tuán),字節(jié),快手,京東,滴滴,攜程,小米,vivo,米哈游,好未來(lái),小紅書(shū),garena,貝殼找房,招行,興業(yè)銀行等多家大中廠大數(shù)據(jù)校招Offer。
? ? ? 現(xiàn)在趁著熱乎勁,親自帶大家進(jìn)行大數(shù)據(jù)校招學(xué)習(xí)。結(jié)合自身校招經(jīng)歷,親自系列化總結(jié)大數(shù)據(jù)校招知識(shí),剖析核心知識(shí),系統(tǒng)化帶大家備戰(zhàn)校招,規(guī)劃學(xué)習(xí),考勤打卡,你需要負(fù)責(zé)學(xué)習(xí),不需要擔(dān)心需要學(xué)習(xí)什么?持續(xù)更新整個(gè)系列。

1.模塊學(xué)習(xí)建議
? ? ???本系列是上面腦圖的數(shù)據(jù)結(jié)構(gòu)與算法模塊,這塊是校招核心,尤其是大廠必面(不管校招社招),不管是Java崗還是大數(shù)據(jù)崗位;但是數(shù)據(jù)結(jié)構(gòu)與算法這塊學(xué)習(xí)難度大,題型多,題目雜,??停琹eetCode有幾千道,有些題目需要一定的技術(shù)背景,基礎(chǔ)儲(chǔ)備,否則普通人連題目都看不懂。那就必須有所取舍。這里桐哥,壯哥精選題型題目精講系列。
2. 算法之入門(mén)基礎(chǔ)知識(shí)儲(chǔ)備
2.1 .學(xué)習(xí)必需知識(shí)儲(chǔ)備
掌握主流編程語(yǔ)言之一:C語(yǔ)言,C++,JAVA,或者Python等(建議使用java)
熟悉算法的衡量方式時(shí)間復(fù)雜度,空間復(fù)雜度
2.2 知識(shí)點(diǎn)總結(jié)
時(shí)間復(fù)雜度:是指執(zhí)行當(dāng)前算法所消耗的時(shí)間,通常用「時(shí)間復(fù)雜度」來(lái)描述。
空間復(fù)雜度:是指執(zhí)行當(dāng)前算法需要占用多少內(nèi)存空間,通常用「空間復(fù)雜度」來(lái)描述。
2.3? 基礎(chǔ)學(xué)習(xí)
? ? ?為什么有這么多的數(shù)據(jù)結(jié)構(gòu)和算法出現(xiàn)?隨著互聯(lián)網(wǎng)行業(yè)的發(fā)展,應(yīng)用程序的越來(lái)越復(fù)雜、數(shù)據(jù)種類(lèi)繁多、數(shù)據(jù)量龐大,百萬(wàn)、億級(jí)別。這樣會(huì)使得程序執(zhí)行、數(shù)據(jù)處理變得很慢,設(shè)置無(wú)法執(zhí)行。數(shù)據(jù)結(jié)構(gòu)和算法就是來(lái)解決這些問(wèn)題的。
??????問(wèn)題又來(lái)了,它們憑什么可以改善這些問(wèn)題呢?首先,不同的數(shù)據(jù)結(jié)構(gòu)憑借其不同的存儲(chǔ)方式,可以最優(yōu)的適用于各種不同的業(yè)務(wù)需要。其次,經(jīng)過(guò)這么多年的發(fā)展,相信都知道時(shí)間復(fù)雜度和空間復(fù)雜度這兩個(gè)重點(diǎn)概念,我們?cè)趯?shí)際的代碼開(kāi)發(fā)中,都會(huì)考慮到這兩者的更佳值(同一個(gè)場(chǎng)景下,業(yè)務(wù)邏輯不變的情況下,調(diào)整代碼邏輯,使其執(zhí)行速度更快,資源消耗更少)。最后,就是要感謝機(jī)器硬件配置的改善,這種發(fā)展是與時(shí)俱進(jìn)的,極大地改善了代碼的運(yùn)行效率和環(huán)境。
??????對(duì)于同一個(gè)問(wèn)題,使用不同的算法,也許最終得到的結(jié)果是一樣的,但在過(guò)程中消耗的資源和時(shí)間卻會(huì)有很大的區(qū)別。
時(shí)間復(fù)雜度:是指執(zhí)行當(dāng)前算法所消耗的時(shí)間,通常用「時(shí)間復(fù)雜度」來(lái)描述。
空間復(fù)雜度:是指執(zhí)行當(dāng)前算法需要占用多少內(nèi)存空間,通常用「空間復(fù)雜度」來(lái)描述。
在這里舉個(gè)例子簡(jiǎn)單介紹下二者的計(jì)算方法:
1.?? 時(shí)間復(fù)雜度
????????時(shí)間復(fù)雜度并不是將算法程序運(yùn)行的時(shí)間作為衡量值,這種方法容易受運(yùn)行環(huán)境的影響,在性能高的機(jī)器上跑出來(lái)的結(jié)果與在性能低的機(jī)器上跑的結(jié)果相差會(huì)很大。而且對(duì)測(cè)試時(shí)使用的數(shù)據(jù)規(guī)模也有很大關(guān)系。并且,我們?cè)趯?xiě)算法的時(shí)候,還沒(méi)有辦法完整的去運(yùn)行對(duì)吧。
????????所以,我們假設(shè)算法的問(wèn)題規(guī)模為n,那么操作單元數(shù)量便用函數(shù)f(n)來(lái)表示,隨著數(shù)據(jù)規(guī)模n的增大,算法執(zhí)行時(shí)間的增長(zhǎng)率和f(n)的增長(zhǎng)率相同,這就是算法復(fù)雜度的計(jì)算方法。
? ? ? ?一些具有迷惑性的例子:
上面這段代碼的時(shí)間復(fù)雜度是?O(nlog n) 而不是 O(n^2)
上面這段代碼的時(shí)間復(fù)雜度是 O(sqrt(n)) 而不是 O(n)。
????????再舉一個(gè)例子,有一個(gè)字符串?dāng)?shù)組,將數(shù)組中的每一個(gè)字符串按照字母序排序,之后再將整個(gè)字符串?dāng)?shù)組按照字典序排序。兩步操作的整體時(shí)間復(fù)雜度是多少呢?
????????如果回答是 O(n*nlog n + nlog n) = O(n^2log n),這個(gè)答案是錯(cuò)誤的。字符串的長(zhǎng)度和數(shù)組的長(zhǎng)度是沒(méi)有關(guān)系的,所以這兩個(gè)變量應(yīng)該單獨(dú)計(jì)算。假設(shè)最長(zhǎng)的字符串長(zhǎng)度為 s,數(shù)組中有 n 個(gè)字符串。對(duì)每個(gè)字符串排序的時(shí)間復(fù)雜度是 O(slog s),將數(shù)組中每個(gè)字符串都按照字母序排序的時(shí)間復(fù)雜度是 O(n * slog s)。
????????將整個(gè)字符串?dāng)?shù)組按照字典序排序的時(shí)間復(fù)雜度是 O(s * nlog n)。排序算法中的 O(nlog n) 是比較的次數(shù),由于比較的是整型數(shù)字,所以每次比較是 O(1)。但是字符串按照字典序比較,時(shí)間復(fù)雜度是 O(s)。所以字符串?dāng)?shù)組按照字典序排序的時(shí)間復(fù)雜度是 O(s * nlog n)。所以整體復(fù)雜度是 O(n * slog s) + O(s * nlog n) = O(n*slog s + s*nlogn) = O(n*s*(log s + log n)) = O(n*s*log(n*s))。
????????常見(jiàn)的時(shí)間復(fù)雜度量級(jí)有:O(1)、O(logN)、O(n)、O(nlogN)、O(n2)、O(n3)、O(n^k)、(2^n)等。
一些示例及經(jīng)驗(yàn)(代碼):

總結(jié)如下:
2.?? 空間復(fù)雜度
????????時(shí)間復(fù)雜度不是用來(lái)計(jì)算程序具體耗時(shí)的,那么空間復(fù)雜度也不是用來(lái)計(jì)算程序?qū)嶋H占用的空間的??臻g復(fù)雜度是對(duì)一個(gè)算法在運(yùn)行過(guò)程中臨時(shí)占用存儲(chǔ)空間大小的一個(gè)量度,同樣反映的是一個(gè)趨勢(shì),我們用 S(n) 來(lái)定義。
空間復(fù)雜度比較常用的有:O(1)、O(n)、O(n2),我們下面來(lái)看看:
????????遞歸調(diào)用是有空間代價(jià)的,遞歸算法需要保存遞歸棧信息,所以花費(fèi)的空間復(fù)雜度會(huì)比非遞歸算法要高。
上面算法的時(shí)間復(fù)雜度為 O(n),空間復(fù)雜度 O(1)。
上面算法的時(shí)間復(fù)雜度為 O(n),空間復(fù)雜度 O(n)。
3.老師總結(jié)
???大家在初學(xué)這些的時(shí)候不需要太關(guān)注時(shí)間復(fù)雜度和空間復(fù)雜度,需要重點(diǎn)學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)的幾個(gè)分類(lèi),其存儲(chǔ)方式、使用場(chǎng)景和優(yōu)缺點(diǎn)。當(dāng)有一定積累的時(shí)候,再去關(guān)注優(yōu)化方面(后續(xù)的算法題也會(huì)有講解哈)。