8月20日,终于判了,但有失公正,社会可以不公平但不能不公正--写在正文前的废话。
PriorityQueue这个东西叫啥,随便反正我不会翻译她,我只想把我N年前看过的目前还记得的东西拿出来凉凉,以免发霉了,再则也可以给自己的生活添点佐料。
一、PriorityQueue的数据结构
PriorityQueue类定义里明确指出“based on a priority heap”,堆结构,再简单一点说就是一棵完全二叉树。啥是完全二叉树,还好大学时期学的那点东西还没就饭吃,即除了树的叶子所在的层外,其余层节点都被填满。她的可以使用数组来实现。这里的PriorityQueue只不过是在构造队列时就已经实现的一个堆排序而已。
二、核心操作offer
offer中的核心方法是siftUp,而siftUp的核心方法是siftUpUsingComparator和siftUpComparable,这里我们以siftUpComparable方法为例:
private void siftUpComparable(int k, E x) {
Comparable<? super E> key = (Comparable<? super E>) x;
while (k > 0) {
int parent = (k - 1) >>> 1;(1)
Object e = queue[parent];
if (key.compareTo((E) e) >= 0)
break;
queue[k] = e;
k = parent;
}
queue[k] = key;
}
标号(1)处,这里是堆的一个基本操作:给出节点存储的位置找到其父节点所在的位置。这里用了堆的一个特性,父节点所在的位置=子节点所在位置除以2并向下取整。这个方法的核心就是解决有序堆中新增元素的问题。有序堆中新增元素的核心就是考虑新增元素和其父节点的大小关系问题。
三、核心操作poll
poll中的核心方法是siftDown,而siftDown的核心方法是siftDownUsingComparator和siftDownComparable,我们以siftDownComparable方法为例:
private void siftDownComparable(int k, E x) {
Comparable<? super E> key = (Comparable<? super E>)x;
int half = size >>> 1; // loop while a non-leaf
while (k < half) {
int child = (k << 1) + 1;(1)
Object c = queue[child];
int right = child + 1;(2)
if (right < size &&
((Comparable<? super E>) c).compareTo((E) queue[right]) > 0)
c = queue[child = right];
if (key.compareTo((E) c) <= 0)
break;
queue[k] = c;
k = child;
}
queue[k] = key;
}
这个方法核心解决一个问题,堆的根节点被删除后,如何从堆中选出新的根节点。
(1)处是获取要删除节点的左孩子
(2)处是获取要删除节点的右孩子,后续只要按照堆删除操作要求的考虑将移动节点的子节点同其兄弟节点之间的关系即可
分享到:
相关推荐
PriorityQueue是Java中的一个优先级队列,它可以根据元素的优先级对元素进行排序,并且允许高效地获取和删除最高优先级的元素。
而"pradeepr-roboticist-PriorityQueue-MEX-Matlab-1f6c329"可能是项目仓库的一个特定版本,由作者pradeepr-roboticist维护,版本号为1f6c329,这通常是Git版本控制系统中的一个提交ID,代表了该项目在某一时刻的源...
Java集合框架是Java编程语言中的一个核心组成部分,它提供了一套通用的数据结构和容器,用于存储和管理对象。集合框架自JDK 1.2引入以来,极大地提升了开发效率,优化了程序性能,并增强了不同API之间的互操作性。在...
`PriorityQueue`是Java集合框架的一部分,它是一个基于优先级堆的无界优先级队列。这个队列的元素可以按照它们的自然顺序或者是通过构造队列时提供的`Comparator`进行排序。`PriorityQueue`不允许使用`null`元素,...
Java集合框架是Java编程语言中的一个重要组成部分,它提供了一种高效、灵活地管理对象的方式。在Java中,集合主要分为两大接口:Map和Collection。本文将重点探讨Collection接口下的List、Queue和Set。 首先,List...
Java集合框架是Java语言中一个非常重要的组件,提供了多种数据结构和算法来存储和操作数据。在Java集合框架中,LinkedList、ArrayList、HashMap、TreeMap等都是非常常用的数据结构。本文将对Java集合框架的源码进行...
Java集合框架是Java编程语言中非常重要的组成部分,它为Java开发者提供了大量用于存储数据的结构。Java集合框架主要包括两大类,单列集合和双列集合。单列集合中,Set接口的集合主要用于存储不重复的元素,而List...
这个"516.514.JAVA基础教程_集合-每天一考(516)"的压缩包很可能是针对Java集合框架的一个学习资源,旨在帮助初学者深入理解和掌握这一关键概念。Java集合框架包括了多种数据结构,如数组、链表、队列、栈、映射等,...
#### 一、Java集合框架概览 Java集合框架是一个用于存储和操作对象集合的标准API。该框架提供了多种容器类型,包括`Collection`和`Map`两大类。 - **Collection**:这是一个接口,表示一组对象的集合。`Collection...
Java集合框架是Java编程语言中一个非常重要的组成部分,它提供了多种数据结构的实现,使得开发者能够高效地管理和操作数据。本课程主要涵盖了以下几个核心知识点: 1. **集合框架图**: - Java集合框架分为两大类...
#### 一、Java集合框架概述 Java集合框架是Java标准库的重要组成部分,它提供了存储和操作对象的各种数据结构。通过使用集合框架,开发人员可以轻松地管理不同类型的数据集,并且能够利用Java集合框架提供的高效...
Java集合框架是Java编程语言中不可或缺的一部分,它提供了一组接口和类,用于高效地存储、管理和操作数据。这个“一个讲解很清晰的Java集合框架PPT”显然是一个对外公开的教育资源,旨在帮助学习者深入理解Java集合...
Queue接口是Java集合框架中用于表示先进先出(FIFO)数据结构的一部分。它支持各种操作,如插入、检索和删除元素。PriorityQueue和PriorityBlockingQueue是两个基于优先级的队列实现,它们允许元素按照自然顺序或...
Java集合框架是Java平台的核心组件之一,它为开发者提供了多种数据结构来存储和操作对象集合。Java集合主要包括两大接口:`Collection` 和 `Map`。 #### Collection接口: - **特点**:它代表一个元素列表,可以...
Java集合框架是Java编程语言中一个非常重要的组成部分,它提供了数据结构和算法的实现,使得在处理对象集合时更加高效和灵活。Java集合教程通常会涵盖以下关键知识点: 1. **集合接口**: - `Collection`:这是...
Java集合框架是Java编程语言中一个至关重要的组成部分,它为数据存储、管理和操作提供了丰富的类库。这个框架包括了各种接口、类以及实现,使得开发者能够高效地处理对象的集合,无论是小型还是大型数据集。在Java...
Java集合框架是Java编程语言中不可或缺的一部分,它提供了一组接口和类,用于高效地存储、管理和操作数据。本篇文章将深入探讨Java集合框架的各个方面,帮助开发者从基础到高级全面掌握这一关键知识。 首先,我们要...
在Java 2平台之前,集合框架的组成较为零散,自Java 2平台的JDK 1.2版本之后,引入了集合框架(Collections Framework),为集合类提供了一个统一的体系结构。现在,集合框架广泛应用于Java编程,大大提高了开发效率...
Java集合框架是Java编程语言中一个非常重要的组成部分,它提供了数据结构和算法的实现,使得在处理对象集合时更加高效和灵活。集合框架包括接口、类和算法,这些都集中在`java.util`包中。主要的集合接口有List、Set...
Java集合框架是Java编程语言中的一个核心组件,它为数据存储和管理提供了强大的支持。这个框架包括了多种接口和类,使得程序员可以高效地处理对象集合。在"Java--collection.rar"这个压缩包中,我们可以找到名为...