2017-07-11 13:19:47 2210瀏覽
目前,隨著計算機網(wǎng)絡(luò)的發(fā)展,計算機已滲透到社會生活的各個領(lǐng)域,由其是Web前端應(yīng)用、PC端和移動端,其應(yīng)用已不再僅僅局限于科學(xué)計算,而更多的是用于控制,管理及數(shù)據(jù)處理等非數(shù)值計算領(lǐng)域。計算機是一門研究用計算機進行信息表示和處理的科學(xué)。這里面涉及到兩個問題:信息的表示,信息的處理。
信息的表示和存儲又直接關(guān)系到處理信息的程序的效率。隨著Web應(yīng)用問題的不斷復(fù)雜,前端頁面功能的豐富,導(dǎo)致信息劇增與信息范圍的拓寬,使許多WEB應(yīng)用的規(guī)模很大,結(jié)構(gòu)又相當(dāng)復(fù)雜。因此,必須分析待處理問題中的對象的特征及各對象之間存在的關(guān)系,這就是數(shù)據(jù)結(jié)構(gòu)。
編寫解決實際問題的程序的一般過程:
如何用數(shù)據(jù)形式描述問題?--即由問題抽象出一個適當(dāng)?shù)臄?shù)學(xué)模型(算法)
問題所涉及的數(shù)據(jù)量大小及數(shù)據(jù)之間的關(guān)系(數(shù)據(jù)結(jié)構(gòu))
如何在計算機中存儲數(shù)據(jù)及體現(xiàn)數(shù)據(jù)之間的關(guān)系(數(shù)據(jù)結(jié)構(gòu))
處理問題時需要對數(shù)據(jù)作何種運算?(算法)
所編寫的程序的性能是否良好?(算法+數(shù)據(jù)結(jié)構(gòu))
上面所列舉的問題基本上由我們今天學(xué)習(xí)的數(shù)據(jù)結(jié)構(gòu)來解決。
千鋒“HTML5程序員”訓(xùn)練營是全國最好的全棧工程師和架構(gòu)師的培訓(xùn)基地,“算法與數(shù)據(jù)結(jié)構(gòu)”是目前課程體系(V6.5)第二階段的核心課程之一。
全棧工程師需要懂算法和數(shù)據(jù)結(jié)構(gòu),無論是哪一門計算機語言,只要是程序員,那么算法和數(shù)據(jù)結(jié)構(gòu)就是你必修的核心部分,更是前端開發(fā)人員的基石。在精通前端的基礎(chǔ)上深入掌握算法與數(shù)據(jù)結(jié)構(gòu),能夠更好的站在全棧角度去設(shè)計和研發(fā),提高web性能,獲得更多用戶的訪問和體驗。
算法與數(shù)據(jù)結(jié)構(gòu)如何講授呢?主要突出以下幾點:
第一,循序漸進。注重概念、作用、用法,以學(xué)生為主,教師為輔的教學(xué)理念,引導(dǎo)學(xué)生自主解決問題的思維,快速提升并應(yīng)用算法及掌握數(shù)據(jù)存儲和數(shù)據(jù)處理的方法。
第二,項目驅(qū)動。以項目驅(qū)動教學(xué)法,從真實項目出發(fā),激發(fā)學(xué)生的學(xué)習(xí)興趣,以興趣為導(dǎo)向,幫助學(xué)生掌握項目開發(fā)流程和項目的運行原理,提高項目的運行效率。
第三,注重實戰(zhàn)。讓學(xué)生不斷的在解決項目問題中得到提高和升華,總結(jié)出優(yōu)秀算法,培養(yǎng)獨立開發(fā)和解決問題的能力。
算法與數(shù)據(jù)包含兩部分,具體內(nèi)容如下:
第一部分:算法。本部分常見算法有:
遞歸算法。內(nèi)容主要包含遞歸思想、遞歸的作用、遞歸的實現(xiàn)。
排序算法。內(nèi)容主要包含Array.prototype.sort(),插入排序,冒泡排序,選擇排序,快速排序,堆排序,歸并排序,希爾排序等排序算法。
既然說到前端排序,自然首先會想到JavaScript的原生接口Array.prototype.sort.
這個接口自ECMAScript 1st Edition起就存在。
Array.prototype.sort規(guī)范
這個數(shù)組的的原型方法是對元素排序的,排序不一定是穩(wěn)定的(也就是說,比較相等的元素不一定保持原來的順序)。如果comparefn沒有定義,它應(yīng)該是一個函數(shù),它接受兩個參數(shù)x和y,并返回一個負(fù)值,如果x小于y,如果x=y,或者一個正值,如果x大于y。
顯然,規(guī)范并沒有限定sort內(nèi)部實現(xiàn)的排序算法是什么。甚至接口的實現(xiàn)都不需要是穩(wěn)定排序
在這樣的背景下,前端排序這件事其實取決于各家瀏覽器的具體實現(xiàn)。
插入排序
思想:將一個記錄插入到已排序好的有序表中,從而得到一個新的記錄數(shù)增1的有序表。即:先將序列的第1個記錄看成是一個有序的子序列,然后從第2個記錄逐個進行插入,直至整個序列有序為止。
最優(yōu)復(fù)雜度:當(dāng)輸入數(shù)組就是排好序的時候,復(fù)雜度為0(n)
最差復(fù)雜度:當(dāng)輸入數(shù)組為倒序時,復(fù)雜度為0(n^2)
插入排序比較適合用于“少量元素的數(shù)組”
冒泡排序
思想:通過兩兩交換,像水中的泡泡一樣,小的先冒出來,大的后冒出來。
最壞運行時間:0(n^2)
最佳運行時間:0(n^2)
選擇排序
思想:在要排序的一組數(shù)中,選出最小(或者最大)的一個數(shù)與第1個位置的數(shù)交換;然后在剩下的數(shù)當(dāng)中再找最?。ɑ蛘咦畲螅┑呐c第2個位置的數(shù)交換,依次類推,直到第n-1個元素(倒數(shù)第二個數(shù))和第n個元素(最后一個數(shù))比較為止。
最好運行時間:0(n^2)
最壞運行時間:0(n^2)
快速排序
算法步驟:
1.從數(shù)列中挑出一個元素,稱為 “基準(zhǔn)”,
2.重新排序數(shù)列,所有元素比基準(zhǔn)值小的擺放在基準(zhǔn)前面,所有元素比基準(zhǔn)值大的擺在基準(zhǔn)的后面(相同的數(shù)可以到任一邊)。在這個分區(qū)退出之后,該基準(zhǔn)就處于數(shù)列的中間位置。這個稱為分區(qū)操作。
3.遞歸地把小于基準(zhǔn)值元素的子數(shù)列和大于基準(zhǔn)值元素的子數(shù)列排序。
遞歸的最底部情形,是數(shù)列的大小是零或一,也就是永遠(yuǎn)都已經(jīng)被排序好了。雖然一直遞歸下去,但是這個算法總會退出,因為在每次的迭代中,它至少會把一個元素擺到它最后的位置去。
最壞運行時間:當(dāng)輸入數(shù)組已排序時,時間0(n^2)
最佳運行時間:0(nlgn)
堆排序
最優(yōu)時間:0(nlgn)
最差時間:0(nlgn)
思想:運用了最小堆、最大堆這個數(shù)據(jù)結(jié)構(gòu),而堆還能用于構(gòu)建優(yōu)先隊列。
歸并排序
思想:運用分治法思想解決排序問題
最壞情況運行時間:0(nlgn)
最佳運行時間:0(nlgn)
分治法:就是將原問題分解為多個獨立的子問題,且這些子問題的形式和原問題相似,只是規(guī)模上減少了,求解完子問題后合并結(jié)果構(gòu)成原問題的解。
希爾排序
思想:先將整個待排序的記錄序列分割成為若干子序列分別進行直接插入排序,待整個序列中的記錄“基本有序”時,再對全體記錄進行依次直接插入排序。
第二部分:數(shù)據(jù)結(jié)構(gòu)。常見數(shù)據(jù)結(jié)構(gòu)。
鏈表:
鏈?zhǔn)酱鎯Γ河靡唤M任意的存儲單元存儲線性表中的數(shù)據(jù)元素。用這種方法存儲的線性表簡稱線性鏈表。
存儲鏈表中結(jié)點的一級任意的存儲單元可以是連續(xù)的,也可以是不連續(xù)的,甚至是零散分布在內(nèi)存中的任意位置上的。
鏈表中結(jié)點的邏輯順序和物理順序不一定相同。
為了正確表示結(jié)點間的邏輯關(guān)系,在存儲每個結(jié)點值的同時,還必須存儲指示其直接后繼結(jié)點的地址(或位置),稱為指針或鏈,這兩部分組成了鏈表中的結(jié)點結(jié)構(gòu)。
鏈表是通過每個結(jié)點的指針域?qū)⒕€性表的n個結(jié)點按其邏輯次序鏈接在一起的。
每一個結(jié)只包含一個指針域的鏈表,稱為單鏈表。
棧和隊列是兩種應(yīng)用非常廣泛的數(shù)據(jù)結(jié)構(gòu),它們都來自線性表數(shù)據(jù)結(jié)構(gòu),都是“操作受限”的線性表。
棧在計算機中的實現(xiàn)有多種方式:
硬堆棧:利用CPU中的某些寄存器組或類似的硬件使用內(nèi)存的特殊區(qū)域來實現(xiàn)。這類堆棧容量有限,但速度很快
軟堆棧:這類堆棧主要在內(nèi)存中實現(xiàn)。堆棧容量可以達(dá)到很大。在實現(xiàn)方式上,又有動態(tài)方式和靜態(tài)方式兩種。
棧:是限制在表的一端進行插入和刪除操作的線性表。又稱為后進先出或先進后出線性表。
隊列:也是運算受限的線性表。是一種先進先出的線性表。只允許在表的一端進行插入,而在另一端進行刪除。
三角函數(shù):
(一)、三角函數(shù)的本質(zhì)是任意角的集合與一個比值的集合的變量之間的映射。
(二)、六種基本函數(shù):正弦、余弦、正切、余切、正割、余割。
(三)、在平面直角坐標(biāo)系中,從點0引出一條射線0p,設(shè)旋轉(zhuǎn)角為θ,p點的坐標(biāo)為(x,y)有:(斜邊c,對邊為a,鄰邊為b)
1. 正弦函數(shù) sinθ = a/c 正弦(sin):角a的對邊比斜邊
2. 余弦函數(shù) cosθ = b / c 余弦(cos):角a的鄰邊比斜邊
3. 正切函數(shù) tanθ = a / b 正切(tan):角a的對邊比鄰邊
4. 余切函數(shù) cotθ = b / a 余切(cot):角a的鄰邊比對邊
5. 正割函數(shù) secθ = c / b 正割(sec) : 角a的斜邊比鄰邊
6. 余割函數(shù) cscθ = c /a 余割(csc):角a的斜邊比對邊
勾股定理
直角三角形中,兩直邊的平方和等于斜邊的平方。即令直角三角形ABC中,其中角C=90°,直邊BC的長度為a,AC的長度為b,斜邊AB的長度為c,則有a2+b2=c2
實現(xiàn)案例:拋物線運動、圓周運動