1

我带着一个新问题来到这里。

我正在制作一个自定义算法,需要为图形边缘预先计算数据。我像这样使用 AllEdgesIterator:

AllEdgesIterator it = graph.getAllEdges();
int nbEdges = it.getCount();
int count = 0;

int[] myData = new int[nbEdges];

while (it.next())
{
    count++;
    ...
}

第一个奇怪的事情是 nbEdges 等于 15565 个边,但 count 只等于 14417。这怎么可能?

第二个奇怪的事情是当我运行我的自定义 A* 时:我只是使用 outEdgeExplorer 浏览节点,但我在 myData 数组的索引 15569 处得到一个 IndexOutOfBound。我认为边缘索引包含在 [0 ; N-1] 其中 N 是边数,真的是这样吗?

这里会发生什么?顺便说一句,我禁用了图形收缩层次结构。

谢谢你每次都这么快回答!

4

1 回答 1

1

第一个奇怪的事情是 nbEdges 等于 15565 个边,但 count 只等于 14417。这怎么可能?

这是因为删除了无法访问的子网的“压缩”,但目前仅从图中删除了节点,边只是断开连接并留在标记为已删除的边-“数组”中。所以iter.getCount只是一个上限,但AllEdgeIterator在迭代时正确排除了这些未使用的边缘并具有正确的计数。但是使用iter.getCount分配您的自定义数据数组是正确的做法。

关于第二个问题:这可能是因为QueryGraph引入了具有更大 edgeId as 的新虚拟边iter.getCount。根据具体情况,有不同的解决方案,例如仅排除或使用原始边缘等

于 2015-06-23T20:37:31.483 回答