Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.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的内置迭代器';s PriorityQueue不会以任何特定顺序遍历数据结构。为什么?_Java_Priority Queue - Fatal编程技术网

java的内置迭代器';s PriorityQueue不会以任何特定顺序遍历数据结构。为什么?

java的内置迭代器';s PriorityQueue不会以任何特定顺序遍历数据结构。为什么?,java,priority-queue,Java,Priority Queue,这直接来自于: 此类及其迭代器实现集合和迭代器接口的所有可选方法在方法迭代器()中提供的迭代器不能保证以任何特定顺序遍历优先级队列的元素。如果需要有序遍历,请考虑使用数组。排序(pq.toAlayle())。 因此,基本上,我的PriorityQueue工作正常,但使用其内置的toString()方法将其打印到屏幕上,使我看到了这种异常现象,并想知道是否有人可以解释迭代器提供(并在内部使用)的原因不按其自然顺序遍历PriorityQueue?,因为基础数据结构不支持它。二进制堆只是部分有序的,最

这直接来自于:

此类及其迭代器实现集合和迭代器接口的所有可选方法<强>在方法迭代器()中提供的迭代器不能保证以任何特定顺序遍历优先级队列的元素。<强>如果需要有序遍历,请考虑使用数组。排序(pq.toAlayle())。


因此,基本上,我的PriorityQueue工作正常,但使用其内置的toString()方法将其打印到屏幕上,使我看到了这种异常现象,并想知道是否有人可以解释迭代器提供(并在内部使用)的原因不按其自然顺序遍历PriorityQueue?

,因为基础数据结构不支持它。二进制堆只是部分有序的,最小的元素位于根。移除该元素后,堆将重新排序,以便下一个最小的元素位于根。没有有效的有序遍历算法,因此Java中没有提供任何算法。

乍一看,它可能是按照数据存储的顺序遍历数据。为了尽可能缩短在队列中插入项目的时间,它通常不会按排序顺序存储所有项目。

正如Javadoc所说,这就是它的实现方式。优先级队列可能使用二进制堆作为底层数据结构。删除项时,堆将重新排序以保留heap属性


其次,将特定的实现绑定(强制排序)是不明智的。对于当前的实现,您可以自由地以任何顺序遍历它并使用任何实现

二进制堆是实现优先级队列的有效方法。关于堆的顺序的唯一保证是顶部的项具有最高优先级(根据某种顺序,它可能是“最大”或“最小的”)。 堆是具有以下属性的二叉树: 形状属性:树从上到下从左到右填充 顺序优先级:任何节点上的元素都比其两个子节点大(如果最小的具有最高优先级,则更小)。
当迭代器访问所有元素时,它可能以级别顺序遍历的方式进行访问,即在进入下一个级别之前,它依次访问每个级别中的每个节点。由于关于顺序的唯一保证是一个节点比其子节点具有更高的优先级,因此每个级别中的节点都不会按特定顺序排列。

priorityqueue是使用二进制堆实现的。
堆不是排序结构,它是部分排序的。每个元素都有一个与其关联的“优先级”。使用堆来实现优先级队列,它在堆的根节点中将始终具有最高优先级的元素。因此,在优先级队列中,高优先级的元素在低优先级的元素之前被服务。如果两个元素具有相同的优先级,则根据它们在队列中的顺序提供服务。每次删除元素后都会更新Heap,以维护Heap属性。这不太正确。堆还保证x[i]