【问题标题】:What is the best data structure for keeping track of Cells I have entered in a maze跟踪我在迷宫中输入的单元格的最佳数据结构是什么
【发布时间】:2013-03-18 15:08:32
【问题描述】:

这是我现在使用 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);
    }       

我正在使用递归算法来查找迷宫终点的步数。在我尝试迈出下一个“步骤”之前,我需要确保我没有去过我要迈出的地方。我觉得除了我去过的地方之外,还有比充满空值的 HashMap 更好的数据结构,但我真的不知道。有谁知道更好的数据结构吗?

【问题讨论】:

  • 我觉得 Set 是不错的选择。
  • 迷宫中有环路吗?
  • 我会在阅读后同意,但我选择 HashMap 是因为假设迷宫是 1000x1000,我可以在相对恒定的时间内知道我是否去过那里,因为我会有一个答案,而不是遍历整个列表。然后我阅读了更多内容,看到了 HashSet,它使用 HashMap 来做我正在做的事情,但更漂亮!谢谢!
  • @BrandonRossPollack 您可以使用方法 set.contains("something");检查您是否已经访问过该节点。
  • 图形数据结构听起来是最适合您的结构。

标签: java data-structures hashmap depth-first-search


【解决方案1】:

您应该使用HashSet,而不是HashMap。代码会更容易阅读。由于HashSetHashMap&lt;E,Object&gt; 支持,因此性能相当。

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);
    }   
}

一个HashSet offers constant time performance for the basic operations.

【讨论】:

  • 非常感谢,第一个评论的人说 Set,所以我查找了实现它的 Hash 类型并得出了相同的解决方案!你们帮了大忙!
  • 很高兴为您提供帮助。如果它解决了你的问题,你应该接受这个答案。您的问题将显示为已回答。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    为整个矩阵设置一个boolean[][] 怎么样?

    如果您不处理太大的矩阵,我可能会选择此选项。

    1000x1000 不是那么大,整个矩阵会占用大约 1 MB 的存储空间 (implementation dependent)。

    读/写的开销应该小于使用散列。还需要注意的是,如果散列函数不好,散列的性能可能会很糟糕。二维数组解决方案没有这个缺点。

    存储密集度较低的解决方案是BitSet[],1000x1000 矩阵的存储空间约为 125 KB。

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

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

    【讨论】:

      【解决方案4】:

      Disjoint Set

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

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

      因此,如果您访问过某个位置,则在该位置放置 1。

      所以如果坐标没有被访问,它将包含 0。

      【讨论】:

        猜你喜欢
        • 2023-03-20
        • 2011-05-31
        • 2011-01-04
        • 1970-01-01
        • 1970-01-01
        • 2012-07-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多