开源C语言库Melon斐波那契堆
本篇介绍开源C语言库Melon的斐波那契堆的使用。关于Melon库,这是一个开源的C语言库,它具有:开箱即用、无第三方依赖、安装部署简单、中英文文档齐全等优势。
Github:github。comWaterMelonMelon简介
关于斐波那契堆,感兴趣的朋友可以参考《算法导论》或者是各类讲解博客。
本篇介绍的是斐波那契最小堆,但对于判断条件和初始化属性进行调整后,也可实现最大堆。
数据结构各类操作时间复杂度:创建堆:O(1)插入:O(1)取最小值:O(1)将最小值从堆中移除:O(logN)合并堆:O(1)将堆结点key值减小:O(1)移除某个堆结点:O(logN)
由此,我们可以看到斐波那契堆非常适合频繁插入和删除以及取得极值(最小值)结点操作。这样的操作第一个能想到的场景就是实现对超时定时器的管理。使用
我们先给出示例代码:includestdio。hincludestdlib。hincludemlncore。hincludemlnlog。hincludemlnfheap。hstaticintcmphandler(constvoidkey1,constvoidkey2){return(int)key1(int)key2?0:1;}staticvoidcopyhandler(voidoldkey,voidnewkey){(int)oldkey(int)newkey;}intmain(intargc,charargv〔〕){inti10,min0;mlnfheaptfh;mlnfheapnodetfn;structmlnfheapattrfattr;structmlncoreattrcattr;cattr。argcargc;cattr。argvargv;cattr。globalinitNULL;cattr。masterprocessNULL;cattr。workerprocessNULL;if(mlncoreinit(cattr)0){fprintf(stderr,initfailed);return1;}fattr。poolNULL;fattr。poolallocNULL;fattr。poolfreeNULL;fattr。cmpcmphandler;fattr。copycopyhandler;fattr。keyfreeNULL;fattr。minvalmin;fattr。minvalsizesizeof(min);fhmlnfheapnew(fattr);if(fhNULL){mlnlog(error,fheapinitfailed。);return1;}fnmlnfheapnodenew(fh,i);if(fnNULL){mlnlog(error,fheapnodeinitfailed。);return1;}mlnfheapinsert(fh,fn);fnmlnfheapminimum(fh);mlnlog(debug,d,((int)mlnfheapnodekey(fn)));mlnfheapfree(fh);return0;}
main函数中的流程大致如下:对Melon库进行初始化设置斐波那契堆初始化属性对斐波那契堆进行初始化创建斐波那契堆结点将新建的斐波那契堆结点插入堆中取斐波那契堆中最小key值的堆结点销毁斐波那契堆结构
Melon中,使用斐波那契堆需要引入mlnfheap。h头文件。
这里要对堆初始化属性进行一番说明:structmlnfheapattr{voidpool;fheappoolallochandlerpoolalloc;fheappoolfreehandlerpoolfree;fheapcmpcmp;fheapcopycopy;fheapkeyfreekeyfree;voidminval;mlnsizetminvalsize;};
其中:pool是用于支持用户自定义内存池之用的,该指针将于poolalloc和poolfree配合使用。poolalloc是用于支持用户自定义分配内存之用,该函数指针第一个参数为pool,第二个参数是要分配的内存大小。poolfree是用于支持用户自定义释放内存之用,该函数指针第一个参数为要释放的内存起始地址。cmp是用于对两个堆结点所关联的用户自定义数据进行比较大小之用的。copy是用于将堆结点key值减小(decreasekey)时,将新key值(即用户自定义结构)拷贝到老key值中。keyfree是用于对堆结点所关联的用户自定义数据进行释放之用的。minval用户自定义结构的最小值,因为这里实现的是最小堆,因此需要给出一个相对所有插入本堆的结点而言都小的最小值范例。minvalsize用户自定义最小值结构所占字节数,即minval指向的结构的字节大小。
这些属性字段中,除cmp,copy,minval和minvalsize外,其余若无需求,则可以置NULL。
内存池和分配释放函数主要是用于堆结点的分配和释放之用。之所以不直接给出一个Melon实现的内存池结构指针,是因为不希望斐波那契堆代码与内存池类型强关联,这样允许斐波那契堆可以接入使用者自己定义的内存管理功能。
关于斐波那契堆代码的演进,与此前红黑树文章基本类似,再次就不过多阐述了。
斐波那契堆在整个Melon框架中的使用场景基本都是在超时定时器的维护上面。结语
在Melon中,斐波那契堆的使用相较于红黑树而言确实少了很多,因此其演进的速度相对来说会慢一些,演化方向也会受到类似红黑树结构演进的影响。
同时,因为使用并不是很广泛,因此此前也有用户发起了issue,提出了堆结构存在实现错误,并给出了问题点。当然,问题早已被修复和验证。
在此非常感谢各位使用者的使用和反馈,你们的反馈也是Melon库前进的动力。
欢迎各位对Melon感兴趣的读者访问其Github仓库github。comWaterMelonMelon。
感谢阅读!
张忆东今年A股当红炸子鸡是数字经济,央国企价值重估行情才刚开始核心观点1美债长端收益率近期的上升已经是强弩之末,美债10年期收益率目前4。1这个位置,大概率就是年内的高点附近。人民币将有望震荡升值,中国资产的吸引力将会改善提升。2可能在今年岁
宁德时代宜春枧下窝选矿厂基建完工时间存疑,已较原计划延期3月8日,国内有媒体报道,宁德时代旗下江西宜春枧下窝矿区选矿厂一期主体建设预期于4月份完工。另据福建水投集团公众号显示,上述选矿厂配套尾矿库已经开始施工,工程一期排洪主洞已贯通。不
网约车订单增多,却不见司机增收,增多的订单收益都去哪了?网约车行业迎来旺季,订单大幅增加2023年以来,气温的回升疫情的好转似乎让各行各业都迎来了旺季,出行行业亦是如此,用热闹来形容今年的网约车行业怎么都不为过。不管是从人们出行对网约车
省直管参保单位退休人员,养老金资格认证这么办!养老金资格认证开展领取养老金资格认证,是保障全体参保人员合法权益,维护退休人员养老钱安全的重要措施。根据国家和我省有关规定,符合领取养老金条件的退休人员一年至少进行一次领取待遇资格
本地招聘漳州三家国企招人!最新!!!漳州三家国企招聘岗位公布01hr漳州市龙文发展旅游投资服务有限公司漳州市龙文发展旅游投资服务有限公司是龙文区重点国有企业漳州市龙文发展集团有限公司旗下子公司,所属行业为商
UP青年两会有我丨90后新农人为乡村振兴贡献青年力量视频加载中当年为照顾患癌养父,辞职回村创业的女孩,今年当选了全国人大代表!90后新农人张志菊不仅开起了合作社,还学拍摄学直播学分析。在她的带动下,家乡农产品的销路越来越好。她说我想
乔治为赢球威少会竭尽所能他是团队为先的球员直播吧3月9日讯今日NBA常规赛,快船在主场以108100击败猛龙。在赛后接受采访时,乔治称赞了威少,他这样说道为了赢得比赛威少会竭尽所能,他是团队为先的球员。在球场上,他会不惜一
董卿最大的悲哀,就是好口碑都毁在了丈夫手里作为昔日的央视一姐,董卿曾抵达的高度,几乎是内娱女主持天花板。董卿十三次登上央视春晚,成为国民度最高的央视主持人之一。凭借朗读者中国诗词大会等文化知识类节目,董卿以知性和博学家喻户
西山版纳美女和记者的爱情张志是一名来自北方的记者,他远赴云南西山版纳进行一次深度采访。在这里,他看到了美丽的风景和多姿多彩的民族文化,但最让他印象深刻的是一位名叫张丽的美丽女孩。张丽是当地的一位少数民族姑
两会访谈付胜利加大油转特支持力度助力炼油行业升级加大油转特支持力度助力炼油行业升级访全国人大代表,中国石化荆门分公司机电仪中心电气维修主任技师付胜利近年来我国炼油与化工产业持续快速发展壮大,大型炼化项目相继投产,开启了国内大炼油
透明人体骨骼视觉艺术博物馆X光线扫描可以帮助人类看到人体内部的骨骼结构和组织情况。在进行X光线扫描时,人体会暴露于低剂量的X光辐射下,这种辐射会被人体内部的组织吸收不同的程度。接着,X光线通过人体后,被探测