目前,電腦已深入到社會生活的各個領域,由其是Web前端應用,其應用已不再僅僅局限於科學計算,而更多的是用於控制,管理及數據處理等非數值計算領域。電腦是一門研究用電腦進行信息表示和處理的科學。這裡面涉及到兩個問題:信息的表示,信息的處理。 ...
目前,電腦已深入到社會生活的各個領域,由其是Web前端應用,其應用已不再僅僅局限於科學計算,而更多的是用於控制,管理及數據處理等非數值計算領域。電腦是一門研究用電腦進行信息表示和處理的科學。這裡面涉及到兩個問題:信息的表示,信息的處理。
信息的表示和組織又直接關係到處理信息的程式的效率。隨著Web應用問題的不斷複雜,前端頁面功能的豐富,導致信息劇增與信息範圍的拓寬,使許多WEB應用的規模很大,結構又相當複雜。因此,必須分析待處理問題中的對象的特征及各對象之間存在的關係,這就是數據結構。
編寫解決實際問題的程式的一般過程:
l 如何用數據形式描述問題?--即由問題抽象出一個適當的數學模型
l 問題所涉及的數據量大小及數據之間的關係
l 如何在電腦中存儲數據及體現數據之間的關係
l 處理問題時需要對數據作何種運算?
l 所編寫的程式的性能是否良好?
上面所列舉的問題基本上由我們今天學習的數據結構來解決。
千鋒“HTML5程式員”訓練營是全國最好的全棧工程師和架構師的培訓基地,“演算法與數據結構”是目前課程體系(V6.5)第二階段的核心課程之一。
全棧工程師需要懂演算法和數據結構,無論是哪一門電腦語言,只要是程式員,那麼演算法和數據結構就是你必修的核心部分,更是前端開發人員的基石。在精通前端的基礎上深入掌握演算法與數據結構,能夠更好的站在全棧角度去設計和研發,提高web性能,獲得更多用戶的訪問和體驗。
演算法與數據結構如何講授呢?主要突出以下幾點:
第一,循序漸進。註重概念、作用、用法,以學生為主,教師為輔的教學理念,引導學生自主解決問題的思維,快速提升並應用演算法及掌握數據存儲和數據處理的方法。
第二,項目驅動。以項目驅動教學法,從真實項目出發,激發學生的學習興趣,以興趣為導向,幫助學生掌握項目開發流程和項目的運行原理,提高項目的運行效率。
第三,註重實戰。讓學生不斷的在解決項目問題中得到提高和升華,總結出優秀演算法,培養獨立開發和解決問題的能力。
演算法與數據包含兩部分,具體內容如下:
第一部分:演算法 。本部分常見演算法有:
遞歸演算法。內容主要包含遞歸思想、遞歸的作用、遞歸的實現。
排序演算法。內容主要包含Array.prototype.sort(),插入排序,冒泡排序,選擇排序,快速排序,堆排序,歸併排序,希爾排序等排序演算法。
既然說到前端排序,自然首先會想到JavaScript的原生介面Array.prototype.sort.
這個介面自ECMAScript 1st Edition起就存在。
Array.prototype.sort規範
The elements of this array are sorted. The sort is not necessarily stable (that is, elements that compare equal do not necessarily remain in their original order). If comparefn is not undefined, it should be a function that accepts two arguments x and y and returns a negative value if x < y, zero if x = y, or a positive value if x > y.
顯然,規範並沒有限定sort內部實現的排序演算法是什麼。甚至介面的實現都不需要是穩定排序
在這樣的背景下,前端排序這件事其實取決於各家瀏覽器的具體實現。
插入排序
思想:將一個記錄插入到已排序好的有序表中,從而得到一個新的記錄數增1的有序表。即:先將序列的第1個記錄看成是一個有序的子序列,然後從第2個記錄逐個進行插入,直至整個序列有序為止。
最優複雜度:當輸入數組就是排好序的時候,複雜度為0(n)
最差複雜度:當輸入數組為倒序時,複雜度為0(n^2)
插入排序比較適合用於“少量元素的數組”
冒泡排序
思想:通過兩兩交換,像水中的泡泡一樣,小的先冒出來,大的後冒出來。
最壞運行時間:0(n^2)
最佳運行時間:0(n^2)
選擇排序
思想:在要排序的一組數中,選出最小(或者最大)的一個數與第1個位置的數交換;然後在剩下的數當中再找最小(或者最大)的與第2個位置的數交換,依次類推,直到第n-1個元素(倒數第二個數)和第n個元素(最後一個數)比較為止。
最好運行時間:0(n^2)
最壞運行時間:0(n^2)
快速排序
演算法步驟:
1 從數列中挑出一個元素,稱為 “基準”,
2 重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的後面(相同的數可以到任一邊)。在這個分區退出之後,該基準就處於數列的中間位置。這個稱為分區操作。
3 遞歸地把小於基準值元素的子數列和大於基準值元素的子數列排序。
遞歸的最底部情形,是數列的大小是零或一,也就是永遠都已經被排序好了。雖然一直遞歸下去,但是這個演算法總會退出,因為在每次的迭代中,它至少會把一個元素擺到它最後的位置去。
最壞運行時間:當輸入數組已排序時,時間0(n^2)
最佳運行時間:0(nlgn)
堆排序
最優時間:0(nlgn)
最差時間:0(nlgn)
思想:運用了最小堆、最大堆這個數據結構,而堆還能用於構建優先隊列。
歸併排序
思想:運用分治法思想解決排序問題
最壞情況運行時間:0(nlgn)
最佳運行時間:0(nlgn)
分治法:就是將原問題分解為多個獨立的子問題,且這些子問題的形式和原問題相似,只是規模上減少了,求解完子問題後合併結果構成原問題的解。
希爾排序
思想:先將整個待排序的記錄序列分割成為若幹子序列分別進行直接插入排序,待整個序列中的記錄“基本有序”時,再對全體記錄進行依次直接插入排序。
第二部分:數據結構。常見數據結構。
鏈表:
鏈式存儲:用一組任意的存儲單元存儲線性表中的數據元素。用這種方法存儲的線性表簡稱線性鏈表。
存儲鏈表中結點的一級任意的存儲單元可以是連續的,也可以是不連續的,甚至是零散分佈在記憶體中的任意位置上的。
鏈表中結點的邏輯順序和物理順序不一定相同。
為了正確表示結點間的邏輯關係,在存儲每個結點值的同時,還必須存儲指示其直接後繼結點的地址(或位置),稱為指針或鏈,這兩部分組成了鏈表中的結點結構。
鏈表是通過每個結點的指針域將線性表的n個結點按其邏輯次序鏈接在一起的。
每一個結只包含一個指針域的鏈表,稱為單鏈表。
棧和隊列是兩種應用非常廣泛的數據結構,它們都來自線性表數據結構,都是“操作受限”的線性表。
棧在電腦中的實現有多種方式:
硬堆棧:利用CPU中的某些寄存器組或類似的硬體使用記憶體的特殊區域來實現。這類堆棧容量有限,但速度很快
軟堆棧:這類堆棧主要在記憶體中實現。堆棧容量可以達到很大。在實現方式上,又有動態方式和靜態方式兩種。
棧:是限制在表的一端進行插入和刪除操作的線性表。又稱為後進先出或先進後出線性表。
隊列:也是運算受限的線性表。是一種先進先出的線性表。只允許在表的一端進行插入,而在另一端進行刪除。
三角函數:
(一) 三角函數的本質是任意角的集合與一個比值的集合的變數之間的映射。
(二) 六種基本函數:正弦、餘弦、正切、餘切、正割、餘割。
(三) 在平面直角坐標系中,從點0引出一條射線0p,設旋轉角為θ,p點的坐標為(x,y)有:(斜邊c,對邊為a,鄰邊為b)
1. 正弦函數 sinθ = a/c 正弦(sin):角a的對邊比斜邊
2. 餘弦函數 cosθ = b / c 餘弦(cos):角a的鄰邊比斜邊
3. 正切函數 tanθ = a / b 正切(tan):角a的對邊比鄰邊
4. 餘切函數 cotθ = b / a 餘切(cot):角a的鄰邊比對邊
5. 正割函數 secθ = c / b 正割(sec) : 角a的斜邊比鄰邊
6. 餘割函數 cscθ = c /a 餘割(csc):角a的斜邊比對邊
勾股定理
直角三角形中,兩直邊的平方和等於斜邊的平方。 即令直角三角形ABC中,其中角C=90°,直邊BC的長度為a,AC的長度為b,斜邊AB的長度為c,則有a²+b²=c²
實現案例:拋物線運動、圓周運動