国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

數(shù)據(jù)結(jié)構(gòu)之優(yōu)先級隊(duì)列【堆】(Heap)

這篇具有很好參考價(jià)值的文章主要介紹了數(shù)據(jù)結(jié)構(gòu)之優(yōu)先級隊(duì)列【堆】(Heap)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

目錄

1. 優(yōu)先級隊(duì)列(Priority Queue)

2.堆的概念

3.堆的存儲方式

4.堆的創(chuàng)建

5.用堆模擬實(shí)現(xiàn)優(yōu)先級隊(duì)列

?6.PriorityQueue常用接口介紹

6.1?PriorityQueue的特點(diǎn)

6.2?PriorityQueue幾種常見的構(gòu)造方式

7.top-k問題

8.堆排序


本篇主要內(nèi)容總結(jié)

(1)優(yōu)先級隊(duì)列底層是堆來實(shí)現(xiàn)的

(2)堆的本質(zhì)是完全二叉樹? ,堆有大根堆和小根堆

(3)大根堆:根節(jié)點(diǎn)最大的堆; 小根堆:根節(jié)點(diǎn)最小的堆

(4)堆的創(chuàng)建實(shí)現(xiàn):大根堆為例

大根堆創(chuàng)建:孩子結(jié)點(diǎn)和根節(jié)點(diǎn)比較交換,核心思想:向下調(diào)整? ?時間復(fù)雜度O(n)

堆的插入:插入到最后一個位置,和根結(jié)點(diǎn)交換,核心思想:向上調(diào)整

堆的刪除:只能刪除堆頂,然后重新向下調(diào)整組成新的大根堆

插入和刪除時間復(fù)雜度O(log n)

(4)priorityQueue建堆是小根堆,如果要建立大根堆就要寫比較器

(5)priorityQueue添加元素,要寫明比較的類型才能添加

(6)top-K問題:前K個最大的元素建小根堆;前K個最小的元素建大根堆

第K個最大元素建小根堆 拿棧頂;? ? 第K個最小元素建大根堆 拿棧頂

(7)堆排序:升序:大根堆? ? 降序:小根堆

核心思想:堆元素的刪除


在說堆的概念之前,先說一下堆的常用方法,從這個方向來寫這篇文章

堆的常用方法有

(1)用來構(gòu)建優(yōu)先級隊(duì)列

(2)支持堆排序(大堆或小堆)

(3)top-k問題


1. 優(yōu)先級隊(duì)列(Priority Queue)

優(yōu)先級隊(duì)列?:是不同于先進(jìn)先出隊(duì)列的另一種隊(duì)列。每次從隊(duì)列中取出的是具有最高優(yōu)先權(quán)的元素。

優(yōu)先級隊(duì)列相對于普通隊(duì)列應(yīng)該提供兩個最基本的操作,

(1)返回最高優(yōu)先級對象(2)添加新的對象

在JDk1.8中的優(yōu)先級隊(duì)列底層使用了堆

2.堆的概念

簡單的說 ,堆這種數(shù)據(jù)結(jié)構(gòu)本質(zhì)上就是一個完全二叉樹

并且堆中某個結(jié)點(diǎn)的值總是不大于或不小于其父結(jié)點(diǎn)的值

小堆:根節(jié)點(diǎn)最小的堆,滿足Ki <= K2i+1 且 Ki <= K2i+2?

大堆:根節(jié)點(diǎn)最大的堆,? ?滿足Ki >= K2i+1 且 Ki >= K2i+2?

數(shù)據(jù)結(jié)構(gòu)之優(yōu)先級隊(duì)列【堆】(Heap)

3.堆的存儲方式

堆是一顆完全二叉樹,所以按照層序來看,可以采用順序數(shù)組的存儲方式

但是非完全二叉樹就不適用于順序存儲了,這是因?yàn)榉峭耆鏄淙绻锌战Y(jié)點(diǎn),那順序存儲也要存儲這個空節(jié)點(diǎn),這就造成空間上的浪費(fèi)

i表示孩子結(jié)點(diǎn),父親結(jié)點(diǎn)(i-1)/ 2

i表示根節(jié)點(diǎn) ,左孩子 2 * i + 1? ? 右孩子? ?2 * i + 2

4.堆的創(chuàng)建

數(shù)據(jù)結(jié)構(gòu)之優(yōu)先級隊(duì)列【堆】(Heap)

5.用堆模擬實(shí)現(xiàn)優(yōu)先級隊(duì)列

按照大根堆來創(chuàng)建

先寫一個數(shù)組,按順序存儲的方式

    public int[] elem;
    public int userSize;//當(dāng)前堆中有效的元素?cái)?shù)據(jù)個數(shù)

    public MyHeap() {
        this.elem = new int[10];
        this.userSize = 0;
    }

    public void initArray(int[] array) {
        elem = Arrays.copyOf(array,array.length);
        userSize = elem.length;
    }

(1) 創(chuàng)建堆

數(shù)據(jù)結(jié)構(gòu)之優(yōu)先級隊(duì)列【堆】(Heap)

先寫一個向下調(diào)整的方法

  /**
     * @param parent: 每顆子樹的根節(jié)點(diǎn)下標(biāo)
     * @param len:每顆子樹的結(jié)束位置
     * @description 向下調(diào)整
     */
    private void shiftDown(int parent,int len) {
        int child = 2*parent+1;//左孩子
        //必須要有左孩子
        while(child < len) {
            //如果一定有右孩子。那就判斷 左孩子和右孩子大小,誰大保存誰
            if(child + 1 < userSize && elem[child] < elem[child+1]) {
                child++;
            }
            //交換 比較孩子和根大小交換 然后根節(jié)點(diǎn)往下走繼續(xù)必須
            if (elem[child] > elem[parent]) {
                swap(elem,child,parent);
                parent = child;
                child = 2*parent+1;
            }else {
                break;
            }
        }
    }

再寫一個交換根和孩子的方法

    //交換  比較孩子和根大小交換
    private void swap(int[] array, int i, int j) {
        int tmp = array[i];
        array[i] = array[j];
        array[j] = tmp;
    }

然后通過循環(huán)每個結(jié)點(diǎn),向下調(diào)整,然后創(chuàng)建好這棵樹

    /**
     *建堆:大根堆
     *時間復(fù)雜度O(n)
     */
    public void createHeap() {
        for (int parent = (userSize-1-1)/2; parent >= 0 ; parent--) {
            shiftDown(parent,userSize);
        }
    }

分析一下建堆的時間復(fù)雜度O(n)

數(shù)據(jù)結(jié)構(gòu)之優(yōu)先級隊(duì)列【堆】(Heap)


?(2)堆的插入

數(shù)據(jù)結(jié)構(gòu)之優(yōu)先級隊(duì)列【堆】(Heap)

先寫一個方法來判斷空間滿不滿

    public boolean isFull() {
        return userSize == elem.length;
    }

再寫一個向上調(diào)整

 //向上調(diào)整
    private void shiftUp(int child) {
        int parent = (child - 1) / 2;
        while(child > 0) {
            if(elem[child] > elem[parent]) {
                swap(elem,child,parent);
                child = parent;
                parent = (child - 1) / 2;
            }else {
                break;
            }
        }
    }

?最后再寫堆的插入,如果空間滿了就擴(kuò)容,然后再向上調(diào)整,變成新的大根堆

    //堆的插入
    public void offer(int x) {
        if (isFull()) {
            elem = Arrays.copyOf(elem,2*elem.length);
        }
        this.elem[userSize] = x;
        userSize++;
        shiftUp(userSize-1);
    }

?(3)堆的刪除(優(yōu)先級隊(duì)列刪除,只能刪除堆頂?shù)脑兀?/strong>

數(shù)據(jù)結(jié)構(gòu)之優(yōu)先級隊(duì)列【堆】(Heap)

再刪除前,先要看堆是不是空的

    public boolean isEmpty() {
        return userSize == 0;
    }

然后再刪除堆頂元素

  //堆的刪除  只能刪除堆頂元素
    public int poll() {
        if (isEmpty()) {
            return -1;
        }
        int old = elem[0];
        //1.交換
        swap(elem,0,userSize-1);
        //2.有效元素個數(shù)-1
        userSize--;
        //3.棧頂元素向下調(diào)整
        shiftDown(0,userSize);
        return old;
    }

看幾個選擇題把?

1.已知小根堆為8,15,10,21,34,16,12,刪除關(guān)鍵字8之后需重建堆,在此過程中,關(guān)鍵字之間的比較次數(shù)是? ?? (C)
A: 1 B: 2 C: 3 D: 4

數(shù)據(jù)結(jié)構(gòu)之優(yōu)先級隊(duì)列【堆】(Heap)

2.最小堆[0,3,2,5,7,4,6,8],在刪除堆頂元素0之后,其結(jié)果是? ??()

A: [3 , 2 , 5 , 7 , 4 , 6 8] B: [2 , 3 5 , 7 , 4 , 6 8]
C: [2 , 3 , 4 5 , 7 8 , 6] D: [2 , 3 4 , 5 6 , 7 8]

數(shù)據(jù)結(jié)構(gòu)之優(yōu)先級隊(duì)列【堆】(Heap)

?6.PriorityQueue常用接口介紹

6.1?PriorityQueue的特點(diǎn)

(1)首先最重要的先明白priorityQueue建堆是小根堆

    public static void main(String[] args) {
        //默認(rèn)是小根堆
        PriorityQueue<Integer> priorityQueue = new PriorityQueue<>();
        priorityQueue.offer(45);
        priorityQueue.offer(12);
        priorityQueue.offer(55);
        priorityQueue.offer(66);
        System.out.println(priorityQueue.peek());
    }

數(shù)據(jù)結(jié)構(gòu)之優(yōu)先級隊(duì)列【堆】(Heap)

可以看到這里打印的是12所以是priorityQueue是小根堆

如果要建堆為大根堆,那就要寫比較器Comparator了?

    public static void main(String[] args) {
       PriorityQueue<Integer> priorityQueue = new PriorityQueue<>(new Comparator<Integer>() {
           @Override
           public int compare(Integer o1, Integer o2) {
               return o2-o1;
           }
       });
    }

(2) 在priorityQueue使用offer添加元素時,一定要明確比較的規(guī)則,然后再添加

如果是直接這樣比較的話,offer不知道以什么規(guī)則比較然后添加,就會報(bào)錯。?

    public static void main(String[] args) {
        PriorityQueue<Fruit> priorityQueue = new PriorityQueue<>();
        priorityQueue.offer(new Fruit() );
        priorityQueue.offer(new Fruit() );
    }

所以這里必須告訴offer以什么方式比較添加,

比如說這里實(shí)現(xiàn)comparable接口

class Fruit implements Comparable<Fruit>{
    public int age;
    //必須告訴priorityQueue.offer 以什么方式比較添加元素
    @Override
    public int compareTo(Fruit o) {
        return this.age - o.age;
    }
}

(3)不能插入null對象,否則會拋出NullPointerException異常

數(shù)據(jù)結(jié)構(gòu)之優(yōu)先級隊(duì)列【堆】(Heap)

(4)可以插入任意多個元素,會自動擴(kuò)容,沒有容量限制

?數(shù)據(jù)結(jié)構(gòu)之優(yōu)先級隊(duì)列【堆】(Heap)

?(5)插入和刪除元素的時間復(fù)雜度為O(log n),建棧的時間復(fù)雜度O(n)


6.2?PriorityQueue幾種常見的構(gòu)造方式

(1)PriorityQueue()? ?初始默認(rèn)容量為11

數(shù)據(jù)結(jié)構(gòu)之優(yōu)先級隊(duì)列【堆】(Heap)

(2)PriorityQueue(int initialCapacity)

數(shù)據(jù)結(jié)構(gòu)之優(yōu)先級隊(duì)列【堆】(Heap)

(3)PriorityQueue(Collection<? extends E> c)

?數(shù)據(jù)結(jié)構(gòu)之優(yōu)先級隊(duì)列【堆】(Heap)

(4)PriorityQueue(int initialCapacity, Collection<? super E> comparator


7.top-k問題

適用情況,在數(shù)據(jù)量比較大時,求數(shù)據(jù)集合中前K個最大的元素或者最小的元素

比如說求很多個元素的前k個最大的元素?

思路1:

(1)將這些元素,全部放進(jìn)大根堆中,堆頂?shù)脑鼐褪亲畲蟮闹?/strong>

(2)然后出k次,就能得到前k個最大的值,并且每出一次都會進(jìn)行向下調(diào)整,變成新的大根堆

 public static void topK1(int[] array, int k) {
        PriorityQueue<Integer> maxPQ = new PriorityQueue<>(new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o2-o1;
            }
        });

        for (int i = 0; i < array.length; i++) {
            maxPQ.offer(array[i]);
        }
        for (int i = 0; i < k; i++) {
            int val = maxPQ.poll();
            System.out.println(val);
        }
        System.out.println();
    }
    public static void main(String[] args) {
        int[] array = {16,15,22,155,89,12,45};
        topK1(array,3);
    }

?數(shù)據(jù)結(jié)構(gòu)之優(yōu)先級隊(duì)列【堆】(Heap)

?缺點(diǎn):數(shù)字有多少,這個堆就有多大,時間復(fù)雜度是O(n*log n)

?思路2:

(1)求前K個最大的元素,建立大小為K的小根堆

(2)然后用剩下的集合里面的元素輪流和堆頂元素比較,如果剩下集合里面的元素比堆頂?shù)脑卮?,那就替換掉堆頂?shù)脑?/strong>

(3)然后向下調(diào)整,變成新的小根堆,此時這個堆中的元素就是前K個最大元素

數(shù)據(jù)結(jié)構(gòu)之優(yōu)先級隊(duì)列【堆】(Heap)
1. 那如果要求前K個最小的元素,如何做
差不多和前面一樣的方法,不同的是
(1)求前K個最小的元素,要建立大根堆
(2)比較的時候誰小,就把小的放在堆頂

?力扣鏈接:? ?面試題 17.14. 最小K個數(shù) - 力扣(LeetCode)

class Solution {
    public int[] smallestK(int[] arr, int k) {
       int[] ret = new int[k];
        if(k == 0) return ret;
        PriorityQueue<Integer> maxPQ = new PriorityQueue<>(k,new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o2-o1;
            }
        });

        for (int i = 0; i < arr.length; i++) {
            if(maxPQ.size() < k) {
                maxPQ.offer(arr[i]);
            }else {
                //獲取到堆頂元素
                int top = maxPQ.peek();
                //找前k個最小的
                if(arr[i] < top) {
                    maxPQ.poll();
                    maxPQ.offer(arr[i]);
                }
            }
        }
        for (int i = 0; i < k; i++) {
            ret[i] = maxPQ.poll();
        }
        return ret;
    }
}
2. 那如果要求第K大的元素,或者第K小的元素如何做
(1)前面求前K個最大的元素時,建立的小根堆,按照規(guī)則,到最后棧中全部都是前K個最大的元素,然后棧頂就是所要求得的第K大的元素
(2)前面求前K個最小的元素時,建立的大根堆,按照規(guī)則,到最后棧中全部都是前K個最小的元素,然后棧頂就是所要求得的第K小的元素

8.堆排序

?如果是將堆排成一個升序的,那就建立大根堆,操作如下數(shù)據(jù)結(jié)構(gòu)之優(yōu)先級隊(duì)列【堆】(Heap)

    public void heapSort() {
        int end = userSize -1;
        while(end > 0) {
            swap(elem,0,end);
            shiftDown(0,end);
            end--;
        }
    }

數(shù)據(jù)結(jié)構(gòu)之優(yōu)先級隊(duì)列【堆】(Heap)

如果是將堆排成一個降序的,那就建立小根堆,操作和上面類似

一組記錄排序碼為(5 11 7 2 3 17),則利用堆排序方法建立的初始堆為??(C)
A: (11 5 7 2 3 17) B: (11 5 7 2 17 3) C: (17 11 7 2 3 5)
D: (17 11 7 5 3 2) E: (17 7 11 3 5 2) F: (17 7 11 3 2 5)

數(shù)據(jù)結(jié)構(gòu)之優(yōu)先級隊(duì)列【堆】(Heap)文章來源地址http://www.zghlxwxcb.cn/news/detail-427760.html


到了這里,關(guān)于數(shù)據(jù)結(jié)構(gòu)之優(yōu)先級隊(duì)列【堆】(Heap)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 數(shù)據(jù)結(jié)構(gòu)與算法-優(yōu)先級隊(duì)列

    Gitee上開源的數(shù)據(jù)結(jié)構(gòu)與算法代碼庫:數(shù)據(jù)結(jié)構(gòu)與算法Gitee代碼庫 優(yōu)先級隊(duì)列,按照優(yōu)先級別依次輸出 計(jì)算機(jī)科學(xué)中,堆是一種基于樹的數(shù)據(jù)結(jié)構(gòu),通常用 完全二叉樹 實(shí)現(xiàn)。堆的特性如下 在大頂堆中,任意節(jié)點(diǎn) C 與它的父節(jié)點(diǎn) P 符合 P . v a l u e ≥ C . v a l u e P.value geq C.val

    2024年02月13日
    瀏覽(36)
  • 數(shù)據(jù)結(jié)構(gòu) 之 優(yōu)先級隊(duì)列(堆) (PriorityQueue)

    數(shù)據(jù)結(jié)構(gòu) 之 優(yōu)先級隊(duì)列(堆) (PriorityQueue)

    ??歡迎大家觀看AUGENSTERN_dc的文章(o゜▽゜)o☆?? ??感謝各位讀者在百忙之中抽出時間來垂閱我的文章,我會盡我所能向的大家分享我的知識和經(jīng)驗(yàn)?? ??希望我們在一篇篇的文章中能夠共同進(jìn)步?。?! ??個人主頁:AUGENSTERN_dc ??個人專欄:C語言?|?Java | 數(shù)據(jù)結(jié)構(gòu) ?個人

    2024年03月20日
    瀏覽(27)
  • 【一起學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法】優(yōu)先級隊(duì)列(堆)

    【一起學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法】優(yōu)先級隊(duì)列(堆)

    如果我們給每個元素都分配一個數(shù)字來標(biāo)記其優(yōu)先級,不妨設(shè)較小的數(shù)字具有較高的優(yōu)先級,這樣我們就可以在一個集合中訪問優(yōu)先級最高的元素并對其進(jìn)行查找和刪除操作了。這樣,我們就引入了 優(yōu)先級隊(duì)列 這種數(shù)據(jù)結(jié)構(gòu)。 優(yōu)先級隊(duì)列(priority queue) 是0個或多個元素的集

    2024年01月19日
    瀏覽(24)
  • 【數(shù)據(jù)結(jié)構(gòu)】 優(yōu)先級隊(duì)列(堆)與堆的建立

    【數(shù)據(jù)結(jié)構(gòu)】 優(yōu)先級隊(duì)列(堆)與堆的建立

    前面介紹過隊(duì)列, 隊(duì)列是一種先進(jìn)先出(FIFO)的數(shù)據(jù)結(jié)構(gòu) ,但有些情況下,操作的數(shù)據(jù)可能帶有優(yōu)先級,一般出隊(duì)列時,可能需要優(yōu)先級高的元素先出隊(duì)列,該中場景下,使用隊(duì)列顯然不合適。 比如:在手機(jī)上玩游戲的時候,如果有來電,那么系統(tǒng)應(yīng)該優(yōu)先處理打進(jìn)來的電話

    2024年02月10日
    瀏覽(19)
  • 數(shù)據(jù)結(jié)構(gòu) - 6(優(yōu)先級隊(duì)列(堆)13000字詳解)

    數(shù)據(jù)結(jié)構(gòu) - 6(優(yōu)先級隊(duì)列(堆)13000字詳解)

    堆分為兩種:大堆和小堆。它們之間的區(qū)別在于元素在堆中的排列順序和訪問方式。 大堆(Max Heap): 在大堆中,父節(jié)點(diǎn)的值比它的子節(jié)點(diǎn)的值要大。也就是說,堆的根節(jié)點(diǎn)是堆中最大的元素。大堆被用于實(shí)現(xiàn)優(yōu)先級隊(duì)列,其中根節(jié)點(diǎn)的元素始終是隊(duì)列中最大的元素。 大堆

    2024年02月08日
    瀏覽(25)
  • 【數(shù)據(jù)結(jié)構(gòu)與算法】03 隊(duì)列(順序隊(duì)列--循環(huán)隊(duì)列--優(yōu)先級隊(duì)列--鏈隊(duì)列)

    【數(shù)據(jù)結(jié)構(gòu)與算法】03 隊(duì)列(順序隊(duì)列--循環(huán)隊(duì)列--優(yōu)先級隊(duì)列--鏈隊(duì)列)

    隊(duì)列( queue )是一種常見的數(shù)據(jù)結(jié)構(gòu),它遵循先進(jìn)先出(FIFO)的原則。隊(duì)列可以理解為一個具有兩個端點(diǎn)的線性數(shù)據(jù)結(jié)構(gòu),其中一個端點(diǎn)稱為\\\"隊(duì)尾\\\"(rear),用于插入新元素,另一個端點(diǎn)稱為\\\"隊(duì)首\\\"(front),用于移除元素。新元素被插入到隊(duì)尾,而最早插入的元素總是在隊(duì)

    2024年02月08日
    瀏覽(21)
  • Java 數(shù)據(jù)結(jié)構(gòu)篇-用數(shù)組、堆實(shí)現(xiàn)優(yōu)先級隊(duì)列

    Java 數(shù)據(jù)結(jié)構(gòu)篇-用數(shù)組、堆實(shí)現(xiàn)優(yōu)先級隊(duì)列

    ??博客主頁:?【 小扳_-CSDN博客】 ?感謝大家點(diǎn)贊??收藏?評論? ?? 文章目錄 ? ? ? ? 1.0 優(yōu)先級隊(duì)列說明 ? ? ? ? 2.0 用數(shù)組實(shí)現(xiàn)優(yōu)先級隊(duì)列 ? ? ? ? 3.0?無序數(shù)組實(shí)現(xiàn)優(yōu)先級隊(duì)列 ? ? ? ? 3.1 無序數(shù)組實(shí)現(xiàn)優(yōu)先級隊(duì)列 - 入隊(duì)列 offer(E value) ? ? ? ? 3.2 無序數(shù)組實(shí)現(xiàn)優(yōu)先

    2024年02月04日
    瀏覽(22)
  • 【數(shù)據(jù)結(jié)構(gòu)初階】——第八節(jié).優(yōu)先級隊(duì)列(小根堆的模擬實(shí)現(xiàn))

    【數(shù)據(jù)結(jié)構(gòu)初階】——第八節(jié).優(yōu)先級隊(duì)列(小根堆的模擬實(shí)現(xiàn))

    ?作者簡介:大家好,我是未央; 博客首頁: 未央.303 系列專欄:Java初階數(shù)據(jù)結(jié)構(gòu) 每日一句:人的一生,可以有所作為的時機(jī)只有一次,那就是現(xiàn)在?。?! 目錄 文章目錄 前言 引言 一、堆的概念 二、堆的性質(zhì)? 三、堆的操作 3.1 向下調(diào)整算法 3.2?小根堆的創(chuàng)建 3.3?向上調(diào)整

    2024年02月07日
    瀏覽(31)
  • 經(jīng)典TopK問題、優(yōu)先級隊(duì)列 與 堆的糾葛一文為你解惑——數(shù)據(jù)結(jié)構(gòu)

    經(jīng)典TopK問題、優(yōu)先級隊(duì)列 與 堆的糾葛一文為你解惑——數(shù)據(jù)結(jié)構(gòu)

    前言: 本篇文章以 TopK 問題為引,具體闡述了 PriorityQueue 實(shí)現(xiàn)的基本邏輯——堆 數(shù)據(jù)結(jié)構(gòu),以及PriorityQueue 的常用方法。如有問題歡迎看官朋友指正,如果覺得文章還不錯的話,求點(diǎn)贊、收藏、評論 三連。 重點(diǎn): 堆的基本實(shí)現(xiàn)邏輯 PriorityQueue 運(yùn)用和源碼分析 TopK 問題的解法

    2023年04月22日
    瀏覽(18)
  • 【堆的認(rèn)識及其優(yōu)先級隊(duì)列】java代碼實(shí)現(xiàn),保姆級教程學(xué)習(xí)堆和優(yōu)先級隊(duì)列

    【堆的認(rèn)識及其優(yōu)先級隊(duì)列】java代碼實(shí)現(xiàn),保姆級教程學(xué)習(xí)堆和優(yōu)先級隊(duì)列

    前言: 大家好,我是 良辰 丫?????,我們又見面了,前面我們講了用鏈表實(shí)現(xiàn)的二叉樹,今天我們來接觸 堆 的概念,堆是一種特殊的二叉樹,只不過咱們的對底層原理是數(shù)組,堆也是我們在做題中經(jīng)常見到的,那么,接下來我們就慢慢的去接觸堆, 認(rèn)識堆,理解堆,掌

    2024年02月02日
    瀏覽(32)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包