位置: 编程技术 - 正文

PHP利用二叉堆实现TopK-算法的方法详解(php实现二叉树)

编辑:rootadmin

推荐整理分享PHP利用二叉堆实现TopK-算法的方法详解(php实现二叉树),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:二叉堆的实现,二叉堆 数组,二叉堆排序,php实现二叉树,二叉堆 数组,php实现二叉树遍历,php实现二叉树遍历,php实现二叉树,内容如对您有帮助,希望把文章链接给更多的朋友!

前言

在以往工作或者面试的时候常会碰到一个问题,如何实现海量TopN,就是在一个非常大的结果集里面快速找到最大的前或前个数,同时要保证内存和速度的效率,我们可能第一个想法就是利用排序,然后截取前或前,而排序对于量不是特别大的时候没有任何问题,但只要量特别大是根本不可能完成这个任务的,比如在一个数组或者文本文件里有几亿个数,这样是根本无法全部读入内存的,所以利用排序解决这个问题并不是最好的,所以我们这里就用php去实现一个小顶堆来解决这个问题.

二叉堆

二叉堆是一种特殊的堆,二叉堆是完全二叉树或者是近似完全二叉树,二叉堆有两种,最大堆 和 最小堆,最大堆:父结点的键值总是大于或等于任何一个子节点的键值;最小堆:父结点的键值总是小于或等于任何一个子节点的键值

小顶堆-(图片来自网络)

二叉堆一般用数组来表示(看上图),例如,根节点在数组中的位置是0,第n个位置的子节点分别在2n+1和 2n+2,因此,第0个位置的子节点在1和2,1的子节点在3和4,以此类推,这种存储方式便於寻找父节点和子节点。

具体概念问题这里就不在多说了,如果对二叉堆有疑问的可以在好好了解下这个数据结构,下面我们就针对上述topN问题来用php代码实现并解决,为了看出区别这里先用排序的方式去实现下看下效果如何。

利用快速排序算法来实现 TopN

运行之后结果

PHP利用二叉堆实现TopK-算法的方法详解(php实现二叉树)

可以看到上面打印出了top的结果,并输出了下运行时间,大概s左右,但这只是w个数且全部能装入内存的情况,如果我们有一个文件里面有5kw或5亿个数,肯定就会有些问题了.

利用二叉堆算法来实现 TopN

实现流程是:

1、先读取个或个数到数组里面,这就是我们的topN数.

2、调用生成小顶堆函数,把这个数组生成一个小顶堆结构,这个时候堆顶一定是最小的.

3、从文件或者数组依次遍历剩余的所有数.

4、每遍历出来一个则跟堆顶的元素进行大小比较,如果小于堆顶元素则抛弃,如果大于堆顶元素则替换之.

5、跟堆顶元素替换完毕之后,在调用生成小顶堆函数继续生成小顶堆,因为需要再找出来一个最小的.

6、重复以上4~5步骤,这样当全部遍历完毕之后,我们这个小顶堆里面的就是最大的topN,因为我们的小顶堆永远都是排除最小的留下最大的,而且这个调整小顶堆速度也很快,只是相对调整下,只要保证根节点小于左右节点就可以.

7、算法复杂度的话按top最坏的情况下,就是每遍历一个数,如果跟堆顶进行替换,需要调整次的情况,也要比排序速度快,而且也不是把所有的内容全部读入内存,可以理解成就是一次线性遍历.

运行之后结果

可以看到最终的结果也是top,只不过时间只用了1s左右,而且无论是内存还是时间效率都满足我们的要求,而且跟排序比最好的一点就是不用把所有的数据集都读如到内存里面来,因为我们不需要排序,而上面是为了演示,所以直接在内存构造了w元素,然而我们可以把这个全部转移到文件里面去,然后一行一行读取进行比较,因为我们这个数据结构的核心点就是线性遍历跟内存里面很小的小顶堆结构进行比较,最终得到TopN.

总结

最后想说的就是 算法+数据结构 真的非常重要,一个好的算法可以使我们的效率大大提高。好了,

标签: php实现二叉树

本文链接地址:https://www.jiuchutong.com/biancheng/292557.html 转载请保留说明!

上一篇:mac系统下安装多个php并自由切换的方法详解(macos安装多版macos并存)

下一篇:php读取XML的常见方法实例总结(php读取文件)

  • 百旺金税盘官网
  • 税率中的速算扣除数是什么
  • 信息技术服务可以简易征收吗
  • 为什么要结转发出材料成本差异
  • 小规模开的专票能抵扣进项税吗
  • 公司筹建期间可以多久
  • 高新技术企业所得税减免怎么算
  • 互联网公司如何盈利
  • 滴滴出行发票可以抵扣进项税吗
  • 国际船舶代理是什么意思
  • 投资收益可以计入营业收入吗
  • 计提的应付利息怎么冲回
  • 每月增值税怎么做账
  • 结转劳务费
  • 融资租赁的固定资产由承租方进行核算,体现了( )原则
  • 自产产品赠送确认收入吗
  • 企业利息收入要交所得税吗
  • 即征即退增值税政策
  • 增值税和增值税额的区别
  • 暂估收入销项税与后期开票不一致
  • 单位不发工资怎么解决要什么证据
  • 调整利润分配期怎么计算
  • 汽车发票金额怎么算
  • 增值税进项税已勾选没确认能自动生成吗
  • 注册表怎么启动
  • php运行js代码
  • nodejs怎么更新版本
  • 个人房屋出租税票怎么开
  • unet网络的优缺点
  • 房地产开发企业销售自行开发的房地产项目
  • 定期定额个体户超定额怎样申报
  • Thinkphp 中 distinct 的用法解析
  • yolov5中使用的限制目标宽高的方法防止梯度爆炸
  • iframe标签表示的框架
  • 对 ChatGLM-6B 做 LoRA Fine-tuning
  • dedecms官网
  • mysql列表
  • 没开票的工程可以结转成本吗
  • 小规模差额征税的税率是3%还是5%
  • 税务相关政策的解读
  • etc发票写着不征税怎么办
  • 小规模增值税纳税人优惠政策
  • 所得税汇算清缴补税的会计处理
  • 购入固定资产入账会计凭证怎么做
  • 企业所得税视同销售的有哪些?
  • 出口退税会计处理流程
  • 工会经费计提分录最新规定
  • 车辆购置税可以退税吗
  • 长期待摊费用科目怎么使用
  • 支付关税现金流放哪儿
  • 外购货物用于在建工程分录
  • 实收资本挂在其他应收款现在股权转让
  • 销项税现金流量附表如何指定
  • 残疾人就业保障金征收使用管理办法
  • 会计中原始凭证是什么意思
  • MySQL关于exists的一个bug
  • sql server自动生成语句
  • unix du
  • mac怎么创建apple id
  • 苹果电脑安装macos怎么安装
  • winmgm32.exe - winmgm32 是什么进程
  • win1020h2正式版
  • linux-swap
  • centos7安装中文包
  • win8不能安装软件
  • ie11 for win8
  • win10新版磁贴
  • 模拟监控app
  • 制作网页需要
  • Node.js中的事件循环是什么意思
  • Node.js中的什么模块是用于处理文件和目录的
  • Base64、DES、MD5加密解密原理
  • comparable接口怎么用
  • 一般纳税人开具的增值税普通发票和专用发票的区别
  • 贵州新农合可以打电话停保吗
  • 医院能开增值税开发票吗
  • 航天信息人工电话
  • 租赁费的税率是多少
  • 耕地占用税 湖北
  • 加工中心钻孔进给
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设