当前位置: 首页 > 知识库问答 >
问题:

如何将网格中单元格的邻居存储到优先级队列中

强宾白
2023-03-14

假设我有一个4乘4的网格,所以有16个单元格。每个单元格包含一个介于1,5之间的值。如。

     0 1 2 3
     _ _ _ _
0 - |2|1|3|2|
1 - |1|3|5|1|
2 - |5|2|1|4|
3 - |2|4|2|1|

现在我知道我需要使用Dijkstra算法。为了优化这一点,我需要使用优先级队列。

我的目标是找到到达目的地的每个单元格的最短总和。源在网格上可以是随机的,目标也可以是随机的。(即并非总是从左上到右下)。

我曾经研究过使用邻接矩阵的图。但是,使用此网格创建相邻矩阵是否明智?i、 e.将所有非相邻字段设置为无穷大。将单元格插入优先级队列的最充分方式是什么?是{(行,列),距离}吗?

我的理解是,优先级队列将存储最佳路径?所以细胞和累积距离。因为,Dijstra的算法使用BFS,在这种情况下,BFS将搜索所有邻居的最短距离。

共有1个答案

方飞白
2023-03-14

使'Node'类具有3个字段(行,列,距离)并实现可比。然后使用使用PriorityQueue

import java.util.PriorityQueue;

class Main {

    public static void main(String[] args) {
        PriorityQueue<Node> pq = new PriorityQueue<>();
        pq.add(new Node(2, 3, 12));
        pq.add(new Node(0, 9, 1));
        pq.add(new Node(4, 0, 8));

        System.out.println(pq.poll().getDistance()); //prints 1
    }
}

class Node  implements Comparable<Node>{

    private final int row, col, distance;

    public Node(int row, int col, int value) {
        this.row = row;
        this.col = col;
        distance = value;
    }

    int getDistance() {
        return distance;
    }

    @Override
    public int compareTo(Node other) {
        return Integer.compare(distance, other.distance);
    }
}

或者,将一个Comperator设置到优先级队列,这样节点就不必实现compariable

import java.util.PriorityQueue;

class Main {

    public static void main(String[] args) {
        PriorityQueue<Node> pq = new PriorityQueue<>(Node::compare);
        pq.add(new Node(2, 3, 12));
        pq.add(new Node(0, 9, 1));
        pq.add(new Node(4, 0, 8));

        System.out.println(pq.poll().getDistance()); //prints 1
    }
}

class Node{

    private final int row, col, distance;

    public Node(int row, int col, int value) {
        this.row = row;
        this.col = col;
        distance = value;
    }

    int getDistance() {
        return distance;
    }

    public static int compare(Node o1, Node o2) {
        return Integer.compare(o1.getDistance(), o2.getDistance());
    }
}

您还可以使用lambda表达式设置comperator:

PriorityQueue

这三个选项都有效。

 类似资料:
  • 我需要一个优先级队列,它首先获得具有最高优先级值的项目。我当前正在使用队列库中的PriorityQueue类。但是,这个函数只先返回值最小的项。我尝试了一些很难看的解决方案,比如(sys.maxint-priority)作为优先级,但我只是想知道是否存在更优雅的解决方案。

  • 我试图实现Dijkstra算法的一个版本,以找到公共汽车从起点到终点的最短路线。不幸的是,我似乎找不到swift提供优先级队列类型的库或其他方式,所以我似乎必须自己编写代码。 话虽如此,有人能指出我做这件事的正确方向吗? 目前我的想法如下: 到目前为止这是我的代码。似乎太短太残忍了...我一定是在概念上漏掉了什么。

  • 我正在尝试在滑动窗口中打印最大值。将窗口大小的元素,这里k=3放入优先级队列(Maxheap),然后查看值。”heap.Init(

  • 我的代码有一个特殊的问题。 然后它会发生在图像上出现的事情。我需要汉字列是CENTER对齐,但出于某种原因,'tcr,不工作,因为它应该是,但默认渲染器正在做它应该是。 有什么建议/帮助吗?

  • 问题内容: 在Python文档中, 最低值的条目首先被检索(最低值的条目是由返回的条目)。条目的典型模式是形式为的元组。 看来队列将按优先级排序,然后按数据排序,这可能并不总是正确的。假设数据“项目2”在“项目1”之前入队,则项目1仍将排在第一位。在另一个文档页面heapq中,它建议使用计数器。所以我将数据存储为。是否没有类似的东西 那我就不需要自己执行订购吗? 问题答案: 据我所知,您要找的东西

  • 我目前正在使用作为用户交互界面网格,它运行良好。但是,我想启用水平滚动。网格每页支持8个项目,当项目总数为4个时,这是启用水平滚动方向时应该如何排列项目: 这里0 - 有没有办法让它们像这样居中对齐: 这样内容看起来更干净? 下面的安排也可能是我期待的一个解决方案。