1. 程式人生 > >隊列的JS實現及廣度優先搜索(BFS)的實現

隊列的JS實現及廣度優先搜索(BFS)的實現

=== 靈活 return front 結構 ren 做出 入隊 []

隊列是先進先出(FIFO)的數據結構,插入操作叫做入隊,只能添加在隊列的末尾;刪除操作叫做出隊,只能移除第一個元素。在JS中,用數組可以很簡單的實現隊列。

function Queue () {
    this.queue = [];
}
// 增加
Queue.prototype.enQueue = function(x) {
    this.queue.push(x);
    return true;
}
// 刪除
Queue.prototype.deQueue = function() {
    if(this.isEmpty()) {
        return false;
    }
    this.queue.shift();
    return true;    
}
// 獲取隊首元素
Queue.prototype.front = function() {
    if(this.isEmpty()) {
        return false;
    }
    this.queue[0];  
}
// 是否為空
Queue.prototype.isEmpty = function() {
    return !this.queue.length
}

以上就實現了隊列的數據結構,那麽隊列這種數據結構有什麽作用呢?在廣度優先搜索(BFS)中,很適合隊列。那什麽是BFS。在樹的遍歷中,有兩種遍歷方式,其中一種就是從根節點一層一層的往下遍歷,這就是廣度優先;另一種是先由根節點選一條路徑直接遍歷到葉子節點,這就是深度優先搜索(DFS)。隊列可以用在BFS中,下面我們來實現一個廣度優先搜索的例子,返回目標節點深度。

        let root = {
            key: 1,
            children: [
                {
                    key:2,
                },
                {
                    key:3,
                    children:[
                        {
                            key:4,
                        }
                    ]
                }
            ]
        } // 數據源

function bfs(root, target) {
    //利用上面創建的Queue,當然也可以直接用數組實現
    let queue = new Queue();
    let step = 0;  // 根節點到目標節點之間的深度
    queue.enQueue(root); //將根節點加入
    //遍歷隊列
    while(!queue.isEmpty()) {
        step += 1;
        let len = queue.length;
        // 分層遍歷隊列,沒有目標元素則刪除該層元素,繼續遍歷下一層
        for(let i =0; i<len; i++) {
            let cur = queue.front()  // 獲取隊首元素
            if(target === cur.key) return step; //如果是目標元素,返回
            // 如果不是,將下一層節點加入到隊列
            if(cur.children && cur.children.length) {
                cur.children.map(item => {
                    queue.enQueue(item)
                })
            }
            queue.deQueue()  //然後將遍歷過的節點刪除,
        }
    }
}

bfs(root,4)

這樣我們就完成了BFS的實現思路,大家可已參照該思路在具體的業務中靈活運用BFS。

原文地址:

隊列是先進先出(FIFO)的數據結構,插入操作叫做入隊,只能添加在隊列的末尾;刪除操作叫做出隊,只能移除第一個元素。在JS中,用數組可以很簡單的實現隊列。

function Queue () {
    this.queue = [];
}
// 增加
Queue.prototype.enQueue = function(x) {
    this.queue.push(x);
    return true;
}
// 刪除
Queue.prototype.deQueue = function() {
    if(this.isEmpty()) {
        return false;
    }
    this.queue.shift();
    return true;    
}
// 獲取隊首元素
Queue.prototype.front = function() {
    if(this.isEmpty()) {
        return false;
    }
    this.queue[0];  
}
// 是否為空
Queue.prototype.isEmpty = function() {
    return !this.queue.length
}

以上就實現了隊列的數據結構,那麽隊列這種數據結構有什麽作用呢?在廣度優先搜索(BFS)中,很適合隊列。那什麽是BFS。在樹的遍歷中,有兩種遍歷方式,其中一種就是從根節點一層一層的往下遍歷,這就是廣度優先;另一種是先由根節點選一條路徑直接遍歷到葉子節點,這就是深度優先搜索(DFS)。隊列可以用在BFS中,下面我們來實現一個廣度優先搜索的例子,返回目標節點深度。

        let root = {
            key: 1,
            children: [
                {
                    key:2,
                },
                {
                    key:3,
                    children:[
                        {
                            key:4,
                        }
                    ]
                }
            ]
        } // 數據源

function bfs(root, target) {
    //利用上面創建的Queue,當然也可以直接用數組實現
    let queue = new Queue();
    let step = 0;  // 根節點到目標節點之間的深度
    queue.enQueue(root); //將根節點加入
    //遍歷隊列
    while(!queue.isEmpty()) {
        step += 1;
        let len = queue.length;
        // 分層遍歷隊列,沒有目標元素則刪除該層元素,繼續遍歷下一層
        for(let i =0; i<len; i++) {
            let cur = queue.front()  // 獲取隊首元素
            if(target === cur.key) return step; //如果是目標元素,返回
            // 如果不是,將下一層節點加入到隊列
            if(cur.children && cur.children.length) {
                cur.children.map(item => {
                    queue.enQueue(item)
                })
            }
            queue.deQueue()  //然後將遍歷過的節點刪除,
        }
    }
}

bfs(root,4)

這樣我們就完成了BFS的實現思路,大家可已參照該思路在具體的業務中靈活運用BFS。

原文地址:https://segmentfault.com/a/1190000016900956

隊列的JS實現及廣度優先搜索(BFS)的實現