TypechoJoeTheme

醉秋风

登录
用户名
密码
/
注册
用户名
邮箱

醉秋风

要相信,一切都是最好的安排!!

利用PHP的SplMaxHeap、SplMinHeap求数组的最大、最小的N个数

2020-07-02
/
1 评论
/
55,047 阅读
/
正在检测是否收录...
07/02
/**
 * @api {post} /tool/test  
 * @apiGroup slomoo
 * @apiVersion TP 6.0
 * @apiDescription 获取一组数据中得最小N个数。
 */
public function test() {
        $arr = [1,6,8,11,23,9,2,2];
        $n   = 3;
        //大顶堆
        $spLobj = new \SplMaxHeap();
        
        //通过筛选将$n个元素插入堆中
        for ($i=0; $i < $n; $i++) { 
            $spLobj->insert($arr[$i]);
        }
        /**
         * 输出即:
         * 
         *     8
         *  1      6 
         * 
         */
        
        //从$n个开始比较,如果第$i个 数字比最顶端得小 则将最顶部得去掉 并把当前得元素从新加入到堆中
        for ($i=$n; $i < count($arr); $i++) { 
            $top = $spLobj->top();
            if($arr[$i] < $top){
                $spLobj->extract();
                $spLobj->insert($arr[$i]);
            }
        }
        //对象转数组  并返回。
        $res = [];
        foreach ($spLobj as $key) {
            $res[] = $key;
        }
        return json_encode($res); //5,2,1
}

同理,利用PHP的SplMinHeap最小堆,也能算出一组数据中的最大的N个数。

public function test(){
        $arr = [1,6,8,11,23,9,2,2];
        $n   = 3;
        //利用PHP小顶堆函数
        $spLobj = new \SplMinHeap();
        
        //通过筛选将$n个元素插入堆中
        for ($i=0; $i < $n; $i++) { 
            $spLobj->insert($arr[$i]);
        }
        /**
         * 输出即:
         * 
         *     1
         *  6      8 
         * 
         */
        for ($i=$n; $i < count($arr); $i++) { 
            $top = $spLobj->top();
            if($arr[$i] > $top){
                $spLobj->extract();
                $spLobj->insert($arr[$i]);
            }
        }
        //对象转数组  并返回。
        $res = [];
        foreach ($spLobj as $key) {
            $res[] = $key;
        }
        return json_encode($res); //9,11,23
}
算法
朗读
赞(1)
赞赏
感谢您的支持,我会继续努力哒!

三合一收款

下面三种方式都支持哦

微信
QQ
支付宝
打开支付宝/微信/QQ扫一扫,即可进行扫码打赏哦
版权属于:

醉秋风

本文链接:

https://blog.slomoo.cn/158.html(转载时请注明本文出处及文章链接)

评论 (1)
  1. 华夏农民 作者
    Linux · Google Chrome

    🍋

    2020-12-08 回复

人生倒计时

今日已经过去小时
这周已经过去
本月已经过去
今年已经过去个月
广告

标签云