《大話數(shù)據(jù)結(jié)構(gòu)》-程杰 著 閱讀筆記day2 2017-9-16 周六

回顧

? ? ? 上一篇文章主要對(duì)書中的第一章節(jié)數(shù)據(jù)結(jié)構(gòu)的緒論進(jìn)行了總結(jié)和自己的一些理解,包括數(shù)據(jù),數(shù)據(jù)元素,數(shù)據(jù)項(xiàng)還有數(shù)據(jù)對(duì)象,數(shù)據(jù)具有兩個(gè)前提一個(gè)是可以輸入到計(jì)算機(jī)內(nèi),第二個(gè)是能被計(jì)算機(jī)處理,然后數(shù)據(jù)元素就對(duì)應(yīng)一張數(shù)據(jù)庫(kù)表的一條記錄,數(shù)據(jù)項(xiàng)就是數(shù)據(jù)庫(kù)表的列,數(shù)據(jù)對(duì)象就是相同性質(zhì)的數(shù)據(jù)元素的集合比如整張表就可以看做一個(gè)數(shù)據(jù)對(duì)象,那么在這種情況下,數(shù)據(jù)即可以是表中某一行某一列的內(nèi)容,也可以是一個(gè)數(shù)據(jù)元素,更可以是一個(gè)數(shù)據(jù)對(duì)象。當(dāng)然,有一點(diǎn)需要注意的是,雖然數(shù)據(jù)項(xiàng)是數(shù)據(jù)不可分割的最小單位,但我們實(shí)際情況下討論數(shù)據(jù)的著眼點(diǎn)其實(shí)是數(shù)據(jù)元素。

? ? ? 接著,總結(jié)了一下數(shù)據(jù)結(jié)構(gòu)的概念,數(shù)據(jù)結(jié)構(gòu)是相對(duì)于數(shù)據(jù)元素來(lái)說(shuō)的,就是一個(gè)數(shù)據(jù)對(duì)象之間,數(shù)據(jù)元素的相互關(guān)系和組織形式,分為邏輯結(jié)構(gòu)和物理結(jié)構(gòu)(存儲(chǔ)結(jié)構(gòu))。邏輯結(jié)構(gòu)是指數(shù)據(jù)對(duì)象中數(shù)據(jù)元素之間的相互關(guān)系,是面向問題的;物理結(jié)構(gòu)是指數(shù)據(jù)元素之間的邏輯結(jié)構(gòu)在計(jì)算機(jī)中的存儲(chǔ)形式,是面向計(jì)算機(jī)的。“數(shù)據(jù)的存儲(chǔ)結(jié)構(gòu)應(yīng)正確反映數(shù)據(jù)元素之間的邏輯關(guān)系,這才是最為關(guān)鍵的”,“數(shù)據(jù)元素的存儲(chǔ)關(guān)系并不能反映其邏輯關(guān)系”這兩句話總結(jié)了邏輯結(jié)構(gòu)和物理結(jié)構(gòu)的關(guān)系,需要思考一下。然后,邏輯結(jié)構(gòu)分為四種:集合結(jié)構(gòu)線性結(jié)構(gòu)樹形結(jié)構(gòu)圖形結(jié)構(gòu);物理結(jié)構(gòu)分為兩種:順序存儲(chǔ)結(jié)構(gòu),類似于排隊(duì),數(shù)組在內(nèi)存中的存儲(chǔ)結(jié)構(gòu)就是順序存儲(chǔ),鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu),是把數(shù)據(jù)元素存放在任意的存儲(chǔ)單元里,這組存儲(chǔ)單元可以是連續(xù)的,也可以是不連續(xù)的,那么怎么表示數(shù)據(jù)元素之間的邏輯結(jié)構(gòu)呢,指針就應(yīng)運(yùn)而生了,指針:存放數(shù)據(jù)元素的地址,通過(guò)指針就可以找到數(shù)據(jù)元素在內(nèi)存中的位置。

? ? ? ? 最后還稍微講了一下數(shù)據(jù)類型(指一組性質(zhì)相同的值的集合及定義在此集合上的一些操作的總稱),抽象數(shù)據(jù)類型(我們對(duì)已有的數(shù)據(jù)類型進(jìn)行抽象,就有了抽象數(shù)據(jù)類型。指一個(gè)數(shù)學(xué)模型及定義在該模型上的一組操作),以及抽象(指取出事物具有的普遍性的本質(zhì))的概念。

??????? 好了,接下來(lái)就是書中的第二章:算法。

算法

?????? 算法:是解決特定問題求解步驟的描述,在計(jì)算機(jī)中表現(xiàn)為指令的有限序列,并且每條指令表示一個(gè)或多個(gè)操作。

??????? 怎么理解呢?很簡(jiǎn)單,比如我們做一道數(shù)學(xué)題,會(huì)有多種解決過(guò)程,那么每一種完整的解決過(guò)程就可以稱為一個(gè)算法,那么指令就是解決過(guò)程中的每一步,每一步需要的東西可能又會(huì)由一個(gè)或多個(gè)操作得出。書中列舉了一個(gè)最簡(jiǎn)單也是最經(jīng)典的案例,高斯算法。高斯算法:將1到n的求和表示為(n+1)*n/2,相對(duì)于最基本的求和(1+2+3+..+n)簡(jiǎn)單了很多。這其實(shí)就是兩個(gè)算法的比較,稍候會(huì)講解。

?????? 那么算法和數(shù)據(jù)結(jié)構(gòu)到底是什么關(guān)系呢?為什么說(shuō)到數(shù)據(jù)結(jié)構(gòu)就會(huì)說(shuō)到算法?書中打了一個(gè)很經(jīng)典的比方,如果一部話劇《梁山伯與祝英臺(tái)》,最后變成了《梁山伯》會(huì)怎么樣,當(dāng)然還是可以演下去,但是演出質(zhì)量就會(huì)下降好幾個(gè)檔次。那么數(shù)據(jù)結(jié)構(gòu)和算法也是如此,如果單單講數(shù)據(jù)結(jié)構(gòu)也沒有問題,但是可能講完也不知道數(shù)據(jù)結(jié)構(gòu)到底有什么用。這里怎么說(shuō)呢,因?yàn)槲乙彩切“祝缘箾]有特別深的理解,所以這里就引用書中的介紹,可能當(dāng)我學(xué)完整本書或者對(duì)數(shù)據(jù)結(jié)構(gòu)和算法有更深的理解的時(shí)候,我會(huì)過(guò)來(lái)補(bǔ)充上我自己對(duì)于數(shù)據(jù)結(jié)構(gòu)和算法兩者之間的理解。=。=

?????? 算法具有五個(gè)基本特性:輸入、輸出、有窮性、確定性、可行性。

??????? 輸入輸出:算法具有零個(gè)或多個(gè)輸入,至少具有一個(gè)或多個(gè)輸出。算法可以沒有輸入(比如打印“hello world”,應(yīng)該是所有計(jì)算機(jī)相關(guān)人員最熟悉的一句輸出了),算法是一定需要輸出的,輸出的形式可以有多種,可以是打印輸出,也可以返回一個(gè)或多個(gè)值等等。

??????? 有窮性:指算法在執(zhí)行有限的步驟之后,自動(dòng)結(jié)束而不會(huì)出現(xiàn)無(wú)限循環(huán),并且每一個(gè)步驟在可接受的時(shí)間內(nèi)完成。需要特別注意的是可接受的時(shí)間,這里有窮的概念并不是純數(shù)字意義的,而是在實(shí)際應(yīng)用中合理的,可以接受的“邊界”,如果你一個(gè)算法跑20年才會(huì)出來(lái)一個(gè)正確的結(jié)果,雖然是有窮了,但是媳婦都熬成婆了,還有什么意義呢... ????

??????? 確定性:算法的每一個(gè)步驟都具有確定的含義,不會(huì)出現(xiàn)二義性。算法在一定條件下,只有一條執(zhí)行路徑,相同的輸入只能有唯一的輸出結(jié)構(gòu)。算法的每個(gè)步驟被精確定義而無(wú)歧義。

??????? 可行性:算法的每一步都必須是可行的,也就是說(shuō),每一步都可以通過(guò)執(zhí)行有限次數(shù)完成。可行性以為著算法可以轉(zhuǎn)換為程序上機(jī)運(yùn)行,并得到正確的結(jié)果。

??????? 那么對(duì)于同一個(gè)問題的多種算法,什么才是一個(gè)好的算法呢?接下來(lái)就來(lái)了解一下好的算法需要的特征。

?????? 正確性:一個(gè)好的算法最基本的要求就是正確性,正確性是指算法至少應(yīng)該具有輸入、輸出和加工處理無(wú)歧義性、能正確反映問題的需求、能夠得到問題的正確答案。算法的正確性大致分為四個(gè)層次:1.算法程序沒有語(yǔ)法錯(cuò)誤;2.算法程序?qū)τ诤戏ǖ妮斎霐?shù)據(jù)能夠產(chǎn)生滿足要求的輸出結(jié)果;3.算法程序?qū)τ诜欠ǖ妮斎霐?shù)據(jù)能夠得出滿足規(guī)格說(shuō)明的結(jié)果;4.算法程序?qū)τ诰倪x擇的、甚至刁難的測(cè)試數(shù)據(jù)都有滿足要求的輸出結(jié)果。因此算法的正確性大部分情況下都不可能通過(guò)程序來(lái)證明,而是用數(shù)學(xué)方法證明的。證明一個(gè)復(fù)雜算法在所有層次上都是正確的,代價(jià)非常昂貴。所以一般情況下,我們把層次3作為一個(gè)算法是否正確的標(biāo)準(zhǔn)。

?????? 可讀性:算法設(shè)計(jì)的另一個(gè)目的是為了便于閱讀、理解和交流。可讀性高有助于人們理解算法,晦澀難懂的算法往往隱含錯(cuò)誤,不易被發(fā)現(xiàn),并且難以調(diào)試和修改。我們寫代碼的目的,一方面是為了讓計(jì)算機(jī)執(zhí)行,但還有一個(gè)重要的目的是為了便于他人閱讀,讓人理解和交流,如果可讀性不好,時(shí)間長(zhǎng)了自己都不知道寫了什么。所以可讀性好壞是算法很重要的標(biāo)志。

?????? 健壯性:當(dāng)輸入數(shù)據(jù)不合法時(shí),算法也能做出相關(guān)處理,而不是產(chǎn)生異常或莫名其妙的結(jié)果

?????? 時(shí)間效率高和存儲(chǔ)量低:時(shí)間效率值得是算法的執(zhí)行時(shí)間,存儲(chǔ)量指的是算法在執(zhí)行過(guò)程中需要的最大存儲(chǔ)空間。設(shè)計(jì)算法應(yīng)盡量滿足時(shí)間效率高和存儲(chǔ)量低的要求


?????? 那么如何度量一個(gè)算法的時(shí)間效率呢?也就是執(zhí)行時(shí)間。俗話講是騾子是馬,拉出來(lái)溜溜。所以第一種方法就是事后統(tǒng)計(jì)方法。

?????? 事后統(tǒng)計(jì)方法:通過(guò)設(shè)計(jì)好的測(cè)試程序和數(shù)據(jù),利用計(jì)算機(jī)計(jì)時(shí)器對(duì)不同算法編制的程序的運(yùn)行時(shí)間進(jìn)行比較,從而確定算法效率的高低。

?????? 但是這種度量方法實(shí)際上是很不科學(xué)的,理解一下,首先我們需要編制不同的算法,萬(wàn)一這種算法很糟糕,那不是浪費(fèi)時(shí)間和精力嗎?其次,時(shí)間的比較依賴計(jì)算機(jī)硬件和軟件等環(huán)境因素,有時(shí)會(huì)掩蓋算法本身的優(yōu)劣;再次,算法的測(cè)試數(shù)據(jù)設(shè)計(jì)困難,并且算法的優(yōu)劣往往還與測(cè)試數(shù)據(jù)的規(guī)模有關(guān)。綜上所述,事后統(tǒng)計(jì)方法,我們不予采納。

?????? 基于此,我們很容易就想到,我們可以對(duì)算法在計(jì)算機(jī)編制前,先進(jìn)行估算。也就是事前分析估算方法。

?????? 事前分析估算方法:在計(jì)算機(jī)程序編制前,依據(jù)統(tǒng)計(jì)方法對(duì)算法進(jìn)行估算

?????? 從事后統(tǒng)計(jì)方法的分析中,我們可以得出一個(gè)算法的執(zhí)行時(shí)間,取決于算法本身的好壞,編譯產(chǎn)生的代碼質(zhì)量(軟件因素),機(jī)器執(zhí)行指令的速度(硬件因素),以及輸入的規(guī)模,那么拋棄軟件因素和硬件因素,比較一個(gè)算法的好壞,就是比較在同等規(guī)模下,算法的執(zhí)行時(shí)間效率。

?????? 那么,回到開篇提到的高斯算法和普通求和算法,將這兩種算法寫成計(jì)算機(jī)語(yǔ)言,如下:

普通求和:??????????????????????????????????????

int i, sum = 0, n =100;????????????????????? /* 執(zhí)行了1次*/

for(int i = 1;i <= n;i++){? ? ? ? ? ? ? ? ? ? /* 執(zhí)行了n+1次*/

? ? ? sum = sum + i;? ? ? ? ? ? ? ? ? ? ? ???? /* 執(zhí)行了n次*/

}

printf("%d",sum);? ? ? ? ? ? ? ? ? ? ? ? ? ?? /* 執(zhí)行了1次*/

高斯算法:

int sum = 0,n = 100;? ? ? ? ? ? ? ? ? ? ? ? ? ? /* 執(zhí)行了1次*/

sum = (i+n)*n/2;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? /* 執(zhí)行了1次*/

printf("%d",sum);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? /* 執(zhí)行了1次*/

?????? 顯然普通求和算法,執(zhí)行了1+(n+1)+n+1 = (2n+3)次,而高斯算法,執(zhí)行了1+1+1 = 3次。事實(shí)上,兩條算法的開始變量定義,和結(jié)尾的輸出語(yǔ)句是一樣的,所以我們只關(guān)注中間的代碼,我們把第一種方法的for循環(huán)看做一個(gè)整體,忽略頭尾循環(huán)判斷的開銷,那么兩個(gè)算法其實(shí)就是n次與1次的區(qū)別。算法差距顯而易見,且隨著n的增大,差距越來(lái)越明顯。

?????? 這里需要理解的是,我們不關(guān)心編寫程序所用的程序設(shè)計(jì)語(yǔ)言,也不關(guān)心程序?qū)⑴茉谑裁从?jì)算機(jī)上,我們只關(guān)心它所實(shí)現(xiàn)的算法。這樣,不計(jì)哪些循環(huán)索引的遞增和循環(huán)的終止條件,變量聲明和打印結(jié)果等操作,最終,在分析程序的運(yùn)行時(shí)間時(shí),最重要的是把程序看成是獨(dú)立與程序設(shè)計(jì)語(yǔ)言的算法或一些列的步驟

?????? 接下來(lái),書中拋出了一個(gè)概念,函數(shù)的漸進(jìn)增長(zhǎng)。

????? 函數(shù)的漸進(jìn)增長(zhǎng):給定兩個(gè)函數(shù)f(n)和g(n),如果存在一個(gè)整數(shù)N,使得對(duì)于所有的n>N,f(n)總是大于g(n),那么我們就說(shuō)f(n)的增長(zhǎng)漸進(jìn)快于g(n);

??????? 那么漸進(jìn)增長(zhǎng)怎么理解呢?我們根據(jù)字面意思理解一下,我們都知道函數(shù)可以表示在一個(gè)坐標(biāo)系中,當(dāng)兩個(gè)函數(shù)的兩條線,慢慢靠近,直到某一點(diǎn),之后,其中一條函數(shù)線一直都大于另一條函數(shù)線。

?????? 那么,我們判斷一個(gè)算法好不好,我們可以對(duì)比幾個(gè)算法的關(guān)鍵執(zhí)行次數(shù)函數(shù)的漸進(jìn)增長(zhǎng)性,基本就可以分析出,某個(gè)算法,隨著n的增大,它會(huì)越來(lái)越優(yōu)于另一個(gè)算法,或者越來(lái)越差于另一個(gè)算法。其實(shí)這就是事前估算方法的理論依據(jù),通過(guò)算法時(shí)間復(fù)雜度來(lái)估算算法時(shí)間效率。


?????? 算法時(shí)間復(fù)雜度:在進(jìn)行算法分析時(shí),語(yǔ)句總的執(zhí)行次數(shù)T(n)是關(guān)于問題規(guī)模n的函數(shù),進(jìn)而分析T(n)隨n的變化情況并確定T(n)的數(shù)量級(jí)。算法的時(shí)間復(fù)雜度,也就是算法的時(shí)間量度,記作:T(n)=O(f(n))。它表示隨問題規(guī)模n的增大,算法執(zhí)行時(shí)間的增長(zhǎng)率和f(n)的增長(zhǎng)率相同,稱作算法的漸進(jìn)時(shí)間復(fù)雜度,簡(jiǎn)稱時(shí)間復(fù)雜度。其中f(n)是問題規(guī)模n的某個(gè)函數(shù)

?????? 這樣用大寫O()來(lái)體現(xiàn)算法時(shí)間復(fù)雜度的記法,我們稱之為大O記法。一般情況下,隨著n的增大,T(n)增長(zhǎng)最慢的算法為最優(yōu)算法。

?????? 那么如何分析一個(gè)算法的時(shí)間復(fù)雜度呢,也就是如何推導(dǎo)大O階呢?如下:

推導(dǎo)大O階:

1.用常數(shù)1取代運(yùn)行時(shí)間中的所有加法常數(shù);

2.在修改后的運(yùn)行次數(shù)函數(shù)中,只保留最高階項(xiàng);

3.如果最高階項(xiàng)存在且不是1,則去除與這個(gè)項(xiàng)相乘的常數(shù)。

得到的結(jié)果就是大O階。

?????? 哈哈,是不是有點(diǎn)暈?下面我就來(lái)簡(jiǎn)單介紹一下書中的推導(dǎo)大O階的例子,相信會(huì)很好理解。

常數(shù)階:O(1)

再回想一下高斯算法的程序表示:

高斯算法:

int sum = 0,n = 100;? ? ? ? ? ? ? ? ? ? ? ? ? ?? /* 執(zhí)行了1次*/

sum = (i+n)*n/2;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? /* 執(zhí)行了1次*/

printf("%d",sum);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??? /* 執(zhí)行了1次*/

????? 很明顯,這個(gè)算法的運(yùn)行次數(shù)函數(shù)是f(n)=3。根據(jù)我們推導(dǎo)大O階的方法,第一步就是把常數(shù)3改為1。然后發(fā)現(xiàn),它根本沒有最高階項(xiàng),所以這個(gè)算法的時(shí)間復(fù)雜度為O(1),也就是常數(shù)階。

線性階:O(n)

for(int i = 0;i<n;i++){

????? /* 時(shí)間復(fù)雜度為O(1)的程序步驟序列*/

}

?????? 因?yàn)橛衝次循環(huán),所以這個(gè)算法的時(shí)間復(fù)雜度就是O(n),也就是線性階。

對(duì)數(shù)階:O(logn)

?????? 思考一下,下面這段代碼的時(shí)間復(fù)雜度是多少?

int count = 1;

while (count<n){

?? count = count * 2;

? /* 時(shí)間復(fù)雜度為O(1)的程序步驟序列*/

}

????? 這段代碼的意思就是有多少個(gè)2相乘后大于n就會(huì)結(jié)束循環(huán),用函數(shù)來(lái)表達(dá)就是:2的x次方 = n,那么x=logn,所以這個(gè)循環(huán)的時(shí)間復(fù)雜度為O(logn)。

平方階:O(n^2)

看下面代碼:

int i , j;

for(i = 0; i < n ; i ++)

{

??????? for(j = 0; j < n; j ++)

??????? {

? ? ? ? ? ? ? ?? /*時(shí)間復(fù)雜度為O(1)的程序步驟序列*/ ??????

???????? }

}

?????? 這是一個(gè)嵌套循環(huán),其中內(nèi)循環(huán),剛才已經(jīng)介紹了,就是O(n),那么外循環(huán),就是O(n)的時(shí)間復(fù)雜度再循環(huán)n次,那么整個(gè)的時(shí)間復(fù)雜度就是O(n*n)=O(n^2),也就是平方階。

總結(jié):對(duì)于循環(huán)來(lái)說(shuō),循環(huán)的時(shí)間復(fù)雜度,就是循環(huán)體的時(shí)間復(fù)雜度乘以該循環(huán)的次數(shù)

變一下,下面的循環(huán),時(shí)間復(fù)雜度又是多少呢?

int i,j;

for (i = 0;i<n;i++)

{

?????????? for(j = i;j<n;j++)?????????????? //注意這里是j=i,不是j=0

????????? {

? ? ? ? ? ? ? ? ? ? ? /*時(shí)間復(fù)雜度為O(1)的程序步驟序列*/

?????????? }

}

分析一下這個(gè)嵌套循環(huán),當(dāng)i=0時(shí),內(nèi)循環(huán)執(zhí)行了n次,當(dāng)i = 1時(shí),內(nèi)循環(huán)執(zhí)行了n-1次,...,一次類推,當(dāng)i= n-1時(shí),內(nèi)循環(huán)執(zhí)行了1次,所以總的執(zhí)行次數(shù)是:

n+(n-1)+(n-2)+...+1 = n*(n+1)/2 = n^2/2+n/2;

根據(jù)大O階推導(dǎo),第一條沒有加法常數(shù),第二條,只保留最高階項(xiàng),所以保留n^2/2,第三條,去除這個(gè)項(xiàng)相乘的常數(shù),也就是去除1/2,最終這端代碼的時(shí)間復(fù)雜度為O(n^2)。

?????? 總結(jié):我相信大家如果看下來(lái)都能夠理解大O推導(dǎo)。其實(shí)理解大O推導(dǎo)不算難,難的是對(duì)數(shù)列的一些運(yùn)算,更多的是考察數(shù)學(xué)知識(shí)和能力。(嚇人~~)

那么常見的時(shí)間復(fù)雜度有哪些呢?

常數(shù)階:O(1);????????? 線性階:O(n);?????? 平方階:O(n^2);???????? 對(duì)數(shù)階:O(logn);???

nlogn階:O(nlogn);??????? 立方階:O(n^3);????? 指數(shù)階:O(2^n);

常見的時(shí)間復(fù)雜度所耗費(fèi)的時(shí)間從小到大依次是:

O(1)<O(logn)<O(n)<O(nlogn)<O(n^2)<O(n^3)<O(2^n)<O(n!)<O(n^n)


?????? 我們有n個(gè)隨機(jī)數(shù)字,打亂且不重復(fù),要從中找到我們想要的數(shù)字,那么最好的情況就是第一個(gè)就是我們想要找的數(shù)字,那么這個(gè)時(shí)候的時(shí)間復(fù)雜度為O(1),最壞的情況,可能那個(gè)數(shù)字就在這個(gè)隊(duì)列的最后,這個(gè)時(shí)候的時(shí)間復(fù)雜度為O(n)。

?????? 最壞情況運(yùn)行時(shí)間是一種保證,那就是運(yùn)行時(shí)間不會(huì)更壞了。在應(yīng)用中,這是一種最重要的需求,通常,除非特別情況,我們提到的運(yùn)行時(shí)間都是最壞情況的運(yùn)行時(shí)間。

?????? 而平均運(yùn)行時(shí)間是所有情況中最有意義的,因?yàn)樗瞧谕倪\(yùn)行時(shí)間。

?????? 一般沒有特殊說(shuō)明的情況下,我們說(shuō)的時(shí)間復(fù)雜度都是最壞時(shí)間復(fù)雜度。


?????? 第二章,終于整理完了,這篇整理的有點(diǎn)亂,有一些函數(shù)的漸進(jìn)比較的圖表,我沒辦法弄上來(lái),所以可能中間會(huì)有點(diǎn)迷糊(我估計(jì)后面的內(nèi)容也會(huì)有很多這種圖表,所以我需要思考一下這些圖表怎么拿上來(lái))。但其實(shí)很明顯的感覺出來(lái),第二章算法,更多的是需要你的數(shù)學(xué)水平,需要進(jìn)行一些推導(dǎo)和運(yùn)算。然后對(duì)于我來(lái)說(shuō),雖然我高考數(shù)學(xué)還挺高的(130+),并且由于我的專業(yè)信息與計(jì)算科學(xué)專業(yè)也要學(xué)超級(jí)多數(shù)學(xué)(傳說(shuō)有這個(gè)專業(yè)的其他學(xué)校,這個(gè)專業(yè)都是數(shù)理學(xué)院的,我們學(xué)校是計(jì)算機(jī)學(xué)院,導(dǎo)致我們上大課經(jīng)常跟數(shù)理學(xué)院的幾個(gè)班一起上QAQ);但是雖然如此,我真的覺得對(duì)不起我的歷任數(shù)學(xué)老師,我真的忘記的一干二凈,啊,難過(guò),原地爆炸。。。在這里勸解一些,讀書的朋友,如果想做計(jì)算機(jī)相關(guān)的,不管是考研還是工作,真的數(shù)學(xué)還是挺重要的,請(qǐng)以我為戒。

??????? By the way,杭州最近的天氣早上起床會(huì)有點(diǎn)小冷,希望大家注意身體,不要感冒。



Better Late Than Never!
努力是為了當(dāng)機(jī)會(huì)來(lái)臨時(shí)不會(huì)錯(cuò)失機(jī)會(huì)。
?????????? 共勉!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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