成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

數(shù)據(jù)結(jié)構(gòu)第一講

wemall / 2637人閱讀

摘要:為什么要學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)語言是相通的人們常說,編程語言是相通的,掌握一門,其他語言很容易就能掌握。其實,真正想通的不是語言,而是數(shù)據(jù)結(jié)構(gòu)與算法。

為什么要學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu) 1.語言是相通的

人們常說,編程語言是相通的,掌握一門,其他語言很容易就能掌握。
個人認為這是一個似是而非的觀點,每門編程語言都離不開變量,數(shù)組,循環(huán),條件判斷這些概念,這似乎能支持上面的觀點,但是每門編程語言都有自己的使用范圍,都有自己擅長的事情,即便是有了 node.js 這中能夠一統(tǒng)前后端的語言,也總有他不能勝任的工作,比如機器學(xué)習(xí)。像python 這樣近乎萬能的語言,也會在高性能計算的時候無能為力。
其實,真正想通的不是語言,而是數(shù)據(jù)結(jié)構(gòu)與算法。數(shù)據(jù)結(jié)構(gòu)和算法是脫離編程語言而存在的,不同的語言有不同的實現(xiàn)版本,但是內(nèi)在邏輯卻不會發(fā)生變化,所提現(xiàn)的編程思想不會有變化

2.業(yè)務(wù)場景

a、前端通過 websocket 獲取數(shù)據(jù),數(shù)據(jù)是具體的坐標,當(dāng)獲取到坐標的時候,在前端的地圖上顯示一個光圈。但是,后端不定期發(fā)送,可能一次推送幾個,也可能幾秒鐘才推送一個,當(dāng)數(shù)據(jù)特別頻繁的時候,坐標都在地圖上顯示,地圖會非常亂,所以對于前端來說要做一個限制,前端同一個時刻最多顯示10個坐標,新坐標需要把最早的坐標擠掉,每個坐標最多顯示5秒鐘。

是否可以通過隊列的方式,每一個節(jié)點都包括,后臺傳過來的數(shù)據(jù)坐標和當(dāng)前的時間,當(dāng)超過10個坐標的時候,擠掉頭部出隊列,前端做事件循環(huán)每一秒鐘,檢查一下頭部是否超過5s,如果超過,頭部出隊列。

b、H5頁面翻頁場景業(yè)務(wù),
可以添加頁面,刪除頁面,移動頁面,翻看頁面。我猜想大多數(shù)情況應(yīng)該是對數(shù)組進行操作,通過arr,角標index和for循環(huán)來渲染頁面的.

換個思路:
是否可以用雙向鏈表的方式完成這些操作,每一個頁節(jié)點,包括本頁的數(shù)據(jù),pre前一頁的指向和next后一頁的指向,當(dāng)添加操作的時候其實是在尾節(jié)點next指向新頁,刪除頁面的時候其實是把前一頁的next指向刪除頁的next,移動頁面其實就是先完成刪除頁面,在完成添加頁面操作,向后翻看頁面的時候,就是一直在操作next,向前翻看其實就是一直操作pre。
不考慮分頁情況,如果存在分頁情況,也可以后端只保存一條數(shù)據(jù),在存入的時候先讀取數(shù)據(jù)在update數(shù)據(jù)(這樣會增加服務(wù)器壓力)

3.學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)的目標

a) 提高程序設(shè)計能力
b) 提高算法能力,數(shù)據(jù)結(jié)構(gòu)的精髓在于總結(jié)提煉了許多儲存管理和使用數(shù)據(jù)的模式,這些模式的背后是最精華的編程思想,這些思想的領(lǐng)悟會需要一些時間,不是學(xué)習(xí)了幾種數(shù)據(jù)結(jié)構(gòu)就能在工作中大展伸手,但是學(xué)會了數(shù)據(jù)結(jié)構(gòu),對自身能力的提升是很有幫助的
在沒有完全參悟這些編程思想和管理方式的時候,我們只需要學(xué)習(xí)具體的工具和方法。

4.數(shù)據(jù)結(jié)構(gòu)和算法都有哪些

棧 -- 羽毛球、羊肉串
隊列 -- 排隊登機,優(yōu)先隊列 -- vip用戶、軍人、老人、排隊優(yōu)先進入
鏈表 -- 猴子撈月,包括單向鏈表、雙向鏈表
集合 -- es6中的Set
字典 -- es6中的Map
散列集 -- 曾經(jīng)討論過,因為數(shù)組的長度不固定,角標用哈希表示、循環(huán)盡量采取foreach自動過濾調(diào)empty的位置輸出
圖 -- 迷宮 :深度搜索和廣度搜索,這個請參考https://segmentfault.com/a/11...
樹 -- 學(xué)習(xí)小組討論過一個問題,可以用二叉樹來解決

    假設(shè)你正在爬樓梯。需要 n 階你才能到達樓頂
    每次你可以爬 1 或 2 個臺階。你有多少種不同的方法可以爬到樓頂呢?
    注意:給定 n 是一個正整數(shù)。
    示例 1:     
    輸入: 2
    輸出: 2
    解釋: 有兩種方法可以爬到樓頂。
    1.  1 階 + 1 階
    2.  2 階
    示例 2: 
    輸入: 3
    輸出: 3
    解釋: 有三種方法可以爬到樓頂。
    1.  1 階 + 1 階 + 1 階
    2.  1 階 + 2 階
    3.  2 階 + 1 階
function Node(data) {
    // 二叉樹節(jié)點
    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的情況下,會把所有方式的軌跡都打印出來,如果不考慮軌跡路徑,建議使用斐波那契數(shù)列

b) 冒泡排序、選擇排序、插入排序、歸并排序、快速排序、順序搜索、二分搜索

5、學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)需要知道哪些知識

a) 數(shù)組
b) Class 定義類的方法

數(shù)據(jù)結(jié)構(gòu)之棧

1、棧的定義

棧是一種特殊的線性表,僅能夠在棧頂進行操作,有著先進后出(后進先出)的特性,下面展示了棧的工作特點

2.棧的實現(xiàn)

從數(shù)據(jù)儲存的角度看,實現(xiàn)棧可以用數(shù)組來實現(xiàn),注意:僅可以用數(shù)組實現(xiàn)嗎?
a、棧的幾個方法:
    *push 添加一個元素到棧頂
    *pop 彈出棧頂元素
    *top 返回棧頂元素
    *isEmpty 判斷棧是否為空
    *size 返回棧里元素的個數(shù)
    *clear 清空棧

3、代碼實現(xiàn)

// push pop top isEmpty size clear 用數(shù)組完成
        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;
            };
            // 返回棧里元素的個數(shù)
            this.size = function() {
                return items.length;
            };
            // 清空棧,不推薦使用items.length = 0,學(xué)術(shù)派討論,
            // 說法一,賦值更快,length為0影響其他已用,內(nèi)存
            this.clear = function() {
                items = [];
            };
        }

4、練習(xí)題

 判斷(abc),)(bcd),(ab(cd)),括號是否合法
 例如:(abc)  合理
      (bcd)( 不合理
      )()    不合理
 /**
 * 棧,隊列其實就是(數(shù)組或)操作成,只不過角度不同
 * 1.判斷(abc),)(bcd),(ab(cd)),是否合法
 * 解析,用棧解決
 * a.遇到左括號,就把做括號入棧
 * b.遇到右括號,判斷棧是否為空,為空說明沒有左括號與之對應(yīng),不合法,
 *   如果棧不為空,則把棧頂元素移除,與右括號抵消,繼續(xù)執(zhí)行
 * c.for循環(huán)結(jié)束,如果棧為空,就說明括號相互抵消,
 *              如果棧不為空,說明不合法
 */
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();
}

贈言:每當(dāng)你懷疑學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)的必要性和作用時,如果你手里只有錘子,那么目光所及之處都是釘子

作者:易企秀——王明

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/106517.html

相關(guān)文章

  • 百度超級鏈學(xué)院開課啦!一講教你《如何快速建鏈》

    摘要:今天,百度超級鏈小姐姐和百度資深研發(fā)工程師靜姐姐,為大家?guī)戆俣瘸夋湆W(xué)院系列視頻課程如何快速部署超級鏈。視頻課程共分為三講第一講如何快速建鏈第二講共識機制第三講智能合約的開發(fā)。 百度超級鏈Xuperchain開源之后,我們感受到了開發(fā)者伙伴們的熱情關(guān)注,其中有不少朋友提到希望進一步了解百度超級鏈網(wǎng)絡(luò)的搭建方法。 今天,百度超級鏈小X姐姐和百度資深研發(fā)工程師靜姐姐,為大家?guī)戆俣瘸夋?..

    Tikitoo 評論0 收藏0
  • web架構(gòu)學(xué)習(xí)總結(jié)一講

    摘要:課堂筆記開發(fā)歷史時代靜態(tài)頁面用戶交互較少功能偏弱,沒有真正意義上的前端開發(fā)時代面向編程改變了數(shù)以百萬計的前端開發(fā)程序員寫代碼的方式做了事件化這件事情也是從開始的的擴展性非常好,以為中心的生態(tài)非常好,基于的庫非常多沒有模塊加載機制,需要顯示地 課堂筆記 web開發(fā)歷史 web1.0時代 靜態(tài)頁面; 用戶交互較少; 功能偏弱,沒有真正意義上的前端開發(fā); jQuery時代 面向DOM編...

    CoorChice 評論0 收藏0
  • 數(shù)據(jù)結(jié)構(gòu)一講

    摘要:為什么要學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)語言是相通的人們常說,編程語言是相通的,掌握一門,其他語言很容易就能掌握。其實,真正想通的不是語言,而是數(shù)據(jù)結(jié)構(gòu)與算法。 為什么要學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu) 1.語言是相通的 人們常說,編程語言是相通的,掌握一門,其他語言很容易就能掌握。個人認為這是一個似是而非的觀點,每門編程語言都離不開變量,數(shù)組,循環(huán),條件判斷這些概念,這似乎能支持上面的觀點,但是每門編程語言都有自己的使用范...

    k00baa 評論0 收藏0
  • 使用模式構(gòu)建系列總結(jié)

    摘要:在學(xué)習(xí)更多關(guān)于的知識和技能現(xiàn)在到了我們總結(jié)使用模式構(gòu)建系列的時候,這是一個很好的機會回顧一下這個系列涵蓋的模式所解決的問題,并著重復(fù)習(xí)每個模式所具有的一些好處以及做出的權(quán)衡。長期關(guān)注分布式系統(tǒng)及通用型數(shù)據(jù)庫技術(shù)。 在MongoDB University學(xué)習(xí)更多關(guān)于MongoDB的知識和技能 現(xiàn)在到了我們總結(jié)使用模式構(gòu)建系列的時候,這是一個很好的機會回顧一下這個系列涵蓋的模式所解決的問題...

    he_xd 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<