java - 为什么使用 Offer() 在 java 中填充优先级队列会按字母顺序填充它,同时它还优先考虑大写单词?

标签 java data-structures queue

我很困惑。 Offer() 按字母顺序填充列表,并且它也优先考虑大写单词。如何按照我键入的顺序填充列表?

import java.util.*;
public class Bucky {

 public static void main(String[] args) {
  PriorityQueue<String> q= new PriorityQueue<String>();
  q.offer("first");
  q.offer("aecond");
  q.offer("zhird");

  System.out.printf("%s ",q);
  System.out.println();
  System.out.printf("%s ", q.peek());
  System.out.println();


 }

}

o/p= [aecond, first, zhird] 第二个


import java.util.*;
public class Bucky {

 public static void main(String[] args) {
  PriorityQueue<String> q= new PriorityQueue<String>();
  q.offer("first");
  q.offer("aecond");
  q.offer("Zhird");

  System.out.printf("%s ",q);
  System.out.println();
  System.out.printf("%s ", q.peek());
  System.out.println();


 }

}

o/p= [Zhird, first, aecond] 志德

最佳答案

我认为您要质疑的是数组中项目的顺序。也就是说,当您执行 System.out.printf("%s ",q); 行时,您会得到输出 [Zhird, first, aecond],并且你想知道为什么数组中的第二项是 first,而它在字典序上大于 aecond

答案在于优先级队列的结构。它的结构为 binary heap , 并且受制于二叉堆的构建方式。

您的代码像这样构建堆:

q.offer("first");
q.offer("aecond");
q.offer("Zhird");

如果我们把堆想象成一棵树,你会更容易看出会发生什么。第一个调用将 "first" 放在树的根部。创建二叉堆的规则规定,在下一次调用时,字符串 "aecond" 将被放置在最低、最左边的位置,然后重新排列树。所以首先你有:

       "first"
      /
  "aecond"

然后,您沿着树往上爬。如果 child 比 parent 小,那么你交换 parent 和 child 。所以在这种情况下,你最终会得到这棵树:

       "aecond"
      /
  "first"

现在,字符串 "Zhird" 出现了。它被添加到最低、最左边未被占用的位置:

       "aecond"
      /       \
  "first"   "Zhird"

又到了重新排列树的时候了。 "Zhird" 在字典序上比 "aecond" 小,所以它们被交换了:

       "Zhird"
      /       \
  "first"   "aecond"

请注意,这仍然是一个有效的堆。子节点大于父节点。

二叉堆的数组表示基本上只是树的广度优先遍历,所以这棵树表示为["Zhird", "first", "aecond"].

如果你要从堆中一个一个地删除项目,你会以正确的顺序获取它们(即“Zhird”、“aecond”、“first”)。但是数组表示可能与严格的字典顺序有很大不同,因为删除过程会重新排列树。事实上,如果您要从队列中删除第一项(即调用 q.poll),然后输出数组,您会看到它已被重新排序为 ["aecond", "first"].

查看我的博客,http://blog.mischel.com/2013/09/29/a-better-way-to-do-it-the-heap/ , 堆插入和移除规则的解释。请参阅后续文章,http://blog.mischel.com/2013/09/30/a-simple-heap-of-integers/ ,对于应该帮助您理解树如何映射到数组的实现。

此外,如果您要按此顺序填充堆:

q.offer("Zhird");
q.offer("first");
q.offer("aecond");

输出将是[Zhird, first, aecond]。但如果您的订单是:

q.offer("Zhird");
q.offer("aecond");
q.offer("first");

输出将是[Zhird, aecond, first]

关于java - 为什么使用 Offer() 在 java 中填充优先级队列会按字母顺序填充它,同时它还优先考虑大写单词?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45199916/

相关文章:

java - 如何让我的 java ArrayList 正确显示?

Java - 帮助我理解从子类访问 protected 成员(再次)

java - App Engine Java - 当所有任务完成其流程时执行最终事件

c - 双指针队列,deQueue,enQueue

java - Java Web 应用程序中 Web 请求的优先级

java - 从资源类提供 swagger.json

algorithm - 不可变语言如何高效地实现 set、concat、equals 等?

arrays - 如何找出任意两个元素和> k的子数组?

c - C 中带有字符串的 BST 插入函数

python multiprocessing - 进程挂起加入大队列