摘要:為什么要學習數據結構語言是相通的人們常說,編程語言是相通的,掌握一門,其他語言很容易就能掌握。其實,真正想通的不是語言,而是數據結構與算法。
為什么要學習數據結構 1.語言是相通的
人們常說,編程語言是相通的,掌握一門,其他語言很容易就能掌握。
個人認為這是一個似是而非的觀點,每門編程語言都離不開變量,數組,循環,條件判斷這些概念,這似乎能支持上面的觀點,但是每門編程語言都有自己的使用范圍,都有自己擅長的事情,即便是有了 node.js 這中能夠一統前后端的語言,也總有他不能勝任的工作,比如機器學習。像python 這樣近乎萬能的語言,也會在高性能計算的時候無能為力。
其實,真正想通的不是語言,而是數據結構與算法。數據結構和算法是脫離編程語言而存在的,不同的語言有不同的實現版本,但是內在邏輯卻不會發生變化,所提現的編程思想不會有變化
a、前端通過 websocket 獲取數據,數據是具體的坐標,當獲取到坐標的時候,在前端的地圖上顯示一個光圈。但是,后端不定期發送,可能一次推送幾個,也可能幾秒鐘才推送一個,當數據特別頻繁的時候,坐標都在地圖上顯示,地圖會非常亂,所以對于前端來說要做一個限制,前端同一個時刻最多顯示10個坐標,新坐標需要把最早的坐標擠掉,每個坐標最多顯示5秒鐘。
是否可以通過隊列的方式,每一個節點都包括,后臺傳過來的數據坐標和當前的時間,當超過10個坐標的時候,擠掉頭部出隊列,前端做事件循環每一秒鐘,檢查一下頭部是否超過5s,如果超過,頭部出隊列。
b、H5頁面翻頁場景業務,
可以添加頁面,刪除頁面,移動頁面,翻看頁面。我猜想大多數情況應該是對數組進行操作,通過arr,角標index和for循環來渲染頁面的.
換個思路:
是否可以用雙向鏈表的方式完成這些操作,每一個頁節點,包括本頁的數據,pre前一頁的指向和next后一頁的指向,當添加操作的時候其實是在尾節點next指向新頁,刪除頁面的時候其實是把前一頁的next指向刪除頁的next,移動頁面其實就是先完成刪除頁面,在完成添加頁面操作,向后翻看頁面的時候,就是一直在操作next,向前翻看其實就是一直操作pre。
不考慮分頁情況,如果存在分頁情況,也可以后端只保存一條數據,在存入的時候先讀取數據在update數據(這樣會增加服務器壓力)
a) 提高程序設計能力
b) 提高算法能力,數據結構的精髓在于總結提煉了許多儲存管理和使用數據的模式,這些模式的背后是最精華的編程思想,這些思想的領悟會需要一些時間,不是學習了幾種數據結構就能在工作中大展伸手,但是學會了數據結構,對自身能力的提升是很有幫助的
在沒有完全參悟這些編程思想和管理方式的時候,我們只需要學習具體的工具和方法。
棧 -- 羽毛球、羊肉串
隊列 -- 排隊登機,優先隊列 -- vip用戶、軍人、老人、排隊優先進入
鏈表 -- 猴子撈月,包括單向鏈表、雙向鏈表
集合 -- es6中的Set
字典 -- es6中的Map
散列集 -- 曾經討論過,因為數組的長度不固定,角標用哈希表示、循環盡量采取foreach自動過濾調empty的位置輸出
圖 -- 迷宮 :深度搜索和廣度搜索,這個請參考https://segmentfault.com/a/11...
樹 -- 學習小組討論過一個問題,可以用二叉樹來解決
假設你正在爬樓梯。需要 n 階你才能到達樓頂 每次你可以爬 1 或 2 個臺階。你有多少種不同的方法可以爬到樓頂呢? 注意:給定 n 是一個正整數。 示例 1: 輸入: 2 輸出: 2 解釋: 有兩種方法可以爬到樓頂。 1. 1 階 + 1 階 2. 2 階 示例 2: 輸入: 3 輸出: 3 解釋: 有三種方法可以爬到樓頂。 1. 1 階 + 1 階 + 1 階 2. 1 階 + 2 階 3. 2 階 + 1 階
function Node(data) { // 二叉樹節點 this.data = data; this.left = null; this.right = null; } function method(n) { let head = new Node(null); let num = 0; function A(node, n, num) { if (n < node.data) { return 0; } else if (n - node.data == 0) { return 1; } n -= node.data; if (n == 1) { node.left = new Node(1); return num + A(node.left, n); } else if (n >= 2) { node.left = new Node(1); node.right = new Node(2); return num + A(node.left, n, num) + A(node.right, n, num); } } if (n == 1) { head.left = new Node(1); return A(head.left, n, num); } else if (n >= 2) { head.left = new Node(1); head.right = new Node(2); return A(head.left, n, num) + A(head.right, n, num); } }
這樣在打印head的情況下,會把所有方式的軌跡都打印出來,如果不考慮軌跡路徑,建議使用斐波那契數列
b) 冒泡排序、選擇排序、插入排序、歸并排序、快速排序、順序搜索、二分搜索
5、學習數據結構需要知道哪些知識a) 數組
b) Class 定義類的方法
1、棧的定義
棧是一種特殊的線性表,僅能夠在棧頂進行操作,有著先進后出(后進先出)的特性,下面展示了棧的工作特點
2.棧的實現
從數據儲存的角度看,實現棧可以用數組來實現,注意:僅可以用數組實現嗎? a、棧的幾個方法: *push 添加一個元素到棧頂 *pop 彈出棧頂元素 *top 返回棧頂元素 *isEmpty 判斷棧是否為空 *size 返回棧里元素的個數 *clear 清空棧
3、代碼實現
// push pop top isEmpty size clear 用數組完成 function Stack() { var items = []; var min = null; // 添加一個元素到棧頂 this.push = function(item) { items.push(item); }; // 彈出棧頂元素 this.pop = function() { return items.pop(); }; // 返回棧頂元素,不彈出 this.top = function() { return items[items.length - 1]; }; // 判斷棧是否為空 this.isEmpty = function() { return items.length == 0; }; // 返回棧里元素的個數 this.size = function() { return items.length; }; // 清空棧,不推薦使用items.length = 0,學術派討論, // 說法一,賦值更快,length為0影響其他已用,內存 this.clear = function() { items = []; }; }
4、練習題
判斷(abc),)(bcd),(ab(cd)),括號是否合法 例如:(abc) 合理 (bcd)( 不合理 )() 不合理
/** * 棧,隊列其實就是(數組或)操作成,只不過角度不同 * 1.判斷(abc),)(bcd),(ab(cd)),是否合法 * 解析,用棧解決 * a.遇到左括號,就把做括號入棧 * b.遇到右括號,判斷棧是否為空,為空說明沒有左括號與之對應,不合法, * 如果棧不為空,則把棧頂元素移除,與右括號抵消,繼續執行 * c.for循環結束,如果棧為空,就說明括號相互抵消, * 如果棧不為空,說明不合法 */ function check(str) { let len = str.length; let stack = new Stack(); for (let i = 0; i < len; i++) { if (str[i] == "(") { stack.push("("); } else if (str[i] == ")") { if (stack.isEmpty()) { return false; } else { stack.pop(); } } } return stack.isEmpty(); }
贈言:每當你懷疑學習數據結構的必要性和作用時,如果你手里只有錘子,那么目光所及之處都是釘子
作者:易企秀——王明
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/106517.html
摘要:今天,百度超級鏈小姐姐和百度資深研發工程師靜姐姐,為大家帶來百度超級鏈學院系列視頻課程如何快速部署超級鏈。視頻課程共分為三講第一講如何快速建鏈第二講共識機制第三講智能合約的開發。 百度超級鏈Xuperchain開源之后,我們感受到了開發者伙伴們的熱情關注,其中有不少朋友提到希望進一步了解百度超級鏈網絡的搭建方法。 今天,百度超級鏈小X姐姐和百度資深研發工程師靜姐姐,為大家帶來百度超級鏈...
摘要:課堂筆記開發歷史時代靜態頁面用戶交互較少功能偏弱,沒有真正意義上的前端開發時代面向編程改變了數以百萬計的前端開發程序員寫代碼的方式做了事件化這件事情也是從開始的的擴展性非常好,以為中心的生態非常好,基于的庫非常多沒有模塊加載機制,需要顯示地 課堂筆記 web開發歷史 web1.0時代 靜態頁面; 用戶交互較少; 功能偏弱,沒有真正意義上的前端開發; jQuery時代 面向DOM編...
摘要:在學習更多關于的知識和技能現在到了我們總結使用模式構建系列的時候,這是一個很好的機會回顧一下這個系列涵蓋的模式所解決的問題,并著重復習每個模式所具有的一些好處以及做出的權衡。長期關注分布式系統及通用型數據庫技術。 在MongoDB University學習更多關于MongoDB的知識和技能 現在到了我們總結使用模式構建系列的時候,這是一個很好的機會回顧一下這個系列涵蓋的模式所解決的問題...
閱讀 797·2023-04-25 22:57
閱讀 3051·2021-11-23 10:03
閱讀 613·2021-11-22 15:24
閱讀 3156·2021-11-02 14:47
閱讀 2901·2021-09-10 11:23
閱讀 3115·2021-09-06 15:00
閱讀 3936·2019-08-30 15:56
閱讀 3322·2019-08-30 15:52