一般情況下,隊列都需要遵循FIFO原則,但在一些特殊的場合,我們希望隊列的出隊能夠更加智能,不僅僅考慮入隊先后順序,同時還考慮隊中元素的優先性,以保障資源能夠得到更加科學有效的使用。
要實現優先隊列,首先考慮如何區分不同優先級的元素,一種做法是給元素添加優先級標記/屬性。
var element = {
......
this.priority = high / medium / low;
......
}
其次則是元素出隊的實現,已知的方法是在出隊方法/函數中添加判斷邏輯,返回當前隊列中最接近隊首且優先級最高的元素;
function dequeue() {
var index = 0,//最接近隊首且優先級最高的元素序號,初始為0(即隊首)
superior = this.data.priority;//當前最高優先級
//遍歷確定出隊元素
for (var i = 1; i < this.data.length; ++i) {
if (this.data[i].priority > priority) {//若當前遍歷元素優先級高于已知最高優先級
priority = this.data[i].priority;//更新最高優先級
index = i;//更新出隊元素
}
}
return this.data.splice(index,1);
}
2017.04.12的更新
也可以考慮使用堆實現優先級隊列,入隊時調用restore重建堆,形成最大堆,即優先級最高的元素保持在堆頂,出隊時彈出堆頂元素,然后調用restore再次重建堆,需要考慮的是如何保持同級元素的FIFO的特性;