JavaScript數(shù)據(jù)結(jié)構(gòu)與算法
前言
數(shù)據(jù)結(jié)構(gòu)與算法這個(gè)詞相信大家都聽(tīng)過(guò)、了解過(guò)、學(xué)過(guò),那為什么要學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法呢?我感覺(jué)有以下兩個(gè)原因:
- 為了一個(gè)比較滿(mǎn)意的Offer,現(xiàn)在去面試任何一家公司,不管你是前端還是后端,多多少少會(huì)問(wèn)一些關(guān)于算法的問(wèn)題;
- 編程需要,如果沒(méi)有很好的數(shù)據(jù)結(jié)構(gòu)與算法的功底,很多事情都是知其然不知其所以然,無(wú)法深入的學(xué)習(xí),還有就是隨著項(xiàng)目的復(fù)雜,數(shù)據(jù)量也隨之變大,數(shù)據(jù)結(jié)構(gòu)與算法可以更優(yōu)雅的處理這些數(shù)據(jù)。
程序=數(shù)據(jù)結(jié)構(gòu)+算法,是計(jì)算機(jī)科學(xué)界的一個(gè)經(jīng)典名句,這句話(huà)也體現(xiàn)了一個(gè)應(yīng)用程序是與數(shù)據(jù)結(jié)構(gòu)和算法密不可分的。
數(shù)據(jù)結(jié)構(gòu)
首先我們先來(lái)了解一下數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu)就是計(jì)算機(jī)存儲(chǔ)和組織數(shù)據(jù)的一種方式,指相互之間存在一種或者多種特定關(guān)系的集合。在不同的場(chǎng)景選擇更適合的數(shù)據(jù)結(jié)構(gòu),可以為應(yīng)用程序帶來(lái)更好的運(yùn)行效率和存儲(chǔ)效率。
常見(jiàn)的數(shù)據(jù)結(jié)構(gòu)
常見(jiàn)的一些數(shù)據(jù)結(jié)構(gòu)主要有以下幾種:
- 數(shù)組(Array) :數(shù)組是一種聚合數(shù)據(jù)類(lèi)型,它是將具有數(shù)據(jù)類(lèi)型的的一些變量有序的組織到一起的一個(gè)集合;
優(yōu)點(diǎn)是插入快;缺點(diǎn)是查找、刪除慢,只能存儲(chǔ)單一類(lèi)型的元素;
- **鏈表(Linked List):**鏈表是一種數(shù)據(jù)元素按照鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)進(jìn)行存儲(chǔ)的數(shù)據(jù)結(jié)構(gòu),這種存儲(chǔ)結(jié)構(gòu)具有在物理上存在非連續(xù)的特點(diǎn)。
優(yōu)點(diǎn)是插入、刪除快;缺點(diǎn)是查找慢;
- **棧(Stack):**棧是一種特殊的線(xiàn)性表,它只能在一個(gè)表的一個(gè)固定端進(jìn)行數(shù)據(jù)結(jié)點(diǎn)的插入和刪除操作。
優(yōu)點(diǎn)是提供先進(jìn)后出的存儲(chǔ)方式,缺點(diǎn)是對(duì)其他項(xiàng)操作都很慢;
- **隊(duì)列(Queue):**隊(duì)列和棧類(lèi)似,也是一種特殊的線(xiàn)性表。和棧不同的是,隊(duì)列只允許在表的一端進(jìn)行插入操作,而在另一端進(jìn)行刪除操作。
優(yōu)點(diǎn)是提供先進(jìn)先出的存儲(chǔ)方式,缺點(diǎn)是對(duì)其他項(xiàng)操作都很慢;
- **樹(shù)(Tree):**樹(shù)是典型的非線(xiàn)性結(jié)構(gòu),它是包括,2 個(gè)結(jié)點(diǎn)的有窮集合 K。
- **圖(Graph):**圖是另一種非線(xiàn)性數(shù)據(jù)結(jié)構(gòu)。在圖結(jié)構(gòu)中,數(shù)據(jù)結(jié)點(diǎn)一般稱(chēng)為頂點(diǎn),而邊是頂點(diǎn)的有序偶對(duì)。
算法
算法簡(jiǎn)而言之就是解決問(wèn)題的步驟,對(duì)特定問(wèn)題求解步驟的一種描述,他的定義的是解決特定問(wèn)題求解步驟的準(zhǔn)確而完整的描述,在計(jì)算機(jī)中表現(xiàn)為一系列指令的集合,算法代表著用系統(tǒng)的方法描述解決問(wèn)題的策略機(jī)制。
舉兩個(gè)例子來(lái)說(shuō)明一下什么是算法:
- 去北京看演唱會(huì):首先我們需要確定地點(diǎn)、然后購(gòu)買(mǎi)門(mén)票、車(chē)票、入場(chǎng)、看演唱會(huì)、演唱會(huì)結(jié)束
- 把大象裝進(jìn)冰箱:把冰箱門(mén)打開(kāi),大象塞進(jìn)去,關(guān)上冰箱門(mén)。
雖然把大象裝進(jìn)冰箱這是一個(gè)玩笑話(huà),假設(shè)這真的是一個(gè)問(wèn)題,解決問(wèn)題的步驟適用于任何動(dòng)物。
算法的特征
算法具有以下五個(gè)特征:
- 有窮性:對(duì)于任意一組合法輸入值,在執(zhí)行有窮步驟之后一定能結(jié)束,即:算法中的每個(gè)步驟都能在有限時(shí)間內(nèi)完成。
- 確定性:在每種情況下所應(yīng)執(zhí)行的操作,在算法中都有確切的規(guī)定,使算法的執(zhí)行者或閱讀者都能明確其含義及如何執(zhí)行。并且在任何條件下,算法都只有一條執(zhí)行路徑。
- 可行性:算法中的所有操作都必須足夠基本,都可以通過(guò)已經(jīng)實(shí)現(xiàn)的基本操作運(yùn)算有限次實(shí)現(xiàn)之。
- 有輸入:作為算法加工對(duì)象的量值,通常體現(xiàn)在算法當(dāng)中的一組變量。有些輸入量需要在算法執(zhí)行的過(guò)程中輸入,而有的算法表面上可以沒(méi)有輸入,實(shí)際上已被嵌入算法之中。
- 有輸出:它是一組與“輸入”有確定關(guān)系的量值,是算法進(jìn)行信息加工后得到的結(jié)果,這種確定關(guān)系即為算法功能。
算法的目標(biāo)
一個(gè)優(yōu)秀的算法需要追求以下兩個(gè)目標(biāo):
- 運(yùn)行所需的時(shí)間更少
- 占用的內(nèi)存空間更小
上面所說(shuō)的正是時(shí)間復(fù)雜度和空間復(fù)雜度的概念,相信很多同學(xué)都對(duì)這兩個(gè)概念有所了解,不了解也沒(méi)有關(guān)系,下篇文章介紹時(shí)間復(fù)雜度和空間復(fù)雜度。
總結(jié)
本篇文章介紹了數(shù)據(jù)結(jié)構(gòu)與算法的概念,以及幾種常見(jiàn)的數(shù)據(jù)結(jié)構(gòu)是什么,有什么優(yōu)點(diǎn)和缺點(diǎn);在文章的最后還介紹了算法的五個(gè)特征以及算法所追求的目標(biāo)。
到此關(guān)于JavaScript數(shù)據(jù)結(jié)構(gòu)與算法的文章就介紹到這了,更多相關(guān)JS數(shù)據(jù)結(jié)構(gòu) 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- JavaScript樹(shù)形數(shù)據(jù)結(jié)構(gòu)處理
- python庫(kù)JsonSchema驗(yàn)證JSON數(shù)據(jù)結(jié)構(gòu)使用詳解
- Javascript中扁平化數(shù)據(jù)結(jié)構(gòu)與JSON樹(shù)形結(jié)構(gòu)轉(zhuǎn)換詳解
- JavaScript?數(shù)據(jù)結(jié)構(gòu)之字典方法
- JavaScript數(shù)據(jù)結(jié)構(gòu)Number
- JavaScript數(shù)據(jù)結(jié)構(gòu)yocto queue隊(duì)列鏈表代碼分析
相關(guān)文章
JavaScript高級(jí)程序設(shè)計(jì)閱讀筆記(六) ECMAScript中的運(yùn)算符(二)
ECMAScript中的運(yùn)算符,學(xué)習(xí)js的朋友可以參考下2012-02-02基于javascript實(shí)現(xiàn)仿百度輸入框自動(dòng)匹配功能
這篇文章主要介紹了基于javascript實(shí)現(xiàn)仿百度輸入框自動(dòng)匹配功能的相關(guān)資料,需要的朋友可以參考下2016-01-01js實(shí)現(xiàn)完全自定義可帶多級(jí)目錄的網(wǎng)頁(yè)鼠標(biāo)右鍵菜單方法
這篇文章主要介紹了js實(shí)現(xiàn)完全自定義可帶多級(jí)目錄的網(wǎng)頁(yè)鼠標(biāo)右鍵菜單方法,實(shí)例分析了javascript實(shí)現(xiàn)自定義網(wǎng)頁(yè)鼠標(biāo)右鍵彈出菜單的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-02-02怎樣在CocosCreator中使用物理引擎關(guān)節(jié)
這篇文章主要介紹了怎樣在CocosCreator中使用物理引擎關(guān)節(jié),對(duì)物理引擎感興趣的同學(xué),著重要看一下2021-04-04在一個(gè)頁(yè)面重復(fù)使用一個(gè)js函數(shù)的方法詳解
下面小編就為大家?guī)?lái)一篇在一個(gè)頁(yè)面重復(fù)使用一個(gè)js函數(shù)的方法詳解。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧,祝大家游戲愉快哦2016-12-12JS實(shí)現(xiàn)頁(yè)面跳轉(zhuǎn)與刷新的方法匯總
這篇文章主要給大家介紹了關(guān)于JS實(shí)現(xiàn)頁(yè)面跳轉(zhuǎn)與刷新的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用JS具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08