Heap如何知道要排序的内容?

时间:2017-11-21 03:41:47

标签: javascript sorting heap priority-queue heapsort

如果这个问题听起来很模糊,我道歉。我目前正在使用Javascript来创建A *寻路算法。我有一个对象列表,每个对象都有一个属性 f ,我想使用minheap数据结构对列表进行排序。

我不明白的是如何修改基于排序的内容。我提到的对象有多个属性,例如 h g 。有没有我不知道的记号?我使用npm下载了heap package

到目前为止我所拥有的是:

var Heap = require('heap');
var heap = new Heap();
.
.
.
heap.push(start) // start is an object, specifically a Cell inside a grid

if(!heap.empty){
  // where I am having trouble
}

我试图替换的代码(出于性能原因)是:

var winner = 0;
for (var i = 0; i < openSet.length; i++) {
    if (openSet[i].f < openSet[winner].f) {
        winner = i;
    }
}

我很感激任何指导。谢谢。

1 个答案:

答案 0 :(得分:1)

看一下文档,它说如果没有比较函数通过构造函数传递,那么使用的数据结构是min-heap。如果要传入函数,则将根据该函数构建堆。

来自https://www.npmjs.com/package/heap

  

构造函数接收比较函数作为可选参数。如果省略,则将堆构建为最小堆,这意味着将首先弹出最小的元素。

  

如果提供了比较功能,则将根据比较函数的返回值构建堆。

看起来像这样的比较功能&#34;与JavaScript .sort()非常相似。使用JavaScript .sort(),您传入一个比较两个值的函数,并根据条件返回-1,1或0.这些返回值确定元素A的索引是否将转到用元素B向上或向下移动,反之亦然。

来源:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort

另外,查看您的if(!heap.empty)需要if(!heap.empty())的文档。

修改

以下是堆文档中的示例排序/比较函数。它只是组织从最小到最大的数字。

function cmp(a, b) {
    return a - b;
}