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

优先队列插入键值对

慕容坚
2023-03-14

我试图在O(mlogn)时间内对Dijkstra算法进行编码,其中m是边数,n是节点数。我用它来查找给定起始节点和给定结束节点之间的最短路径。我对这个很陌生。

假设图由邻接矩阵表示,每个节点都有一个行索引。

Initialize starting node distance to zero, and all other nodes to inifinity, in the heap.

Create a list of shortest paths, equal to the number of nodes in the graph, set to 0.

While the index of the node that corresponds to the minimum element in the heap 
has no value in the list of shortest paths and heap has node distances, do:
    Remove the minimum node distance from the heap, and bubble as necessary to fill the removed node.
    Put the minimum node distance into the list of shortest paths at its row index.

    For all nodes that were adjacent to the node with the minimum distance (that was just removed), do:
      Update the distances in the heap for the current node, using the following calculation:
        min((deleted node distance + adjacent edge weight), current node's distance)
    Reorganize the heap to be a minimum heap.

Return value in the list of shortest paths at the location of the end node.

这是O(mlogn),因为每个边只更新一次距离。

“初始化堆需要线性时间,然后执行m次更新,每次更新的代价为O(log n),总时间为O(mlog n)。”-http://www.cs.cmu.edu/~avrim/451f07/lectures/lect1011.pdf

这必须在一个具有特定名称的文件中完成(即,根据我的理解,我不能创建一个KeyValuePair类来实现Comparator)。

我很想听听你的想法。

共有1个答案

邓德本
2023-03-14

我正在解决同样的问题。我知道你在哪里可以找到你问题的答案。这是一本很棒的书,有代码算法的例子,由罗伯特·塞奇威克和凯文·韦恩出版的第四版。

站点手册和代码示例(包括使用PriorityQueue实现Dijkstra算法)Dijkstra算法的这个实现不使用Java的标准PriorityQueue实现。相反,它实现了IndexMinPQ,这在本书的前面已经讨论过,并有详细的解释!

 类似资料:
  • 问题内容: 我正在尝试根据文档中提供的示例实现优先级队列。文件:priorityQueue 简而言之,它看起来像这样(不包括所有内容): 该文件中: 如您所见,在与示例进行比较时,我不使用指针,因为这样做会给我一个编译错误,告诉我我的优先级队列未正确实现接口。 这会给我带来以下问题: 该项目未附加到队列中。 我试图写出队列指针地址,它显示了不同的地址。这就解释了为什么它不起作用,但是切片不是地图长

  • 注意:我知道可以用比较器创建优先级队列,然后重复调用Add。

  • 考虑下面的优先级类声明<代码>类优先级队列 我的想法: 我能想到的一件事是,这将强制优先级队列使用对象比较器,并且不会提供实现其自定义比较器的能力,因为类的用户可能希望基于某个不同的比较器构建队列。

  • 简介 举个例子。我有一个用户表,这个表根据用户名被Hash到不同的数据库实例上,我要找出这些用户中最热门的5个,怎么做?我是这么做的: 在每个数据库实例上找出最热门的5个 将每个数据库实例上的这5条数据按照热门程度排序,最后取出前5条 这个过程看似简单,但是你应用服务器上的代码要写不少。首先需要Query N个列表,加入到一个新列表中,排序,再取前5。这个过程不但代码繁琐,而且牵涉到多个列表,非常

  • 优先级队列(Priority Queue) 注:队列是一种特征为FIFO的数据结构,每次从队列中取出的是最早加入队列中的元素。但是,许多应用需要另一种队列,每次从队列中取出的应是具有最高优先权的元素,这种队列就是优先级队列(Priority Queue),也称为优先权队列。 1. 优先级队列的概念 1.1 优先级队列的定义 优先级队列是不同于先进先出队列的另一种队列。每次从队列中取出的是具有最高优

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