Javascript JS中的优先级队列

Javascript JS中的优先级队列,javascript,priority-queue,Javascript,Priority Queue,我正在尝试为我自己的数据类型使用一个优先级队列,它是一个3x3数组。实际的代码和数据类型更复杂,所以我将其归结为要点。请注意,优先级队列适用于整数数据类型(请参见末尾的输出)。一切都是不言自明的。假设metric函数为给定的3X3数组返回一个正整数。我很困惑,为什么从堆中退出队列时不返回最小值对象(或者如果我向后得到了比较器,则返回最大值,但我得到了两者的中间值)。对于integer的数据类型,优先级队列似乎工作正常,如输出所示 var r = require('js-priority-

我正在尝试为我自己的数据类型使用一个优先级队列,它是一个3x3数组。实际的代码和数据类型更复杂,所以我将其归结为要点。请注意,优先级队列适用于整数数据类型(请参见末尾的输出)。一切都是不言自明的。假设metric函数为给定的3X3数组返回一个正整数。我很困惑,为什么从堆中退出队列时不返回最小值对象(或者如果我向后得到了比较器,则返回最大值,但我得到了两者的中间值)。对于integer的数据类型,优先级队列似乎工作正常,如输出所示

    var r = require('js-priority-queue');



    metric = function (A) {
    N =  A.length;
    if (A[0][1] == 0) return 123;
    if (A[0][1] == 5) return 124;
    if (A[0][1] == 1) return 122;
    if (A[0][1] == 6) return 122;
    return 0;
}


    mComparator = function (m1, m2) {
      ret = metric(m2) - metric(m1);
      return ret;
   }

   mHeap = new r(mComparator);

   nHeap = new r(function (a,b) {
      return b - a;
   })

   A = [[5, 0, 1], [7, 6, 3], [2, 4, 8]];
   B = [[5, 6, 1], [7, 0, 3], [2, 4, 8]];

   C = [[5, 1, 0], [7, 6, 3], [2, 4, 8]];
   D = [[0, 5, 1], [7, 6, 3], [2, 4, 8]];

   console.log("metric(A) -> %d", metric(A));
   console.log("metric(B) -> %d", metric(B));
   console.log("metric(C) -> %d", metric(C));
   console.log("metric(D) -> %d", metric(D));

   mHeap.queue(A);
   mHeap.queue(B);
   mHeap.queue(C);
   mHeap.queue(D);

   X = mHeap.dequeue();
   console.log(X);

   X = mHeap.dequeue();
   console.log(X);

   X = mHeap.dequeue();
   console.log(X);

   X = mHeap.dequeue();
   console.log(X);

   nHeap.queue(123);
   nHeap.queue(124);
   nHeap.queue(122);
   nHeap.queue(122);

   y = nHeap.dequeue();
   console.log(y);


#Output 
metric(A) -> 123
metric(B) -> 122
metric(C) -> 122
metric(D) -> 124
[ [ 5, 0, 1 ], [ 7, 6, 3 ], [ 2, 4, 8 ] ]
[ [ 0, 5, 1 ], [ 7, 6, 3 ], [ 2, 4, 8 ] ]
[ [ 5, 1, 0 ], [ 7, 6, 3 ], [ 2, 4, 8 ] ]
[ [ 5, 6, 1 ], [ 7, 0, 3 ], [ 2, 4, 8 ] ]
122

如果您使用的是adamhooper优先级队列,那么您的问题是没有正确提供比较器。将构造函数调用更改为:

mHeap = new r({"comparator": mComparator});

nHeap = new r({"comparator": function (a,b) {
    return b - a;
}})
你应该开始得到预期的结果请注意,这将提供最大堆数。因为您需要最小堆,所以还应该颠倒比较顺序:

mComparator = function (m1, m2) {
    ret = metric(m1) - metric(m2);
    return ret;
}

mHeap = new r({"comparator": mComparator});

nHeap = new r({"comparator": function (a,b) {
    return a - b;
}})

github项目的首页上给出了正确提供比较器的示例代码,但我发现它很容易被忽略。

当两个最可能的错误源,
js priority queue
实现和
metric
比较函数,没有显示?我使用节点安装安装了js优先级队列。JS是否有标准PQ库?请注意,度量的实现是不需要的,我正在打印它的值,只要值不变,PQ就不应该关心。如果使用整数堆并按该顺序插入123、124、122、122,然后将它们解队列,会发生什么情况?你会得到122、122、123、124(或者相反,如果你正在构建一个最大堆)?如果创建自己的整数比较函数,会发生什么情况?你得到了同样的结果吗?整数堆没有任何问题,它是上面代码片段的一部分。(参见涉及nHeap的代码)我还不确定堆是否可以正常工作。您的测试不会对重复的项目排队。您需要验证它是否与您提供给另一个测试的输入相同:123、124、122、122。