php数据流中第K大元素的计算方法及代码分析

 更新时间:2021年07月12日 08:33:08   作者:小妮浅浅  
在本篇文章里小编给大家整理了一篇关于php数据流中第K大元素的计算方法及代码分析内容,有兴趣的朋友们可以学习下。

设计一个找到数据流中第K大元素的类(class)。注意是排序后的第K大元素,不是第K个不同的元素。

计算方法

1、直接使用最小堆,堆的大小为 k,这样保证空间占用最小,最小堆的根节点是就是最小值,也是我们想要的结果。

2、php的spl标准库是有最小堆这个库,直接在代码中继承SplMinHeap。

实例

class KthLargest extends SplMinHeap {

    /**
    * @param Integer $k
    * @param Integer[] $nums
    */
    static $nums;
    public $k;
    function __construct($k, $nums) {
        $this->k = $k;
        // 遍历初始化数组,分别插入堆中
        foreach ($nums as $v) {
            $this->add($v);
        }
    }
   
    * @param Integer $val
    * @return Integer
    function add($val) {
       // 维持堆的大小为k,当堆还未满时,插入数据。
        if ($this->count() < $this->k) {
            $this->insert($val);
        } elseif ($this->top() < $val) {
        // 当堆满的时候,比较要插入元素和堆顶元素大小。大于堆顶的插入。堆顶移除。
            $this->extract();
        return $this->top();
    }}
    * Your KthLargest object will be instantiated and called as such:
    * $obj = KthLargest($k, $nums);
    * $ret_1 = $obj->add($val);

实例扩展:

class KthLargest {
    /**
     * @param Integer $k
     * @param Integer[] $nums
     */
    static $nums;
    public $k;
    function __construct($k, $nums) {
        $this->k = $k;
        $this->nums = $nums;
    }
  
    /**
     * @param Integer $val
     * @return Integer
     */
    function add($val) {
        array_push($this->nums, $val);
        rsort($this->nums);
        return $this->nums[$this->k - 1];
    }
}

第一个思路,时间超限的原因是每次都要对$this->nums这个数组,进行重新排序,上次已经排序好的,还要再重新排一次,浪费时间。所以,下面的解法是,每次只保存,上次排序完的前k个元素。这次的进行排序的次数就减少了。时间也减少了。

class KthLargest {
    /**
     * @param Integer $k
     * @param Integer[] $nums
     */
    static $nums;
    public $k;
    function __construct($k, $nums) {
        $this->k = $k;
        $this->nums = $nums;
    }
  
    /**
     * @param Integer $val
     * @return Integer
     */
    function add($val) {
        array_push($this->nums, $val);
        rsort($this->nums);
        $this->nums = array_slice($this->nums, 0, $this->k);
        
        return $this->nums[$this->k - 1];
    }
}

到此这篇关于php数据流中第K大元素的计算方法及代码分析的文章就介绍到这了,更多相关php数据流中第K大元素的计算方法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • PHP递归实现文件夹的复制、删除、查看大小操作示例

    PHP递归实现文件夹的复制、删除、查看大小操作示例

    这篇文章主要介绍了PHP递归实现文件夹的复制、删除、查看大小操作,结合实例形式分析了php递归算法结合php常用文件夹操作函数实现文件夹的复制、删除、查看等相关实现技巧,需要的朋友可以参考下
    2017-08-08
  • PHP压缩图片功能的介绍

    PHP压缩图片功能的介绍

    今天小编就为大家分享一篇关于PHP压缩图片功能的介绍,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • PHP中使用mktime获取时间戳的一个黑色幽默分析

    PHP中使用mktime获取时间戳的一个黑色幽默分析

    mktime(hour,minute,second,month,day,year,is_dst)这是mktime的语法说明,一目了然应该不难写出一个时间戳的代码来
    2012-05-05
  • php split汉字

    php split汉字

    php split汉字实现代码。
    2009-06-06
  • PHP设计模式中观察者模式详解

    PHP设计模式中观察者模式详解

    观察者模式是极其重要的一个设计模式,也是我几年开发过程中使用最多的设计模式,本文首先概述观察者模式的基本概念和Demo实现,接着是观察者模式在Java和Spring中的应用,最后是对观察者模式的应用场景和优缺点进行总结
    2022-12-12
  • php 启动时报错的简单解决方法

    php 启动时报错的简单解决方法

    php启动时报错的情况,想必很多朋友都有遇到吧,下面为大家介绍下比较不错的解决方法
    2014-01-01
  • PHPStrom中实用的功能和快捷键大全

    PHPStrom中实用的功能和快捷键大全

    jetbrains出的PHPStrom很大程度上方便了PHP程序的编写,下面小编给大家总结些PHPStrom中实用的功能和快捷键大全,在编写的过程中变得又舒服又快捷,感兴趣的朋友一起看看吧
    2015-09-09
  • fetchAll()与mysql_fetch_array()的区别详解

    fetchAll()与mysql_fetch_array()的区别详解

    本篇文章是对fetchAll()与mysql_fetch_array()的区别进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • php对关联数组循环遍历的实现方法

    php对关联数组循环遍历的实现方法

    这篇文章主要介绍了php对关联数组循环遍历的实现方法,涉及php操作数组的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-03-03
  • php实现将数组转换为XML的方法

    php实现将数组转换为XML的方法

    这篇文章主要介绍了php实现将数组转换为XML的方法,实例分析了php操作数组及XML格式文件的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-03-03

最新评论