Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.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-PriorityQueue与排序的LinkedList_Java_Sorting_Linked List_Priority Queue - Fatal编程技术网

Java-PriorityQueue与排序的LinkedList

Java-PriorityQueue与排序的LinkedList,java,sorting,linked-list,priority-queue,Java,Sorting,Linked List,Priority Queue,哪种实现的“负担”较小:PriorityQueue还是排序的LinkedList(使用比较器) 我想把所有的东西都分类。插入将非常频繁,因此我必须运行所有列表以进行一些操作。您应该同时执行这两项操作,然后对实际数据进行性能测试,以查看哪项在您的特定情况下效果最佳。如果您使用链接列表,每次添加一个项目时,您都需要使用这些项目,而且由于插入非常频繁,因此我不会使用LinkedList。因此,在这种情况下,如果您只想向列表中添加唯一的元素,我会使用PriorityQueue,我建议使用SortedSe

哪种实现的“负担”较小:PriorityQueue还是排序的LinkedList(使用比较器)


我想把所有的东西都分类。插入将非常频繁,因此我必须运行所有列表以进行一些操作。

您应该同时执行这两项操作,然后对实际数据进行性能测试,以查看哪项在您的特定情况下效果最佳。

如果您使用
链接列表
,每次添加一个项目时,您都需要使用这些项目,而且由于插入非常频繁,因此我不会使用
LinkedList
。因此,在这种情况下,如果您只想向列表中添加唯一的元素,我会使用
PriorityQueue
,我建议使用
SortedSet
(一种实现是
TreeSet
)。

您需要一直对其进行排序吗?如果是这种情况,您可能希望使用树集(或具有快速查找功能的其他SortedSet)之类的东西


如果您只是偶尔需要对其进行排序,请使用链接列表,并在需要访问时对其进行排序。当您不需要访问时,请将其取消排序。

java.util.PriorityQueue

“基于的无限优先级队列 “优先级堆”


。堆数据结构比链表更有意义a
LinkedList
是最糟糕的选择。使用
ArrayList
(或者更一般地说,使用实现者)或
PriorityQueue
。如果确实使用列表,则仅在迭代其内容之前对其排序,而不是在每次插入之后


需要注意的一点是,
PriorityQueue
迭代器没有按顺序提供元素;实际上,您必须删除元素(清空队列)才能按顺序遍历其元素。

这两种数据结构之间存在根本性差异,并且它们不像您想象的那样容易互换

根据PriorityQueue文档:

方法Iterator()中提供的迭代器不保证以任何特定顺序遍历优先级队列的元素


仅在迭代列表之前使用ArrayList并调用Collections.sort()。

PriorityQueue的问题是必须清空队列才能使元素有序。如果这是你想要的,那么这是一个很好的选择。否则,您可以使用
ArrayList
,仅在需要排序结果时进行排序,或者,如果项目不同(相对于比较器),则使用
TreeSet
TreeSet
ArrayList
在空间上都不是很重;哪个更快取决于用例。

我可以看到两个选项,哪个更好取决于您是否需要能够拥有重复的项目

如果您不需要在列表中维护重复的项目,我将使用SortedSet(可能是TreeSet)

如果您需要维护重复的项目,我会使用LinkedList并按正确的顺序将新项目插入列表

PriorityQueue实际上并不适合,除非您希望在执行操作时删除这些项


与其他人一起,确保您使用评测来确保您为您的特定问题选择了正确的解决方案。

我在这个问题上做了一个小的基准测试。如果您希望在所有插入结束后对列表进行排序,那么
PriorityQueue
LinkedList
之间几乎没有区别(LinkedList稍微好一点,在我的机器上快5%到10%。),但是,如果使用ArrayList,排序速度将比PriorityQueue快近2倍


在我的列表基准测试中,我测量了从开始填充值到排序结束的时间。对于PriorityQueue-从填充开始到轮询所有元素结束(因为元素在PriorityQueue中排序,同时删除它们,如ericksonanswer中所述)

向优先级队列添加对象将是O log(n),并且对于每个pol都是相同的。如果您经常在非常大的队列上执行插入,那么这可能会影响性能。插入到ArrayList的顶部是恒定的,因此总的来说,所有这些插入在ArrayList上的速度都将快于在优先级队列上的速度

如果需要按排序的顺序获取所有元素,则Collections.sort将在大约0个log(n)的总时间内工作。其中,由于优先级队列中的每个pol都将是O log(n)时间,因此,如果您从队列中获取所有n个对象,那么它将再次是O n log(n)


优先级队列获胜的用例是,在任何给定的时间,如果您试图找到队列中的最大值是什么。要使用ArrayList实现这一点,您必须在每次希望知道最大值时对整个列表进行排序。但是对于优先级队列,它总是知道最大值是什么。

IMHO:如果有LinkedList,我们不需要PriorityQueue。我可以使用LinkedList比使用PriorityQueue更快地对队列进行排序。e、 g

Queue list = new PriorityQueue();
list.add("1");
list.add("3");
list.add("2");
while(list.size() > 0) {
    String s = list.poll().toString();
    System.out.println(s);
}
我相信这段代码太长了,因为每次我添加元素时,它都会对元素进行排序。但如果我将使用下一个代码:

Queue list = new LinkedList();
list.add("1");
list.add("3");
list.add("2");
List lst = (List)list;
Collections.sort(lst);
while(list.size() > 0) {
    String s = list.poll().toString();
    System.out.println(s);
}

我认为这段代码只会排序一次,使用PriorityQueue会更快。因此,在使用LinkedList之前,我可以对它进行一次排序,无论如何,它会运行得更快。即使它在同一时间排序,我也不需要PriorityQueue,我们也不需要这个类。

是否有过这样的情况,LinkedList可以更快地维护频繁插入的排序条目?是的。如果插入经常发生,而查找却不经常发生,那么最好只对查找进行appened和排序。您可以缓存是否已排序。这取决于每次发生的频率。这就是测试的意义所在。这真的应该是大二数据结构课上的一道测试题。我的意思是,如果列表需要不断排序,而不仅仅是按需排序。没必要