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

admin3年前PHP教程61

设计一个找到数据流中第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生命周期

1、PHP的运行模式 PHP两种运行模式是WEB模式、CLI模式。无论哪种模式,PHP工作原理都是一样的,作为一种SAPI运行。1、当我们在终端敲入php这个命令的时候,它使用的是CLI。它...

普通的高防服务器如何增加防护?100G国内高防服务器如何防御DOSS攻击?

互联网的浪潮带动了服务器租赁市场的快速发展,许多的客户为了免往不必要的麻烦,都会选择访问距离相对较近、速度快而且不用备案的高防服务器。然而越来越大的市场也滋生了不少问题,比如日益严峻的网络流量攻击现象...

PHP的重载使用魔术方法代码实例详解

摘录PHP官网对PHP重载的解释:PHP所提供的"重载"(overloading)是指动态地"创建"类属性和方法。我们是通过魔术方法(magic methods...

租用高防服务器时重点看哪几个参数?国内100G高防服务器购买需要注意哪些事项?

高防服务器主要是针对公司客户的,高防服务器给客户提供了更加安全的网络执行环境,为客户提供安全的确保。在租赁高防服务器时,大家应该关注哪些参数呢?一起来了解一下。就服务器配置而言,通常会关注4点:cpu...

php判断时间戳是否为今天实例讲解

 本教程操作环境:windows7系统、PHP7.1版、DELL G3电脑php判断指定时间戳是不是今天的方法实现思想:使用date()格式化今天的日期,将其转为“年月日&rdq...