pbootcms网站模板|日韩1区2区|织梦模板||网站源码|日韩1区2区|jquery建站特效-html5模板网

Java數(shù)據(jù)結(jié)構(gòu)之堆(優(yōu)先隊(duì)列)的實(shí)現(xiàn)

堆(優(yōu)先隊(duì)列)是一種典型的數(shù)據(jù)結(jié)構(gòu),其形狀是一棵完全二叉樹,一般用于求解topk問題。本文將利用Java語言實(shí)現(xiàn)堆,感興趣的可以學(xué)習(xí)一下

堆(優(yōu)先隊(duì)列)是一種典型的數(shù)據(jù)結(jié)構(gòu),其形狀是一棵完全二叉樹,一般用于求解topk問題。根據(jù)雙親節(jié)點(diǎn)大于等于孩子節(jié)點(diǎn)或雙親節(jié)點(diǎn)小于等于孩子節(jié)點(diǎn),可分為大頂堆和小頂堆,本文實(shí)現(xiàn)大頂堆。

根據(jù)大頂堆的定義,大頂堆的雙親節(jié)點(diǎn)大于等于其孩子節(jié)點(diǎn),堆頂元素最大,對于每一個(gè)子樹都是一個(gè)大頂堆,則從最后一個(gè)雙親節(jié)點(diǎn)進(jìn)行調(diào)整為大頂堆,一直到根節(jié)點(diǎn),則可構(gòu)建一個(gè)大頂堆。

我們這里采用數(shù)組去存儲(chǔ),以heap={3,2,1,5,6,4}為例,需要一個(gè)init(int[] heap)初始化方法,從最后一個(gè)雙親節(jié)點(diǎn)開始將heap逐漸調(diào)整為大頂堆,其中需要使用到adjust(int[] heap, int i, int end)方法。

調(diào)整過程:從最后一個(gè)雙親節(jié)點(diǎn)出發(fā),如果以當(dāng)前雙親節(jié)點(diǎn)為根的樹不符合大頂堆,則進(jìn)行調(diào)整。

圖片

代碼實(shí)現(xiàn)如下:

public void init(int[] heap) {
        //從最后一個(gè)雙親節(jié)點(diǎn)開始調(diào)整
        //逐漸往上進(jìn)行調(diào)整
        for (int i = heap.length / 2 ; i > 0 ; i-- ) {
            this.adjust(heap, i, heap.length);
        }
    }

    public void adjust(int[] heap, int i, int end) {
        int j = i << 1;
        while (j <= end) {
            //找到兩個(gè)孩子節(jié)點(diǎn)z中較大的節(jié)點(diǎn)
            if (j < end && heap[j - 1] < heap[j]) {
                j = j + 1;
            }
            //如果較大節(jié)點(diǎn)還小于根節(jié)點(diǎn),則以當(dāng)前節(jié)點(diǎn)為根節(jié)點(diǎn)的
            //二叉樹已經(jīng)是大頂堆,不需要進(jìn)行調(diào)整
            if (heap[i - 1] > heap[j - 1]) {
                break;
            }
            //進(jìn)行調(diào)整,將當(dāng)前節(jié)點(diǎn)換到較大位置,再從當(dāng)前位置進(jìn)行調(diào)整
            int temp = heap[i - 1];
            heap[i - 1] = heap[j - 1];
            heap[j - 1] = temp;
            i = j;
            j = i << 1;
        }
    }

構(gòu)建好了大頂堆之后,我們?nèi)绾吻蟮胻opk呢,此時(shí)堆頂元素為top1,我們只需要將top1元素拿走,將剩下元素調(diào)整為大頂堆,k次之后即可得到topk。

具體過程:我們將堆頂元素與最后一個(gè)元素進(jìn)行交換,然后將堆頂?shù)降箶?shù)第二個(gè)元素進(jìn)行調(diào)整,依次類推。

圖片

以leetcode215數(shù)組中第k個(gè)最大元素為例:

給定整數(shù)數(shù)組 nums 和整數(shù) k,請返回?cái)?shù)組中第 k 個(gè)最大的元素。

請注意,你需要找的是數(shù)組排序后的第 k 個(gè)最大的元素,而不是第 k 個(gè)不同的元素

public int findKthLargest(int[] nums, int k) {
        this.init(nums);
        //找到第k大的數(shù)
        int end = nums.length;
        while (k > 1) {
            //將當(dāng)前堆頂元素放到末尾,進(jìn)行堆調(diào)整
            int temp = nums[0];
             nums[0] = nums[end - 1];
             nums[end - 1] = temp;
             end = end - 1;
             -- k;
             this.adjust(nums, 1, end);
        }
        return nums[0];
    }   

圖片

此外,Java本身提供了優(yōu)先隊(duì)列集合類,但是對于這個(gè)題目效率不如自己實(shí)現(xiàn)的高

public int findKthLargest(int[] nums, int k) {
        PriorityQueue<Integer> priorityQueue = new PriorityQueue<>(k);
        for (int num : nums) {
            if (priorityQueue.size() == k) {
                if (num > priorityQueue.peek()) {
                    priorityQueue.poll();
                    priorityQueue.add(num);
                }
                continue;
            }
            priorityQueue.add(num);
        }
        return priorityQueue.poll();
    }

圖片

到此這篇關(guān)于Java數(shù)據(jù)結(jié)構(gòu)之堆(優(yōu)先隊(duì)列)的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Java 堆內(nèi)容請搜索html5模板網(wǎng)以前的文章希望大家以后多多支持html5模板網(wǎng)!

【網(wǎng)站聲明】本站部分內(nèi)容來源于互聯(lián)網(wǎng),旨在幫助大家更快的解決問題,如果有圖片或者內(nèi)容侵犯了您的權(quán)益,請聯(lián)系我們刪除處理,感謝您的支持!

相關(guān)文檔推薦

Dijkstra(迪杰斯特拉)算法是典型的單源最短路徑算法,用于計(jì)算一個(gè)節(jié)點(diǎn)到其他所有節(jié)點(diǎn)的最短路徑。本文將詳解該算法的圖解與實(shí)現(xiàn),需要的可以參考一下
這篇文章主要介紹了Java中ThreadLocal導(dǎo)致內(nèi)存OOM的原因分析,文章基于Java的相關(guān)內(nèi)容展開ThreadLocal導(dǎo)致內(nèi)存OOM的原因分析,需要的小伙v阿布可以參考一下
這篇文章主要介紹了Java中CyclicBarrier?循環(huán)屏障,可以實(shí)現(xiàn)讓一組線程等待至某個(gè)狀態(tài)屏障點(diǎn)之后再全部同時(shí)執(zhí)行,下面文章分享CyclicBarrier循環(huán)屏障的原理,需要的小伙伴可以參考一下
這篇文章主要介紹了利用Java代碼寫一個(gè)并行調(diào)用模板,文章基于Java的相關(guān)內(nèi)容展開寫一個(gè)并行調(diào)用模板的詳細(xì)介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
API(Application?Programming?Interface)應(yīng)用程序編程接口,java?API是一本程序員字典,是JDK提供給我們使用的類的說明文檔,下面這篇文章主要給大家介紹了關(guān)于Java高版本Api在Android中的使用方法,需
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)聊天室界面,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
主站蜘蛛池模板: 消泡剂-水处理消泡剂-涂料消泡剂-切削液消泡剂价格-东莞德丰消泡剂厂家 | 国产频谱分析仪-国产网络分析仪-上海坚融实业有限公司 | 济南拼接屏_山东液晶拼接屏_济南LED显示屏—维康国际官网 | ◆大型吹塑加工|吹塑加工|吹塑代加工|吹塑加工厂|吹塑设备|滚塑加工|滚塑代加工-莱力奇塑业有限公司 | 撕碎机_轮胎破碎机_粉碎机_回收生产线厂家_东莞华达机械有限公司 | 阻垢剂-反渗透缓蚀阻垢剂厂家-山东鲁东环保科技有限公司 | 深圳市宏康仪器科技有限公司-模拟高空低压试验箱-高温防爆试验箱-温控短路试验箱【官网】 | 校园文化空间设计-数字化|中医文化空间设计-党建|法治廉政主题文化空间施工-山东锐尚文化传播公司 | 深圳市宏康仪器科技有限公司-模拟高空低压试验箱-高温防爆试验箱-温控短路试验箱【官网】 | 润滑油加盟_润滑油厂家_润滑油品牌-深圳市沃丹润滑科技有限公司 琉璃瓦-琉璃瓦厂家-安徽盛阳新型建材科技有限公司 | LINK FASHION 童装·青少年装展 河南卓美创业科技有限公司-河南卓美防雷公司-防雷接地-防雷工程-重庆避雷针-避雷器-防雷检测-避雷带-避雷针-避雷塔、机房防雷、古建筑防雷等-山西防雷公司 | 工业机械三维动画制作 环保设备原理三维演示动画 自动化装配产线三维动画制作公司-南京燃动数字 聚合氯化铝_喷雾聚氯化铝_聚合氯化铝铁厂家_郑州亿升化工有限公司 | 环氧树脂地坪漆_济宁市新天地漆业有限公司 | 大型工业风扇_工业大风扇_大吊扇_厂房车间降温-合昌大风扇 | 微信聊天记录恢复_手机短信删除怎么恢复_通讯录恢复软件下载-快易数据恢复 | 粉丝机械,粉丝烘干机,粉丝生产线-招远市远东粉丝机械有限公司 | 氧化锆纤维_1800度高温退火炉_1800度高温烧结炉-南京理工宇龙新材料股份有限公司 | 山东臭氧发生器,臭氧发生器厂家-山东瑞华环保设备 | 电竞学校_电子竞技培训学校学院-梦竞未来电竞学校官网 | VI设计-LOGO设计公司-品牌设计公司-包装设计公司-导视设计-杭州易象设计 | 湖南印刷厂|长沙印刷公司|画册印刷|挂历印刷|台历印刷|杂志印刷-乐成印刷 | 一体化预制泵站-一体化提升泵站-一体化泵站厂家-山东康威环保 | Akribis直线电机_直线模组_力矩电机_直线电机平台|雅科贝思Akribis-杭州摩森机电科技有限公司 | 润滑脂-高温润滑脂-轴承润滑脂-食品级润滑油-索科润滑油脂厂家 | 硅胶制品-硅橡胶制品-东莞硅胶制品厂家-广东帝博科技有限公司 | 提升海外网站流量,增加国外网站访客UV,定制海外IP-访客王 | 武汉EPS线条_EPS装饰线条_EPS构件_湖北博欧EPS线条厂家 | hdpe土工膜-防渗膜-复合土工膜-长丝土工布价格-厂家直销「恒阳新材料」-山东恒阳新材料有限公司 ETFE膜结构_PTFE膜结构_空间钢结构_膜结构_张拉膜_浙江萬豪空间结构集团有限公司 | 澳门精准正版免费大全,2025新澳门全年免费,新澳天天开奖免费资料大全最新,新澳2025今晚开奖资料,新澳马今天最快最新图库-首页-东莞市傲马网络科技有限公司 | 济南保安公司加盟挂靠-亮剑国际安保服务集团总部-山东保安公司|济南保安培训学校 | 济宁工业提升门|济宁电动防火门|济宁快速堆积门-济宁市统一电动门有限公司 | 水质传感器_水质监测站_雨量监测站_水文监测站-山东水境传感科技有限公司 | DDoS安全防护官网-领先的DDoS安全防护服务商 | 鄂泉泵业官网|(杭州、上海、全国畅销)大流量防汛排涝泵-LW立式排污泵 | 丝印油墨_水性油墨_环保油墨油漆厂家_37国际化工 | 干培两用箱-细菌恒温培养箱-菲斯福仪器 | 河南包装袋厂家_河南真空袋批发价格_河南服装袋定制-恒源达包装制品 | 翻斗式矿车|固定式矿车|曲轨侧卸式矿车|梭式矿车|矿车配件-山东卓力矿车生产厂家 | 无菌实验室规划装修设计-一体化实验室承包-北京洁净净化工程建设施工-北京航天科恩实验室装备工程技术有限公司 | 菏泽知彼网络科技有限公司| 广州食堂承包_广州团餐配送_广州堂食餐饮服务公司 - 旺记餐饮 |