编辑元素时 Java 优先级队列重新排序

2024-02-25

我正在尝试实现 Dijkstra 算法,以使用优先级队列查找最短路径。在算法的每一步中,我都会从优先级队列中删除距离最短的顶点,然后更新优先级队列中其每个邻居的距离。现在我读到,当您编辑 Java 中的优先级队列中的元素(确定排序的元素)时,它不会重新排序,因此我尝试通过插入和删除虚拟顶点来强制它重新排序。但这似乎不起作用,我一直在试图弄清楚。

这是顶点对象和比较器的代码

class vertex {
    int v, d;
    public vertex(int num, int dis) {
        v=num;
        d=dis;
    }
}

class VertexComparator implements Comparator {
    public int compare (Object a, Object b) {
        vertex v1 = (vertex)a;
        vertex v2 = (vertex)b;
        return v1.d-v2.d;
    }
 }

这是我运行算法的地方:

    int[] distances=new int[p];
    Comparator<vertex> comparator = new VertexComparator();
    PriorityQueue<vertex> queue = new PriorityQueue<vertex>(p, comparator);
    for(int i=0; i<p; i++) {
        if(i!=v) {
            distances[i]=MAX;
        }
        else {
            distances[i]=0;
        }
        queue.add(new vertex(i, distances[i]));
    }
    // run dijkstra
    for(int i=0; i<p; i++) {
        vertex cur=queue.poll();
        Iterator itr = queue.iterator();
        while(itr.hasNext()) {
            vertex test = (vertex)(itr.next());
            if(graph[cur.v][test.v]!=-1) {
                test.d=Math.min(test.d, cur.d+graph[cur.v][test.v]);
                distances[test.v]=test.d;
            }
        }
        // force the PQ to resort by adding and then removing a dummy vertex
        vertex resort = new vertex(-1, -1);
        queue.add(resort);
        queue.remove(resort);
    }

我已经运行了几个文本案例,并且我知道每次我检查并更新顶点距离时优先级队列都没有正确重新排序,但我不知道为什么。我在某个地方犯了错误吗?


正如您所发现的,每当添加或删除元素时,优先级队列不会重新排序所有元素。这样做会太昂贵(记住比较排序的 n log n 下限),而任何合理的优先级队列实现(包括PriorityQueue) 承诺在 O(log n) 内添加/删除节点。

事实上,它根本不对其元素进行排序(这就是为什么它的迭代器不能承诺按排序顺序迭代元素)。

PriorityQueue不提供 api 来通知它有关更改的节点,因为这需要它提供有效的节点查找,而其底层算法不支持。实现一个优先级队列是相当复杂的。这维基百科关于优先级队列的文章 http://en.wikipedia.org/wiki/Priority_queue#Effect_of_different_data_structures可能是阅读相关内容的一个很好的起点。不过,我不确定这样的实现会更快。

一个简单的想法是删除然后添加更改的节点。做not这样做remove()需要 O(n)。相反,将同一节点的另一个条目插入到 PriorityQueue 中,并在轮询队列时忽略重复项,即执行以下操作:

PriorityQueue<Step> queue = new PriorityQueue();

void findShortestPath(Node start) {
    start.distance = 0;
    queue.addAll(start.steps());

    Step step;
    while ((step = queue.poll()) != null) {
        Node node = step.target;
        if (!node.reached) {
            node.reached = true;
            node.distance = step.distance;
            queue.addAll(node.steps());
        }
    }

}

编辑:不建议更改 PQ 中元素的优先级,因此需要插入Steps 而不是Nodes.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

编辑元素时 Java 优先级队列重新排序 的相关文章

  • 方法返回类型前的 是什么意思?

    下面的方法返回一个List组成T类型元素 public
  • Jackson JSON + Java 泛型

    我正在尝试将以下 JSON 反序列化 映射到List
  • 使用 proguard 混淆文件名

    我正在使用 proguard 和 Android Studio 混淆我的 apk 当我反编译我的apk时 我可以看到很多文件 例如aaa java aab java ETC 但我项目中的所有文件都有原始名称 有没有办法混淆我的项目的文件名
  • 在不支持 CAS 操作的处理器上进行 CompareAndSet

    今天 我在一次采访中被问到下一个问题 如果您在具有不支持 CAS 操作的处理器的机器上调用 AtomicLong 的compareAndSet 方法 会发生什么情况 您能否帮我解决这个问题 并在可能的情况下提供一些全面描述的链接 From
  • 以相反的顺序打印任何集合中的项目?

    我在 使用 Java 进行数据结构和问题解决 一书中遇到以下问题 编写一个例程 使用 Collections API 以相反的顺序打印任何 Collection 中的项目 不要使用 ListIterator 我不会把它放在这里 因为我想让有
  • Java LostFocus 和 InputVerifier,按反向制表符顺序移动

    我有一个 GUI 应用程序 它使用 InputVerifier 在产生焦点之前检查文本字段的内容 这都是很正常的 然而 昨天发现了一个问题 这似乎是一个错误 但我在任何地方都找不到任何提及它的地方 在我将其报告为错误之前 我想我应该问 我在
  • 查看Java Agent修改的Java类的源代码

    我需要了解 Java 代理如何修改我的初始类 以便我能够理解代码的作用 build gradle configurations jar archiveName agent2 jar jar manifest attributes Prema
  • 通过Zuul上传大文件

    我在通过 zuul 上传大文件时遇到问题 我正在使用 apache commons 文件上传 https commons apache org proper commons fileupload https commons apache o
  • 有人用过 ServiceLoader 和 Guice 一起使用吗?

    我一直想通过我们的应用程序 构建系统进行更大规模的尝试 但更高的优先级不断将其推到次要地位 这似乎是加载 Guice 模块的好方法 并且避免了关于 硬编码配置 的常见抱怨 单个配置属性很少会自行更改 但您几乎总是会有一组配置文件 通常用于不
  • 什么是内部类的合成反向引用

    我正在寻找应用程序中的内存泄漏 我正在使用的探查器告诉我寻找这些类型的引用 但我不知道我在寻找什么 有人可以解释一下吗 Thanks Elliott 您可以对 OUTER 类进行合成反向引用 但不能对内部类实例进行合成 e g class
  • ThreeTen 向后移植与 JSR-310 的比较

    由于某些原因 我们现在无法使用 java 8 我们仍然停留在 java 7 上 不过 我想使用新的JSR 310 date time APIs现在 使用官方向后移植 ThreeTen http www threeten org threet
  • 在 Spring 中为 @Pathvariable 添加类级别验证

    在发布这个问题之前 我已经做了很多研究并尝试了很多可用的解决方案 这是我陷入的棘手情况 我有一个 Spring 控制器 它有多个请求映射 它们都有 PathVariables 控制器如下所示 Controller EnableWebMvc
  • 使用 JDBC 连接到 PostgreSql 的本地实例

    我在 Linux 机器上有一个正在运行的 PostgreSql 本地实例 当我使用psql来自 shell 的命令我成功登录 没有任何问题 我需要通过 JDBC 连接到 PostgreSql 但我不知道我到底应该传递什么url参数为Driv
  • 为什么解析这个 JSON 会抛出错误?

    我正在尝试解析这个 JSONObject query yahoo count 1 results rate Name USD INR id USDINR Time 12 19pm Date 10 31 2015 Bid 65 405 Ask
  • Java 8 Stream,获取头部和尾部

    Java 8 引入了Stream http download java net jdk8 docs api java util stream Stream html类似于 Scala 的类Stream http www scala lang
  • 从三点求圆心的算法是什么?

    我在圆的圆周上有三个点 pt A A x A y pt B B x B y pt C C x C y 如何计算圆心 在Processing Java 中实现它 我找到了答案并实施了一个可行的解决方案 pt circleCenter pt A
  • 如何向页面添加 HTML 页眉和页脚?

    如何使用 itext 从 html 源添加标题到 pdf 目前 我们已经扩展了 PdfPageEventHelper 并重写了这些方法 工作正常 但当我到达 2 个以上页面时 它会抛出 RuntimeWorkerException Over
  • Azure Java SDK:ServiceException:ForbiddenError:

    尝试了基本位置检索器代码 如下所示 String uri https management core windows net String subscriptionId XXXXXXXX 5fad XXXXXX 9dfa XXXXXX St
  • java实现excel价格、收益率函数[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 即使禁用安全性,OAuth 令牌 API 也无法在 Elastic Search 中工作

    我是 Elastic search 新手 使用 Elastic search 版本 7 7 1 我想通过以下方式生成 OAuth 令牌弹性搜索文档 https www elastic co guide en elasticsearch re

随机推荐

  • Asp.Net MVC + CSLA + DDD 可能吗

    前几天 我被要求审查一个基于 ASP NET MVC CSLA DDD 域驱动设计 的系统 该系统的第一个版本是基于ASP NET MVC CSLA 第二个版本是在此基础上添加了 DDD 原因是 嗯 我不知道是什么 当我查看两种不同架构的图
  • Anaconda Navigator 无法创建新环境

    我在工作中需要使用Python 今天刚刚安装了Anaconda Navigator 我可以毫无问题地打开 Navigator GUI 我可以打开 创建新环境 提示 我填写详细信息并点击 确定 导航器在基本 根 选项卡下为我请求的环境创建一个
  • 由于 gcc 编译器版本不受支持,Caffe 编译失败

    我挣扎着Caffe http caffe berkeleyvision org 汇编 不幸的是我没能编译它 Steps http caffe berkeleyvision org installation html cmake compil
  • 单击后防止 JButton repaint()

    我有一个按钮 我想在点击后更改背景 我的问题是按钮自动呼叫paintComponent 如何防止这种情况发生 我预计点击按钮后按钮将是蓝色的 但它仍然是红色的 package test import java awt Color impor
  • 使用 TI-MSP430 的 DSP 的 C/C++ 库或示例代码

    我正在开发一个小型 dsp 项目 进行音频处理 例如 奈奎斯特速率采样 过采样和欠采样 重建 该项目是使用我的板实时嵌入的 我当前使用的板 芯片是德州仪器 TI 的 msp430 系列 MSP430F5438 实验板http focus t
  • 获取目录时出现 System.UnauthorizedAccessException

    我对 C 非常陌生 所以我一直在从事一个小型宠物项目 我创建了一个小程序 用于将目录的大小与给定的大小进行比较 如果该目录相同或更大 则会记录该目录的路径 long size Convert ToInt32 Size 1024 1024 s
  • 来自 JSON 对象的动态 UI

    我正在尝试找到一种将动态 JSON 对象转换为有效 HTML 网页的方法 这个想法是能够将需要显示的内容从物联网设备推送到云端 并让用户能够输入和保存配置 json 看起来像这样 loginConfiguration username st
  • Groovy 的隐藏功能?

    Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案或互动 看起来 Groovy 在这个线程中被遗忘了 所以我只会向 Groovy 问同样的问题 尝试限制
  • 有没有办法让客户端脚本也从 Ara 框架中的代理/集群服务自动加载?

    首先 基于 SSR 的 MFE 的一个很棒的框架 我正在尝试 Ara Svelte Micro App1 Vue Micro App 2 Nuxt JS Appshell 如中所述https ara framework github io
  • C 字符串:简单问题

    我在下面初始化了三个变量 char c1 Hello char c2 H e l l o 0 char c3 Hello 我知道 c1 和 c2 是相同的 并且它们都是字符串 因为它们以 0 结尾 然而 c3与c1和c2不同 这是因为 c3
  • Infiniband 寻址 - 主机名到 IB 地址(无需 IBoIP)

    我刚刚开始熟悉 infiniband 我想了解可用于解决 infiniband 节点的方法 基于代码的示例来自 RDMA 使用 IB 动词进行读写 http thegeekinthecorner wordpress com 2010 09
  • 如何使用 linq 从 DataTable 中过滤掉空行?

    我有一个从 Excel 数据构建的数据表 但有时 Excel 返回的行中所有字段都为空 我想一般性地过滤掉这些 而不考虑列名 我认为 Linq 可以很好地做到这一点 但要实现这一点有点困难 到目前为止 这就是我得到的 var nonempt
  • 如何在浏览器中从Go服务器下载文件

    我的代码从远程 url 获取文件并在浏览器中下载文件 func Index w http ResponseWriter r http Request url http upload wikimedia org wikipedia en b
  • iPhone 配置实用程序无法识别 iOS 8 设备

    随着 iOS 8 最近的更新 我无法使用 iPhone 配置实用程序加载我的测试设备 该程序根本无法识别装有 iOS 8 的设备 当 iOS 7 发布时 iPCU 不需要更新 尽管它确实可以与 iOS 7 配合使用 Apple 支持网站上的
  • 批处理文件对多个目录中的所有文件执行命令

    我想制作一个运行此命令的批处理文件 C Program Files x86 IrfanView i view32 exe C Users digi admin TIFFs OLD DIRECTORY tif ini C Users digi
  • Visual Studio:如何中断已处理的异常?

    我希望 Visual Studio 在发生处理的异常时中断 即我不只是想看到 第一次机会 消息 我想调试实际的异常 例如我希望调试器在异常时中断 try System IO File Delete someFilename catch Ex
  • C 中的结构初始化出现错误:预期表达式

    我有一个这样的结构 struct foobar int i char word 我知道这会起作用 struct foobar int i char word struct foobar three 3 three 为什么以下不起作用 str
  • 始终块中的 Veriloggenerate/genvar

    我试图让一个模块通过 ISE 12 4 中的语法检查 但它给了我一个我不明白的错误 首先是代码片段 parameter ROWBITS 4 reg ROWBITS 1 0 temp genvar c generate always pose
  • IntelliJ 社区版中的 Spring Boot 项目

    我是 IntelliJ 社区版的新手 任何人都可以帮助我在 IntelliJ 社区版中创建 Spring Boot 项目 对于终极版 有 spring boot 初始化程序 但我找不到社区版的任何内容 我点击了此链接但找不到任何解决方案 使
  • 编辑元素时 Java 优先级队列重新排序

    我正在尝试实现 Dijkstra 算法 以使用优先级队列查找最短路径 在算法的每一步中 我都会从优先级队列中删除距离最短的顶点 然后更新优先级队列中其每个邻居的距离 现在我读到 当您编辑 Java 中的优先级队列中的元素 确定排序的元素 时