演算法與數據結構

来源:http://www.cnblogs.com/xiaoqianqian/archive/2017/11/16/7845678.html
-Advertisement-
Play Games

目前,電腦已深入到社會生活的各個領域,由其是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²

實現案例:拋物線運動、圓周運動

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.功能: 只能有一個實例的類,用於類似計數、記憶體池的情況。 2.實現方法: [1]構造函數設置為private,因此不能在外部創建實例。 [2]提供一個public方法訪問實例。 [3]析構函數,析構函數是為了銷毀這個類的成員變數,private和public都可以,但是析構函數裡面不能delet ...
  • 歡迎想學習網頁設計的伙伴們,我會定期開始錄製免費的網頁設計教程,主要是作為一種學習的分享。 首先,給大家介紹一下,我在紐特邏輯工作,主要從事前端設計,本次課程循序漸進,難度初級,最後是一個設計出題網頁為結束。 開始之前,要做一些準備: 1.軟體準備 (1)<首先安裝>Java開發環境JDK,一種用於 ...
  • 函數式編程中,一切皆為函數,這個函數一般不是類級別的,其可以保存在變數中,可以當做參數或返回值,是函數級別的抽象和重用,將函數作為可重用的基本模塊,就像面向對象中一切皆為對象,把所有事物抽象為類,面向對象編程通過繼承和組合來實現類或模塊重用,而函數式編程通過局部套用來實現函數重用;兩種編程模式相輔相 ...
  • 回到目錄 Dapper作為小型ORM的代表作品被我們應用到了dotnet core的項目中,下麵將把自己在項目中使用dapper進行curd操作的過程寫一下,後期可能會遇到一些問題,大叔也會在這個系列之中進行完善,希望對各位學生有所幫助! 一 安裝nuget的dapper包包 二 在startup中 ...
  • 問題 當目錄下的文件數量較大時,用webstorm打開會出現卡頓,甚至卡死現象,例如:node_modules目錄 解決方案 不讓webstorm索引該目錄下的文件步驟:1.node_modules目錄右鍵,彈出菜單2.選擇Mark Directory as3.再選擇exclude這樣操作後,nod ...
  • mintui是餓了麽團隊針對vue開發的移動端組件庫,方便實現移動端的一些功能,這裡只用了Loadmore功能實現移動端的上拉分頁刷新,下拉載入數據.mintui官網:http://mint-ui.github.io/#!/zh-cn PS:有個坑一定要註意就是註釋里說的iPhone里loadmor ...
  • # new Vue({ vue所有的數據都是放到data裡面的 # data:{ vue對象的數據 # a:1,對象 # b:[] , # } # methods:{vue對象的方法 # dosomthing: function() # { # this.a ++ # console.log(thi... ...
  • 目錄 前言 搭建項目及其它準備工作 創建資料庫 創建Koa2項目 安裝項目其它需要包 清除冗餘文件並重新規劃項目目錄 配置文件 規劃示例路由,並新建相關文件 實現數據訪問和業務邏輯相關方法 編寫mysql-helper.js 編寫數據訪問方法 規劃業務邏輯返回值 編寫業務邏輯 註冊 登錄 首頁 安全 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...