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

資訊專欄INFORMATION COLUMN

前端不得不說的數(shù)據(jù)結(jié)構(gòu)

netmou / 2148人閱讀

摘要:前端必須要掌握常見的數(shù)據(jù)結(jié)構(gòu),學(xué)會(huì)這招,讓你對(duì)開發(fā)中的數(shù)據(jù)結(jié)構(gòu)更加清晰一隊(duì)列像排隊(duì)一樣,隊(duì)列就是先進(jìn)先出,排隊(duì)入場(chǎng)入隊(duì)列出隊(duì)列二棧像拿起堆放的柴火一樣,棧就是先進(jìn)后出,離場(chǎng)時(shí)后進(jìn)的人先出入棧出棧三鏈表鏈表讓我們刪除數(shù)據(jù)和新增數(shù)據(jù)更加方便指針

前端必須要掌握常見的數(shù)據(jù)結(jié)構(gòu),學(xué)會(huì)這招,讓你對(duì)開發(fā)中的數(shù)據(jù)結(jié)構(gòu)更加清晰! 一.隊(duì)列

像排隊(duì)一樣,隊(duì)列就是先進(jìn)先出,排隊(duì)入場(chǎng)!

class Queue {
    constructor() {
        this.arr = []
    }
    enqueue(element){ // 入隊(duì)列
        this.arr.push(element)
    }
    dequeue(){ // 出隊(duì)列
        return this.items.shift()
    }
}
二.棧

像拿起堆放的柴火一樣,棧就是先進(jìn)后出,離場(chǎng)時(shí)后進(jìn)的人先出!

class Stack {
    constructor(){
        this.arr = [];
    }
    push(element){ // 入棧
        this.arr.push(element);
    }
    pop() { // 出棧
        return this.items.pop();
    }
}
三.鏈表

鏈表讓我們刪除數(shù)據(jù)和新增數(shù)據(jù)更加方便!

head指針指向第一個(gè)存入的元素節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)都有next屬性指向一下一個(gè)元素節(jié)點(diǎn),最后一個(gè)元素的指針指向null

創(chuàng)建一個(gè)節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)的結(jié)構(gòu)非常簡(jiǎn)單

class Node {
    constructor(element){
        this.element = element; // 每個(gè)節(jié)點(diǎn)保存的內(nèi)容
        this.next = null; // 保存的指針,指向下一個(gè)節(jié)點(diǎn)
    }
}

構(gòu)建鏈表

class LinkList {
    constructor(){
        this.head = null; // 表頭 默認(rèn)指向第一個(gè)節(jié)點(diǎn),沒有為null
        this.length = 0;
    }
    append(element){
        // 追加節(jié)點(diǎn)
        const node = new Node(element);
        if(this.head == null){
            this.head = node; // 第一個(gè)節(jié)點(diǎn)就是表頭
        }else{
            let current = this.head;
            // 從第一個(gè)節(jié)點(diǎn)查找到最后一個(gè)節(jié)點(diǎn)
            while(current.next){
                current = current.next;
            }
            current.next = node; // 找到最后一個(gè)節(jié)點(diǎn)添加next指向新增節(jié)點(diǎn)
        }
        this.length++; // 每增加一個(gè)長(zhǎng)度
    }
}

使用鏈表,不難看出鏈表的特點(diǎn)就是通過next來指向下一個(gè)節(jié)點(diǎn)(像鏈條一樣)

const ll = new LinkList();
ll.append(1);
ll.append(2);
console.log(ll); // head: Node { element: 1, next: Node { element: 2, next: null } }

實(shí)現(xiàn)鏈表的插入

insert(position,element){
    // 插入的時(shí)候判斷插入的位置
    if(position>=0 && position <=this.length){
        const node = new Node(element); // 創(chuàng)建一個(gè)節(jié)點(diǎn)
        if(position === 0){ // 如果位置是0
            node.next = this.head; // 那么就讓當(dāng)前節(jié)點(diǎn)變成頭
            this.head = node;
        }else{
            let current = this.head; // 獲取頭節(jié)點(diǎn)查找位置
            let previous = null;
            let index = 0;
            while(index++ < position){ // 查找到節(jié)點(diǎn)位置
                previous = current;
                current = current.next;
            }
            node.next = current; // 讓當(dāng)前節(jié)點(diǎn)next是剛才找到的節(jié)點(diǎn)
            previous.next = node; // 他的上一個(gè)節(jié)點(diǎn)的next是當(dāng)前節(jié)點(diǎn)
        }
        this.length++;
    }
}

實(shí)現(xiàn)鏈表的刪除

removeAt(position){
      if(position > -1 && position < this.length){
          if(position ==0){ // 如果是第一個(gè)直接改變指針
              this.head = this.head.next
          }else{
              let index = 0;
              let previous = null;
              let current = this.head;
              while(index++ < position){ // 找到要?jiǎng)h除的這一項(xiàng),直接讓上一個(gè)指針指向下一個(gè)人
                  previous = current;
                  current = current.next
              }
              previous.next = current.next; // 上一個(gè)next直接指向下一個(gè)next
          }
          this.length--;
      }
  }

更新鏈表中的內(nèi)容

update(position,element) {
    if (position >= 0 && position < this.length) {
        if (position === 0) {
          // 根位置 直接更改跟的內(nèi)容即可
          this.head.element = element
        }else{
            let index = 0;
            // 查找到要修改的項(xiàng)來更新
            let current = this.head;
            while(index++ < position){
              current = current.next;
            }
            current.element = element;
        }
      }
  }
四.集合

ES6已經(jīng)為我們提供了Set的api,但是在某些時(shí)候(瀏覽器不支持的情況下),我們還是需要自己來實(shí)現(xiàn)Set的

class Set{
    constructor(){
        this.items = {};
    }
    has(value){ // 判斷
        return this.items.hasOwnProperty(value);
    }
    add(value){ // 像集合中添加
        if(!this.has(value)){
            this.items[value] = value;
        }
    }
    remove(value){ // 刪除集合中的某一項(xiàng)
        if(this.has(value)){
            delete this.items[value];
        }
    }
}
集合,常見的方法有:交集、并集、差集
五.hash表

特點(diǎn)是查找速度快,但是存儲(chǔ)量需要手動(dòng)擴(kuò)展

class HashTable{
    constructor(){
        this.table = [];
    }
    calcuteHash(key){ // 通過put的key 計(jì)算hash戳,存到數(shù)組中
        let hash = 0;
        for(let s of key){
            hash += s.charCodeAt();
        }
        return hash % 100; // 只能存放100個(gè)
    }
    get(key){ // 從hash表中取出值
        let hash = this.calcuteHash(key);
        return this.table[hash]
    }
    put(key,value){ // 像hash表中存入
        let hash = this.calcuteHash(key);
        this.table[hash] = value;
    }
}
let hash = new HashTable();
hash.put("abc",1);
console.log(hash.get("abc"));
六.樹

叫做“樹”是因?yàn)樗雌饋硐褚豢玫箳斓臉?,也就是說它是根朝上,而葉朝下的。

前端最??疾斓木褪嵌鏄?!

二叉樹: 樹中的節(jié)點(diǎn)最多只能有兩個(gè)子節(jié)點(diǎn)

二叉查找樹:
若左子樹不空,則左子樹上所有節(jié)點(diǎn)的值均小于它的根節(jié)點(diǎn)的值
若右子樹不空,則右子樹上所有節(jié)點(diǎn)的值均大于它的根節(jié)點(diǎn)的值

class Node {
    constructor(key){
        this.key = key;
        this.left = null; // 左樹
        this.right = null;// 右樹
    }
}
class BinarySearchTree{
    constructor(){
        this.root = null;
    }
    insert(key){
        const newNode = new Node(key);
        const insertNode = (node,newNode)=>{
            // 看下是放在左邊還是右邊
            if(newNode.key < node.key){ // left
                if(node.left == null){
                    node.left = newNode;
                }else{ // 如果節(jié)點(diǎn)已經(jīng)有了那么繼續(xù)像當(dāng)前節(jié)點(diǎn)插入
                    insertNode(node.left,newNode);
                }
            }else{ // right
                if(node.right == null){
                    node.right = newNode;
                }else{
                    insertNode(node.right,newNode);
                }
            }
        }
        if(!this.root){ // 如果根沒有值 那么他就是根
            this.root = newNode;
        }else{ // 插到某一側(cè)
            insertNode(this.root,newNode)
        }
    }
}
let binaryTree = new BinarySearchTree();
binaryTree.insert(8);
binaryTree.insert(3);
binaryTree.insert(10);
七.圖

圖可以看成有關(guān)聯(lián)的樹,我們可以使用鄰接表來描述各個(gè)節(jié)點(diǎn)的關(guān)系

class Graph{
    constructor(){
        this.List = {};
    }
    addNode(v){
        this.List[v] = [];
    }
    addRelation(v,w){
        // 相互存儲(chǔ)關(guān)系
        this.List[v].push(w);
        this.List[w].push(v);
    }
}
const graph = new Graph();
["A", "B", "C", "D", "E", "F", "G", "H", "I"].forEach(node => graph.addNode(node));
graph.addRelation("A", "B")
graph.addRelation("A", "C")
graph.addRelation("A", "D")
console.log(graph.List["A"]);

看到這里是不是對(duì)數(shù)據(jù)結(jié)構(gòu)有了一定的認(rèn)識(shí)啦!接下來就看大家的合理應(yīng)用啦~

覺得本文對(duì)你有幫助嗎?請(qǐng)分享給更多人
關(guān)注「前端優(yōu)選」加星標(biāo),提升前端技能

加我微信:webyouxuan

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

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

相關(guān)文章

  • node實(shí)現(xiàn)文件下載不得不說那些事兒

    摘要:如果像本例中這樣的場(chǎng)景會(huì)遇到這樣一個(gè)問題,詳見鏈接當(dāng)請(qǐng)求參數(shù)過長(zhǎng)或?yàn)榱税踩?,就需要用到下載。寫到這里自己都忍不住想錘自己,給自己挖坑不說,這樣來回請(qǐng)求下載,流量,真的是敗家。 這幾天一直在做遠(yuǎn)程文件下載的事,現(xiàn)在總算有了解決,特來記錄一下踩過的坑和想揍自己的心 需求 應(yīng)用場(chǎng)景是這樣的,底層邏輯數(shù)據(jù)請(qǐng)求接口是由Java寫的,也就是說原始文件存在Java服務(wù)端,返回時(shí)有加密措施 由于工作...

    Coly 評(píng)論0 收藏0
  • nginx限速不得不說事之連接數(shù)限制技巧

    摘要:但是,你的連接數(shù)限制配置為允許單個(gè)連接數(shù),單個(gè)連接數(shù)最大帶寬為。就降低單個(gè)連接數(shù)帶寬吧要知道大家誰(shuí)沒事會(huì)用瀏覽器自帶下載器下載呢注本文只探討限速模塊在不同業(yè)務(wù)下的限速彩蛋偶爾發(fā)現(xiàn),將連接數(shù)限制為迅雷不能高速下載了。 nginx 內(nèi)置模塊限速怎么使用就不多說了,今天來說說連接數(shù)和單個(gè)連接數(shù)限速的事。 場(chǎng)景:A公司有100人,A公司只有一個(gè)公網(wǎng)IP,假設(shè)A公司可能有100個(gè)人同時(shí)在下載你的...

    neroneroffy 評(píng)論0 收藏0
  • nginx限速不得不說事之連接數(shù)限制技巧

    摘要:但是,你的連接數(shù)限制配置為允許單個(gè)連接數(shù),單個(gè)連接數(shù)最大帶寬為。就降低單個(gè)連接數(shù)帶寬吧要知道大家誰(shuí)沒事會(huì)用瀏覽器自帶下載器下載呢注本文只探討限速模塊在不同業(yè)務(wù)下的限速彩蛋偶爾發(fā)現(xiàn),將連接數(shù)限制為迅雷不能高速下載了。 nginx 內(nèi)置模塊限速怎么使用就不多說了,今天來說說連接數(shù)和單個(gè)連接數(shù)限速的事。 場(chǎng)景:A公司有100人,A公司只有一個(gè)公網(wǎng)IP,假設(shè)A公司可能有100個(gè)人同時(shí)在下載你的...

    remcarpediem 評(píng)論0 收藏0
  • JavaScript數(shù)據(jù)類型和他背后不得不說故事

    摘要:基本概念中有種簡(jiǎn)單數(shù)據(jù)類型也稱為基本數(shù)據(jù)類型,存放在棧中和。在使用聲明變量但未對(duì)其加以初始化時(shí),這個(gè)變量的值就是,例如類型是第二個(gè)只有一個(gè)值的數(shù)據(jù)類型,這個(gè)特殊的值是。類型阿拉伯?dāng)?shù)字的八進(jìn)制十進(jìn)制十六進(jìn)制整數(shù)浮點(diǎn)數(shù)。 基本概念 ECMAScript 中有 5 種簡(jiǎn)單數(shù)據(jù)類型(也稱為基本數(shù)據(jù)類型,存放在棧中):Undefined、Null、Boolean、Number 和String。還...

    ASCH 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<