JS 优先队列

一般情况下从队列中删除的元素,一定是率先入队的元素。但是也有一些使用队列的应用,在删除元素时不必遵守先进先出的约定。这种应用,需要使用一个叫做优先队列(priority queue)的数据结构来进行模拟。

优先队列中元素的添加和移除是基于优先级的,从优先队列中删除元素时,需要考虑优先权的限制。优先队列具有最高级先出(First In Largest Out)的行为特征。

例如:医院急诊科(Emergency Department)的候诊室是采取优先队列的,当病人进入候诊室时,分诊护士会评估患者病情的严重程度,然后给一个优先级代码。高优先级的患者先于低优先级的患者就医,同样优先级的患者按照先来先服务的顺序就医。

function Patient(name,code){
    this.name = name;
    this.code = code;//整数表示患者的优先级或病情严重程度
}
function Queue(){
    this.data = [];
    /*入队*/
    this.enqueue = function(element){
        this.data.push(element);
    };
    /*出队:删除队列中更拥有最高优先级的元素,优先码最小的元素优先级最高。*/
    this.dequeue = function(){
        var priority = this.data[0].code;
        //使用顺序查找方法寻找优先级最高的元素,优先码越小优先级越高
        for(var i=0; i<this.data.length; ++i){
            if(this.data[i].code < priority){
                priority = i;
            }
        }
        return this.data.splice(priority,1);
    };
    this.toString = function(){
        var retstr = '';
        for(var i=0; i<this.data.length; ++i){
            retstr +=  this.data[i].name + " code: " + this.data[i].code + "\n";
        }
        return retstr;
    }
}
/*test*/
var queue = new Queue();
var p = new Patient('smith',5);
queue.enqueue(p);
p = new Patient('jones',4);
queue.enqueue(p);
p = new Patient('fehrenbach',6);
queue.enqueue(p);
p = new Patient('brown',1);
queue.enqueue(p);
p = new Patient('ingram',1);
queue.enqueue(p);
print(queue.toString());

var seen = queue.dequeue();
print(queue.toString());

实现优先队列有两种选项:

  • 设置优先级然后再正确的位置添加元素
  • 用入列操作添加元素然后按照优先级移除它们
function PriorityQueue(){
    var items = [];

    function QueueElement(element,priority){
        this.element = element;
        this.priority = priority;
    }

    this.enqueue = function(element, priority){
        var qe = new QueueElement(element, priority);
        //若队列为空则直接将元素入列否则需要比较该元素与其他元素的优先级
        if(this.isEmpty()){
            items.push(qe);
        }else{
            var added = false;
            //找出比要添加元素的优先级值更大的项目,就把新元素插入到它之前。
            for(var i=0; i<items.length; i++){
                //一旦找到priority值更大的元素就插入新元素并终止队列循环
                if(qe.priority < items[i].priority){
                    items.splice(i,0,qe);
                    added = true;
                    break;
                }
            }
            if(!added){
                items.push(qe);
            }
        }
    };

    this.isEmpty = function(){
        return items.length === 0;
    };
    this.print = function(){
        var str = '';
        for(var i=0; i<items.length; i++){
            str += items[i].priority + ' ' + items[i].element + '\n'
        }

        console.log(str.toString());
    }
}

这里实现的优先队列称为最小优先队列,因为优先级的值较小的元素被放置在队列最前面。最大优先队列则与之相反,把优先级的值较大的元素放置在队列最前面。

/*test*/
var pq = new PriorityQueue();
pq.enqueue('John',2);
pq.enqueue('Jack',1);
pq.enqueue('Camila',1);
pq.print();
最小优先队列
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 如需转载, 请咨询作者, 并且注明出处.有任何问题, 可以关注我的微博: coderwhy, 或者添加我的微信: ...
    coderwhy阅读 10,082评论 9 44
  • 队列(queue)是遵循先进先出(First In First Out, FIFO)的一组有序的项目,队列在尾部添...
    JunChow520阅读 857评论 0 0
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,665评论 19 139
  • 数据结构与算法--优先队列和堆排序 在某些数据处理的例子中,总数据量太大,无法排序(甚至无法全部装进内存)。例如,...
    sunhaiyu阅读 1,128评论 0 2
  • 有人说,要么读书,要么去旅游。身体和灵魂必须有一个在路上。 而我总说,饭可以少吃,书不可以少读。我想将我喜欢的书推...
    静待花开9898阅读 586评论 2 3

友情链接更多精彩内容