【发布时间】:2021-10-13 16:11:27
【问题描述】:
我正在为广度优先搜索开发一个寻路可视化工具,该算法在“开始”和“结束”相距大约 15 个单位时有效,但之后它要么需要很长时间才能计算,要么就是无法工作。我认为我的代码可能效率低下,但我对如何修复它感到困惑。非常感谢任何帮助。
这是我现在用于 BFS 的 JavaScript 代码,它使用 id 来定位表中的节点:
var start = document.getElementsByClassName("start")[0];
let q = new Queue();
q.enqueue(start);
while(!q.isEmpty()){
var x = q.dequeue();
var row = parseInt(x.id.split('-')[0]);
var col = parseInt(x.id.split('-')[1]);
//go up
if((row-1)>=0){
var u = document.getElementById((row-1)+"-"+col);
if(u.className=="end"){
break;
}else if(u.className!="start" || u.className!="visited"){
u.className="visited";
q.enqueue(u);
}
}
//go down
if((row+1)<=20){
var d = document.getElementById((row+1)+"-"+col);
if(d.className=="end"){
break;
}else if(d.className!="start" || d.className!="visited"){
d.className="visited";
q.enqueue(d);
}
}
//go right
if((col+1)<=50){
var r = document.getElementById(row+"-"+(col+1));
if(r.className=="end"){
break;
}else if(r.className!="start" || r.className!="visited"){
r.className="visited";
q.enqueue(r);
}
}
//go left
if((col-1)>=0){
var l = document.getElementById(row+"-"+(col-1));
if(l.className=="end"){
break;
}else if(l.className!="start" || l.className!="visited"){
l.className="visited";
q.enqueue(l);
}
}
【问题讨论】:
-
什么是
Queue,它可以防止重复插入吗?因为您不应该将已经访问过的节点排入队列。 -
@Bergi 好的,我更新了代码以不添加重复项,但问题仍然存在。如果末端节点太远,算法就会失败。
-
你需要
if(l.className!="start" && l.className!="visited"),而不是||。或if(!(l.className=="start" || l.className=="visited")). -
@Bergi Ohhhh,非常感谢!它有效。
标签: javascript html breadth-first-search path-finding