欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java堆&優(yōu)先級隊列示例講解(下)

 更新時間:2022年03月18日 11:23:49   作者:愛干飯的猿  
這篇文章主要通過示例詳細為大家介紹Java中的堆以及優(yōu)先級隊列,文中的示例代碼講解詳細,對我們了解java有一定幫助,需要的可以參考一下

1.優(yōu)先級隊列

1.1 概念

在很多應(yīng)用中,我們通常需要按照優(yōu)先級情況對待處理對象進行處理,比如首先處理優(yōu)先級最高的對象,然后處理次高的對象。最簡單的一個例子就是,在手機上玩游戲的時候,如果有來電,那么系統(tǒng)應(yīng)該優(yōu)先處理打進來的電話。在這種情況下,我們的數(shù)據(jù)結(jié)構(gòu)應(yīng)該提供兩個最基本的操作,一個是返回最高優(yōu)先級對象,一個是添加新的對象。這種數(shù)據(jù)結(jié)構(gòu)就是優(yōu)先級隊列(Priority Queue)。

1.2 內(nèi)部原理

優(yōu)先級隊列的實現(xiàn)方式有很多,但最常見的是使用堆來構(gòu)建。

1.3 操作-入隊列

過程(以大堆為例):

1. 首先按尾插方式放入數(shù)組

2. 比較其和其雙親的值的大小,如果雙親的值大,則滿足堆的性質(zhì),插入結(jié)束

3. 否則,交換其和雙親位置的值,重新進行 2 、 3 步驟

4. 直到根結(jié)點

圖示:

1.4 操作-出隊列(優(yōu)先級最高)

為了防止破壞堆的結(jié)構(gòu),刪除時并不是直接將堆頂元素刪除,而是用數(shù)組的最后一個元素替換堆頂元素,然后通過向下調(diào)整方式重新調(diào)整成堆

1.5 借用堆實現(xiàn)優(yōu)先級隊列

1.實現(xiàn)一個接口

public interface IQueue<E> {
    // 入隊
    void offer(E val);
    //出隊
    E poll();
    //返回隊首元素
    E peek();
    //判斷隊列是否為空
    boolean isEmpty();
}

2.堆完整代碼見Java堆&優(yōu)先級隊列示例講解(上)

3.優(yōu)先級隊列

/**
 * 基于最大堆的優(yōu)先級隊列,值越大優(yōu)先級越高
 * 隊首元素就是優(yōu)先級最大的元素(值最大)
 */
 
import stack_queue.queue.IQueue;
 
public class PriorityQueue implements IQueue<Integer> {
    MaxHeap heap = new MaxHeap();
    public PriorityQueue(){
        heap = new MaxHeap();
    }
 
    @Override
    public void offer(Integer val) {
        heap.add(val);
    }
 
    @Override
    public Integer poll() {
        return heap.extractMax();
    }
 
    @Override
    public Integer peek() {
        return heap.peekMax();
    }
 
    @Override
    public boolean isEmpty() {
        return heap.isEmpty();
    }
}

1.6 測試

import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.Queue;
 
public class PriorityQueueTest {
    public static void main(String[] args) {
        // 通過構(gòu)造方法傳入比較器
        // 默認是最小堆,"值"(比較器compare的返回值)越小,優(yōu)先級就越高
        // 當(dāng)傳入一個降序的比較器時,值(比較器compare的返回值,值越大,返回負數(shù))
//        Queue<Student> queue = new PriorityQueue<>(new StudentComDesc());
//        Queue<Student> queue = new PriorityQueue<>(new Comparator<Student>() {
//            @Override
//            public int compare(Student o1, Student o2) {
//                return o2.getAge() - o1.getAge();
//            }
//        });
        Queue<Student> queue = new PriorityQueue<>(new StudentCom());
        Student stu1 = new Student(18,"雷昊");
        Student stu2 = new Student(20,"張超");
        Student stu3 = new Student(16,"鉞浦");
        queue.offer(stu1);
        queue.offer(stu2);
        queue.offer(stu3);
        while (!queue.isEmpty()){
            System.out.println(queue.poll());
        }
    }
}
 
//升序(最小堆)
class StudentCom implements Comparator<Student> {
    @Override
    public int compare(Student o1, Student o2) {
        return o1.getAge() - o2.getAge();
    }
}
 
//降序(最大堆)
class StudentComDesc implements Comparator<Student> {
    @Override
    public int compare(Student o1, Student o2) {
        return o2.getAge() - o1.getAge();
    }
}
 
class Student{
    private int age;
    private String name;
 
    public int getAge() {
        return age;
    }
 
    public Student(int age, String name) {
        this.age = age;
        this.name = name;
    }
 
    @Override
    public String toString() {
        return "Student{" +
                "age=" + age +
                ", name='" + name + '\'' +
                '}';
    }
}

結(jié)果如下:Java堆&優(yōu)先級隊列示例講解(上)

到此這篇關(guān)于Java堆&優(yōu)先級隊列示例講解(下)的文章就介紹到這了,更多相關(guān)Java 堆 優(yōu)先級隊列內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • springboot項目mysql-connector-java默認版本如何查看

    springboot項目mysql-connector-java默認版本如何查看

    這篇文章主要介紹了springboot項目mysql-connector-java默認版本如何查看問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • 解決JDK版本沖突顯示問題(雙版本沖突)

    解決JDK版本沖突顯示問題(雙版本沖突)

    這篇文章主要介紹了解決JDK版本沖突顯示問題(雙版本沖突),具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • Java編程探索之泛型擦除實例解析

    Java編程探索之泛型擦除實例解析

    這篇文章主要介紹了Java編程探索之泛型擦除實例解析,具有一定參考價值,需要的朋友可以了解下。
    2017-10-10
  • 深入理解java中i++和++i的區(qū)別

    深入理解java中i++和++i的區(qū)別

    下面小編就為大家?guī)硪黄钊肜斫鈐ava中i++和++i的區(qū)別。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-12-12
  • Java數(shù)據(jù)結(jié)構(gòu)與算法入門實例詳解

    Java數(shù)據(jù)結(jié)構(gòu)與算法入門實例詳解

    這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)與算法入門實例詳解,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • Spring Cloud Gateway 服務(wù)網(wǎng)關(guān)快速實現(xiàn)解析

    Spring Cloud Gateway 服務(wù)網(wǎng)關(guān)快速實現(xiàn)解析

    這篇文章主要介紹了Spring Cloud Gateway 服務(wù)網(wǎng)關(guān)快速實現(xiàn)解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-08-08
  • java取兩個字符串的最大交集

    java取兩個字符串的最大交集

    這篇文章主要介紹了java取兩個字符串的最大交集的方法,涉及Java對字符串操作的技巧,具有一定的參考借鑒價值,需要的朋友可以參考下
    2014-10-10
  • 教你如何用Jenkins自動化部署項目(從零到搭建完成)

    教你如何用Jenkins自動化部署項目(從零到搭建完成)

    這篇文章主要介紹了教你如何用Jenkins自動化部署項目(從零到搭建完成),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • 輕松掌握Java單例模式

    輕松掌握Java單例模式

    這篇文章主要幫助大家輕松掌握Java單例模式 ,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • 解決java連接zookeeper很慢的問題

    解決java連接zookeeper很慢的問題

    這篇文章主要介紹了解決java連接zookeeper很慢的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11

最新評論