算法,先于計(jì)算機(jī)存在于世溪胶,比編程語言本身更為重要搂擦,語言只是工具,而算法才是靈魂哗脖。---云風(fēng)《游戲之旅-我的編程感悟》第二章(4m8h)
1瀑踢、算法評估
? ? 1.空間復(fù)雜度
? ? 2.時(shí)間復(fù)雜度
? ? 3.對基本操作的評估(一次加減乘除或內(nèi)存訪問,函數(shù)調(diào)用才避,都可以算作一次基本操作)
通常用大O表示法(big-Oh notation)來表示問題的復(fù)雜度橱夭,它表達(dá)的是問題的計(jì)算量的層次,O即Order的縮寫桑逝,O(n^2)表示基本操作使用的次數(shù)和問題的規(guī)模成平方的關(guān)系棘劣。
常見的層次按一下表遞增:
2、數(shù)據(jù)結(jié)構(gòu)
程序是由算法和數(shù)據(jù)結(jié)構(gòu)組成的楞遏,要想學(xué)算法茬暇,也要學(xué)會如何去組織數(shù)據(jù),處理數(shù)據(jù)橱健。
? ? 1.線性表
? ? a.數(shù)組和鏈表
數(shù)組:指屋里地址連續(xù)的表,可以用內(nèi)存地址來檢索到對應(yīng)的元素沙廉,可以用常數(shù)時(shí)間訪問到指定2位置的元素拘荡,但是在中間插入和刪除元素的時(shí)間復(fù)雜度為線性的。
鏈表:每個(gè)元素的物理位置是任意的撬陵,通過指針串接起來珊皿,它訪問的時(shí)間非常長,但是插入和刪除的速度卻很快巨税,由于需要額外的空間記錄元素的前后關(guān)系蟋定,占用內(nèi)存也大于數(shù)組。
? ? b.堆棧草添、隊(duì)列和串
堆棧和隊(duì)列是兩種特殊的線形表驶兜。
堆棧:只能從一頭進(jìn)出,先進(jìn)入的數(shù)據(jù)后出來,廣泛用于類C語言的函數(shù)調(diào)用機(jī)制抄淑。做深度優(yōu)先搜索求解問題時(shí)也需要它屠凶。
隊(duì)列:和堆棧相反,采用先進(jìn)先出肆资,讓數(shù)據(jù)從線性表的一頭進(jìn)入矗愧,從另一頭出去,用來保持元素的先后順序郑原,被廣泛用在消息通訊中唉韭,也可以用于廣度搜索的算法笙以。
優(yōu)先隊(duì)列:每個(gè)元素都有一個(gè)優(yōu)先級活烙,出隊(duì)列的時(shí)候,永遠(yuǎn)是優(yōu)先級最小的元素優(yōu)先代箭,通常不是由線性表來實(shí)現(xiàn)栖秕。
c.樹春塌、二叉樹及其他
樹:對有層次的數(shù)據(jù)集的一種組織方式,樹中每個(gè)數(shù)據(jù)節(jié)點(diǎn)都有或沒有它所下屬的數(shù)據(jù)集簇捍,除了根節(jié)點(diǎn)是整棵樹的根源外只壳,每個(gè)數(shù)據(jù)節(jié)點(diǎn)都有唯一的父親。
二叉樹:二叉樹的子樹有明確的左右之分暑塑,讓左子樹指向自己的一個(gè)兒子吼句,讓右子樹指向自己的下一個(gè)兄弟。在表達(dá)式計(jì)算和數(shù)據(jù)壓縮事格,以及排序查找方面都有很多的用途惕艳。
四叉樹及八叉樹:四叉樹用于平面劃分,八叉樹用于三維空間驹愚,這里所說的空間远搪,不僅僅局限于游戲里的場景空間。
圖:圖中每個(gè)節(jié)點(diǎn)并沒有父子關(guān)系逢捺,圖純粹是點(diǎn)和邊的集合谁鳍,節(jié)點(diǎn)和節(jié)點(diǎn)之間允許加上一些與它相關(guān)的數(shù),稱為權(quán)劫瞳,帶權(quán)的圖一般叫做網(wǎng)絡(luò)倘潜,節(jié)點(diǎn)和節(jié)點(diǎn)之間可以是無方向的連接,也可以是有向連接志于。
d.映射表
key和內(nèi)容對應(yīng)起來涮因。