Java優先キューの詳細な説明

1.優先キューの実装

優先度付きキューの実装では、ヒープデータ構造を選択でき、最大の優先度付きキューは大きなヒープを使用でき、最小の優先度付きキューは小さなヒープで実装できます。ヒープは、図に示すようにバイナリツリーです。未満。原則は、最小の優先度キューで以下に説明されています。最小優先度キューには、通常、セットSへの要素の挿入、セットS内で最小のキーを持つ要素の返却、セットS内で最小のキーを持つ要素の返却と削除などが含まれます。

挿入操作

挿入操作では、要素をセットSに挿入し、最初に要素をすべての要素の次の位置に配置してから、次の例に示すように「フロート」操作を実行します(下の図の例に注意してください)。は小さな山であり、写真はJava PriorityQueueの深い理解からのものです)

ここに画像の説明を挿入
操作を削除します

優先キューで、キューが空でない場合は、セットの最初の要素、つまり添え字0の要素を削除してから、セットの最後の要素を添え字0の位置に移動します。新しい要素は「シンク」操作。次の図の例(注、ただし原則は同じです。図はJava PriorityQueueの詳細な理解から得られたものです)

ここに画像の説明を挿入
ライブ学習と使用:
アルゴリズムの問​​題:

题目描述:
对于一个数组,寻找其前K个最小的元素

import java.util.Comparator;
import java.util.PriorityQueue;

class Solution {
    
    

    public void getLeastNumbers(int[] arr, int k) {
    
    
        int[] num = new int[k];

        //Queue<Integer> queue = new PriorityQueue<>((v1, v2) -> v2 - v1);
        PriorityQueue<Integer> queue = new PriorityQueue<>(k, new Comparator<Integer>() {
    
    
            @Override
            public int compare(Integer t1, Integer t2) {
    
    
                return t2 - t1;
            }//大根堆
        });
        for (int value : arr) {
    
    
            if (queue.size() < k)
                queue.offer(value);
            else {
    
    
                if (value < queue.peek()) {
    
    
                    queue.poll();
                    queue.offer(value);
                }
            }
        }
        for (int i = 0; i < k; i ++){
    
    
            num[i] = queue.poll();
        }
        for(int i=0;i<k;i++)
            System.out.print(num[i]+" ");
        //return num;
    }

    public static void main(String[] args) {
    
    
        Solution s=new Solution();
        int []arr={
    
    4,5,1,6,2,7,3,8};
        int k=4;
        s.getLeastNumbers(arr,4);
    }
}
返回结果:4 3 2 1 

おすすめ

転載: blog.csdn.net/fxwentian/article/details/115195995