游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

CollectionPriorityQueue源码解析,原来

  概述
  前面以JavaArrayDeque为例讲解了Stack和Queue,其实还有一种特殊的队列叫做PriorityQueue,即优先队列。优先队列的作用是能保证每次取出的元素都是队列中权值最小的(Java的优先队列每次取最小元素,C的优先队列每次取最大元素)。这里牵涉到了大小关系,元素大小的评判可以通过元素本身的自然顺序(naturalordering),也可以通过构造时传入的比较器(Comparator,类似于C的仿函数)。
  Java中PriorityQueue实现了Queue接口,不允许放入null元素;其通过堆实现,具体说是通过完全二叉树(completebinarytree)实现的小顶堆(任意一个非叶子节点的权值,都不大于其左右子节点的权值),也就意味着可以通过数组来作为PriorityQueue的底层实现。
  〔
  上图中我们给每个元素按照层序遍历的方式进行了编号,如果你足够细心,会发现父节点和子节点的编号是有联系的,更确切的说父子节点的编号之间有如下关系:
  leftNoparentNo21
  rightNoparentNo22
  parentNo(nodeNo1)2
  通过上述三个公式,可以轻易计算出某个节点的父节点以及子节点的下标。这也就是为什么可以直接用数组来存储堆的原因。
  PriorityQueue的peek()和element操作是常数时间,add(),offer(),无参数的remove()以及poll()方法的时间复杂度都是log(N)。方法剖析add()和offer()
  add(Ee)和offer(Ee)的语义相同,都是向优先队列中插入元素,只是Queue接口规定二者对插入失败时的处理不同,前者在插入失败时抛出异常,后则则会返回false。对于PriorityQueue这两个方法其实没什么差别。
  新加入的元素可能会破坏小顶堆的性质,因此需要进行必要的调整。offer(Ee)publicbooleanoffer(Ee){if(enull)不允许放入null元素thrownewNullPointerException();modCount;intisize;if(iqueue。length)grow(i1);自动扩容sizei1;if(i0)队列原来为空,这是插入的第一个元素queue〔0〕e;elsesiftUp(i,e);调整returntrue;}复制代码
  上述代码中,扩容函数grow()类似于ArrayList里的grow()函数,就是再申请一个更大的数组,并将原数组的元素复制过去,这里不再赘述。需要注意的是siftUp(intk,Ex)方法,该方法用于插入元素x并维持堆积的特性。privatevoidsiftUp(intk,Ex){if(comparator!null)siftUpUsingComparator(k,x);elsesiftUpComparable(k,x);}SuppressWarnings(unchecked)privatevoidsiftUpComparable(intk,Ex){Comparablelt;?superEkey(Comparablelt;?superE)x;while(k0){intparent(k1)1;Objectequeue〔parent〕;if(key。compareTo((E)e)0)break;queue〔k〕e;kparent;}queue〔k〕key;}SuppressWarnings(unchecked)privatevoidsiftUpUsingComparator(intk,Ex){while(k0){intparent(k1)1;Objectequeue〔parent〕;if(comparator。compare(x,(E)e)0)break;queue〔k〕e;kparent;}queue〔k〕x;}复制代码
  新加入的元素x可能会破坏小顶堆的性质,因此需要进行调整。调整的过程为:从k指定的位置开始,将x逐层与当前点的parent进行比较并交换,直到满足xqueue〔parent〕为止。注意这里的比较可以是元素的自然顺序,也可以是依靠比较器的顺序。element()和peek()
  element()和peek()的语义完全相同,都是获取但不删除队首元素,也就是队列中权值最小的那个元素,二者唯一的区别是当方法失败时前者抛出异常,后者返回null。根据小顶堆的性质,堆顶那个元素就是全局最小的那个;由于堆用数组表示,根据下标关系,0下标处的那个元素即是堆顶元素。所以直接返回数组0下标处的那个元素即可。
  代码也就非常简洁:peek()publicEpeek(){if(size0)returnnull;return(E)queue〔0〕;0下标处的那个元素就是最小的那个}复制代码remove()和poll()
  remove()和poll()方法的语义也完全相同,都是获取并删除对首元素,区别是当方法失败时前者抛出异常,后者返回null。由于删除操作会改变队列的结构,为维护小顶堆的性质,需要进行必要的调整。
  publicEpoll(){if(size0)returnnull;intssize;modCount;Eresult(E)queue〔0〕;0下标处的那个元素就是最小的那个Ex(E)queue〔s〕;queue〔s〕null;if(s!0)siftDown(0,x);调整returnresult;}复制代码
  上述代码首先记录0下标处的元素,并用最后一个元素替换0下标位置的元素,之后调用siftDown()方法对堆进行调整,最后返回原来0下标处的那个元素(也就是最小的那个元素)。重点是siftDown(intk,Ex)方法,该方法的作用是从k指定的位置开始,将x逐层向下与当前点的左右孩子中较小的那个交换,直到x小于或等于左右孩子中的任何一个为止。siftDown()privatevoidsiftDown(intk,Ex){inthalfsize1;while(khalf){首先找到左右孩子中较小的那个,记录到c里,并用child记录其下标intchild(k1)1;leftNoparentNo21Objectcqueue〔child〕;intrightchild1;if(rightsizecomparator。compare((E)c,(E)queue〔right〕)0)cqueue〔childright〕;if(comparator。compare(x,(E)c)0)break;queue〔k〕c;然后用c取代原来的值kchild;}queue〔k〕x;}复制代码remove(Objecto)
  remove(Objecto)方法用于删除队列中跟o相等的某一个元素(如果有多个相等,只删除一个),该方法不是Queue接口内的方法,而是Collection接口的方法。由于删除操作会改变队列结构,所以要进行调整;又由于删除元素的位置可能是任意的,所以调整过程比其它函数稍加繁琐。具体来说,remove(Objecto)可以分为2种情况:1。删除的是最后一个元素。直接删除即可,不需要调整。2。删除的不是最后一个元素,从删除点开始以最后一个元素为参照调用一次siftDown()即可。此处不再赘述。
  具体代码如下:remove(Objecto)publicbooleanremove(Objecto){通过遍历数组的方式找到第一个满足o。equals(queue〔i〕)元素的下标intiindexOf(o);if(i1)returnfalse;intssize;if(si)情况1queue〔i〕null;else{Emoved(E)queue〔s〕;queue〔s〕null;siftDown(i,moved);情况2。。。。。。}returntrue;}

景区门票免费领!大圣故里来长邀客华声在线4月10日讯(记者刘思佳)登花果神山、览海滨风光、品优质海鲜、泡宜人温泉4月10日,连云港文化旅游推介会走进长沙,邀请长沙市民到大圣故里感受独特魅力。连云港文化旅……曼联两位大牌弃将待遇不同马奎尔被安抚,C罗仍想走文羊城晚报全媒体记者徐扬扬曼联击败利物浦触底反弹后,两位被放在替补席的大牌弃将,如今反倒备受外界关注。据8月24日的最新消息,马奎尔已与曼联主教练滕哈格沟通,并受到安抚,……天赋锋线巅峰不在,周鹏坚若磐石中国男篮的内线此前一直在国际赛场占据优势,姚明、王治郅、巴特尔等人被称为中国长城。锋线球员却很难得到重用,哪怕是朱芳雨巅峰时期,也很难在技战术中占据很高的地位。此前本土锋线球员……蒋泉龙从身价百亿到负债十五亿,一代稀土大王的没落之路从3000元到100亿,他用了29年;从100亿到负债15亿,他只用了8年。他曾经是中国稀土的领军人,靠一己之力建立了庞大的稀土帝国,令人艳羡;如今,他和儿子……阴阳师寝肥阵容怎么搭配寝肥阵容搭配攻略2022在《阴阳师》中很多玩家还不清楚寝肥阵容怎么搭配。接下来就让小编给大家带来《阴阳师》寝肥阵容搭配攻略2022,感兴趣的小伙伴们一起来看看吧。《阴阳师》寝肥阵容搭配攻略202……脚跟这样抬一抬,血压稳了湿气走了,连脾胃都好了!踮脚是一种广为人知的传统养生方式,沿用至今已有800余年的历史了。早在古籍中就有相关记载:敦踵以利胸中、敦踵,一敦左,一敦右,三百而已。说起踮脚的作用,很多人只知道……生吃花生和熟吃花生,还有这么大区别?原来我一直吃错了花生有长寿果的美誉,一年四季都可以吃到花生,物美价廉,营养价值也比较高,花生当中含有丰富的蛋白质,脂肪以及氨基酸和各种矿物质,在平时除了直接吃水煮花生米油炸花生米之外,还可以用……中非合作成果丰硕新华社内罗毕8月19日电(记者朱绍斌)中非合作论坛第八届部长级会议成果落实协调人会议18日以视频连线方式举行。各方就致力于加快构建新时代中非命运共同体、壮大发展中国家团结合作、……不再是遥控器!曝小米MIXFOLD2折叠屏手机外屏比例219昨日,数码博主数码闲聊站确认,小米MIXFOLD2的外屏分辨率达到了2520x1080,比例21:9,回归主流屏幕比例,不再是遥控器。据此前报道,小米MIXFOLD2通过……阳康后孩子体弱不长个?抓住春季排寒助长好时机第一波疫情结束后,很多人都只关注到成人有阳康后遗症,殊不知小儿也有。很多孩子在阳康后,咳嗽没了,但却经常嗜睡乏力、胃口也不好,家长也没当一回事,最近一开学,家长却突然发现自家孩……司马南熄火,联想还是那个联想,杨元庆欢呼刷新纪录最近,特别是自从我国传统新年一过,联想事件在我国舆论场的声音渐渐小了,司马南也很久没有对联想进行新一轮的开火了,似乎安静了不少,联想应该可以缓口气了。最近,联想又迎来了破纪录的……首发天玑90005G移动平台,OPPOFindX5渲染图曝光12月29日消息,搭载高通骁龙85G移动平台的产品目前已经陆续发布,至于许多人可能更加关注的联发科天玑9000机型就要等到明年第一季了。在之前的联发科发布会期间,基本已经……
5本超燃体育书让我们激情澎湃的,不止足球每届世界杯,都是球迷们的狂欢,十几亿人在屏幕前或哭泣或尖叫。就算你不喜欢足球,也无法否认这项运动的冒险、热血与激情。其实不光是足球,其他运动项目也各有着让人热血沸腾……冬奥会拟表彰名单曝光谷爱凌武大靖均在列,72岁张艺谋三喜临门4月2日,人民日报对外公示了一批在北京冬奥会、残奥会筹办和竞赛中作出突出贡献的人员名单,共150人成为这次冬奥会、残奥会突出个人拟表彰对象。在曝光的150个人名中,我们看……英超威武!曼联读秒绝杀,阿森纳10出线在望,欧战7队不败北京时间10月14日凌晨,欧战继续进行。欧联杯方面,阿森纳10击败博德闪耀,曼联则是读秒绝杀奥莫尼亚。欧会杯赛场,西汉姆联21险胜安德莱赫特,英超球队风光无限。此前的欧冠……零基础入门学Python(03)matplotlib数据可视大家也都可以抖音我,直接搜索艾文编程,欢迎大家关注。学习目标Matplotlib概念和用途导入Matplotlib包设置风格三种绘制图的方式……今日欧美明星时尚街拍图集(2022年12月21日)今日欧美明星时尚街拍图集(2022年12月21日)时尚欧美明星的街拍就是行走在马路上的秀场,明星们的街拍就是时尚界的潮流风向标。明星们身穿什么牌子的衣服、肩背什么大牌包包……我国要坐17天的火车,费用万元起步,配有专属管家,却一票难求说到火车,相信很多小伙伴们都有乘坐火车的经历,不管是硬座,硬卧还是软卧,对于短途出行来说都是非常便捷的。但长途出行的小伙伴们却有点难受了,毕竟长时间的或坐或卧都是非常难受的。……小麦市场风向已变,结果只能是以卵击石,3月27日小麦价格小麦市场低价麦一个在农户的手中,一个在储备库的手中,高价麦一个在贸易商的手中,一个在面粉企业的手中。而储备库上周拍卖成交在1。51。52元斤,价格直线下跌。要知道,这个价格全部……中国仅30产妇使用无痛分娩?八个问题打消你的顾虑受访专家:中国妇幼保健协会麻醉专业委员会主任委员徐铭军环球时报健康客户端记者牛雨蕾近日,国家卫健委分娩镇痛试点专家工作组组长米卫东称,全国开展分娩镇痛试点工作距今已……医生提醒男人早起的三个坏习惯,比喝酒还要伤肝,现在改还不晚肝脏,是人体内不可或缺的重要器官,其主要的功能是代谢,兼具去氧化、储存肝糖原、分泌性蛋白质、制造促进消化的胆汁等多重功能。对人来说,它不仅是最大的器官,重要性也是不言而喻。……国庆假期,红色旅游景点游客量有所增加10月3日,国庆假期的第三天,丽江古城景区人流渐多,沿街商铺、大小景点以及主干道路国旗高挂,处处可见耀眼的中国红。十一长假,各地红色旅游热度上涨,不少游客选择走进革命历史……国庆马上到来,招待客人必备9道待客菜,好吃不贵,一上桌就光盘大家好,这里是小慧今天说美食,国庆节马上到来了,家里都会来客人,给大家分享招待客人必备的九道家常菜,好吃还不贵,一上桌就光盘,每袋菜的做法也非常简单,小慧把每道菜的家常做法,给……量子科技为何能获诺贝尔奖,官方回复来了近日,瑞典皇家科学院宣布,将2022年诺贝尔物理学奖授予阿兰阿斯佩(AlainAspect)、约翰克劳泽(JohnF。Clauser)和安东塞林格(AntonZeilinger……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网