Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 跟踪我在迷宫中进入的细胞的最佳数据结构是什么_Java_Data Structures_Hashmap_Depth First Search - Fatal编程技术网

Java 跟踪我在迷宫中进入的细胞的最佳数据结构是什么

Java 跟踪我在迷宫中进入的细胞的最佳数据结构是什么,java,data-structures,hashmap,depth-first-search,Java,Data Structures,Hashmap,Depth First Search,下面是我现在如何使用HashMap实现这一点 private int steps=0; private LinkedList<MazeCell> breadCrumbs = new LinkedList<MazeCell>(); private HashMap<MazeCell, Boolean> visitedCells = new HashMap<MazeCell, Boolean>(); public int stepsToSolveMaze

下面是我现在如何使用HashMap实现这一点

private int steps=0;
private LinkedList<MazeCell> breadCrumbs = new LinkedList<MazeCell>();
private HashMap<MazeCell, Boolean> visitedCells = new HashMap<MazeCell, Boolean>();
public int stepsToSolveMaze(MazeCell cell)
{       
    if (visitedCells.get(cell) == null)
    {
        visitedCells.put(cell, true);
        breadCrumbs.push(cell);
    }       
private int steps=0;
私有LinkedList breadCrumbs=新LinkedList();
私有HashMap visitedCells=新HashMap();
公共int stepsToSolveMaze(MazeCell单元)
{       
if(visitedCells.get(cell)==null)
{
visitedCells.put(cell,true);
面包屑。推(细胞);
}       

我使用递归算法来计算迷宫结束时的步数。在我尝试进行下一步之前我需要确保我没有到过我要去的地方。我觉得除了我去过的地方之外,有一个比满是null的HashMap更好的数据结构,但我真的不知道。有人知道更好的数据结构吗?

而不是
HashMap
,你应该使用a。代码会更容易阅读。p性能是等效的,因为
哈希集
哈希映射
支持

private int steps=0;
私有LinkedList breadCrumbs=新LinkedList();
private Set visitedCells=new HashSet();
公共int stepsToSolveMaze(MazeCell单元)
{       
如果(!visitedCells.contains(单元格))
{
visitedCells.add(单元格);
面包屑。推(细胞);
}   
}

HashSet
为基本操作提供恒定的时间性能。

当前的设计是可以的。如果单元格的数量是固定的,您可以将单元格保存在数组中,并使用位向量表示访问过的单元格。例如,32位整数可以表示32个单元格。

使用
布尔[][]
用于整个矩阵

如果你不是在处理太大的矩阵,我可能会选择这个选项

1000x1000没有那么大,整个矩阵将占用大约1 MB的存储空间()

读/写的开销应该比使用散列要小。注意,如果你的散列函数不好,那么散列的性能可能会很糟糕。2D数组解决方案没有这个缺点

存储密集度较低的解决方案是
位集[]
,对于1000x1000矩阵,它的存储容量约为125 KB

请注意,在任何一种情况下(
boolean[]
BitSet
都可以为空)都可以使用
null
值,其中行/列为空(取决于实现),以进一步减少存储空间

免责声明:以上数字只是估计值,我忽略了一些事情。

这是实现这种数据结构最有效的方法

简而言之,你要做的是创建一个代表迷宫的二维整数数组。数组中的每一行和每一列都是迷宫中的x,y坐标。坐标位置上的值将表示它所在的“集合”

因此,在您的情况下,如果您访问了一个位置,请在该位置输入1


因此,如果不访问坐标,它将包含0。

我认为集合是一个不错的选择。迷宫中有循环吗?读过之后我会同意,但我选择HashMap是因为假设迷宫是1000x1000,我可以在一个相对恒定的时间内知道我是否去过那里,因为我有一个答案的钥匙在,而不是必须遍历整个列表。然后我读了更多,看到了HashSet,它使用HashMap来完成我正在做的事情,但更漂亮!谢谢!@BrandonRossPollack您可以使用方法set.contains(“某物”);以检查您是否已经访问了该节点。Graph data struct听起来是最适合您的结构。非常感谢,第一个评论said Set的人,所以我查找了实现它的哈希类型,并找到了相同的解决方案!你们帮了大忙!我很高兴帮助您。如果它解决了您的问题,您应该接受这个答案。您的q问题将显示为已回答。
private int steps=0;
private LinkedList<MazeCell> breadCrumbs = new LinkedList<MazeCell>();
private Set<MazeCell> visitedCells = new HashSet<MazeCell>();
public int stepsToSolveMaze(MazeCell cell)
{       
    if (!visitedCells.contains(cell))
    {
        visitedCells.add(cell);
        breadCrumbs.push(cell);
    }   
}