为了账号安全,请及时绑定邮箱和手机立即绑定

CouchDB 图形中的最短路径

CouchDB 图形中的最短路径

缥缈止盈 2021-06-16 13:01:56
我正在尝试计算存储在 CouchDB 中的图形中的最短路径。我必须在 db 中执行此操作,因为我的任务是比较 3 种不同 DBMS 在各种情况下的查询速度。因此,在 python(或其他任何东西)中加载数据和运行 dijkstra 不是一种选择。我对基于文档的数据库很陌生,所以我可能错了,但在我看来,我唯一的选择是视图。我的数据库结构如下:一份文件代表一张图。在带有“边缘”键的文档中,有一组具有 3 个属性的对象:开始、结束、距离。start和end是节点 ID,但没有关于节点的其他有趣信息,因此它们不会存储在其他任何地方。距离是一个浮动我的想法是创建一个返回最短路径的视图。我有计算它的代码。它基于这篇文章。我只需要稍微修改一下,否则我会遇到像let,foreach这样的语法错误:function (doc) {  function Graph() {    this.nodes = [];    this.adjacencyList = {};    this.addNode = function(node) {      if(this.nodes.indexOf(node) != -1)        return;      this.nodes.push(node);       this.adjacencyList[node] = [];    }    this.addEdge = function(node1, node2, weight) {      this.adjacencyList[node1].push({node:node2, weight: weight});      //this.adjacencyList[node2].push({node:node1, weight: weight});    }    this.shortestPath = function(startNode, endNode){      var times = {};      var backtrace = {};      var pq = new PriorityQueue();      times[startNode] = 0;      for(var i = 0; i<this.nodes.length; i++){        if(this.nodes[i] != startNode){          times[node] = Infinity;        }      }      pq.enqueue([startNode, 0]);      while (!pq.isEmpty()) {        var shortestStep = pq.dequeue();        var currentNode = shortestStep[0];        for(var i=0;i< this.adjacencyList[currentNode].length; i++){          var neighbor = this.adjacencyList[currentNode][i];          var time = times[currentNode] + neighbor.weight;          if (time < times[neighbor.node]) {            times[neighbor.node] = time;            backtrace[neighbor.node] = currentNode;            pq.enqueue([neighbor.node, time]);          }        }      }      var path = [endNode];      var lastStep = endNode;      while(lastStep !== startNode) {        path.unshift(backtrace[lastStep]);        lastStep = backtrace[lastStep];      }      return 'Path is ${path} and time is ${times[endNode]}';    }  };但是,在查询视图时,我得到 0 行。
查看完整描述

1 回答

?
慕的地8271018

TA贡献1796条经验 获得超4个赞

终于我找到了。当我将 foreach 重写为传统的 for 时,我忘记更改了:


for(var i = 0; i<this.nodes.length; i++){

    if(this.nodes[i] != startNode){

      times[node] = Infinity;

    }

}

对此:


for(var i = 0; i<this.nodes.length; i++){

   if(this.nodes[i] != startNode){

      times[this.nodes[i]] = Infinity;

   }

}

有趣的是,我在 CouchDB 中没有看到任何错误。我必须使用 node.js 在本地运行我的代码才能发现有错误。


查看完整回答
反对 回复 2021-06-18
  • 1 回答
  • 0 关注
  • 117 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信