ASCII码 ASCII码

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

发布于:2022-03-08 10:38:16  栏目:技术文档

在本篇文章里小编给大家整理了一篇关于php数据流中第K大元素的计算方法及代码分析内容,有兴趣的朋友们可以学习下。

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

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

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

实例

  1. class KthLargest extends SplMinHeap {
  2. /**
  3. * @param Integer $k
  4. * @param Integer[] $nums
  5. */
  6. static $nums;
  7. public $k;
  8. function __construct($k, $nums) {
  9. $this->k = $k;
  10. // 遍历初始化数组,分别插入堆中
  11. foreach ($nums as $v) {
  12. $this->add($v);
  13. }
  14. }
  15. * @param Integer $val
  16. * @return Integer
  17. function add($val) {
  18. // 维持堆的大小为k,当堆还未满时,插入数据。
  19. if ($this->count() < $this->k) {
  20. $this->insert($val);
  21. } elseif ($this->top() < $val) {
  22. // 当堆满的时候,比较要插入元素和堆顶元素大小。大于堆顶的插入。堆顶移除。
  23. $this->extract();
  24. return $this->top();
  25. }}
  26. * Your KthLargest object will be instantiated and called as such:
  27. * $obj = KthLargest($k, $nums);
  28. * $ret_1 = $obj->add($val);

实例扩展:

  1. class KthLargest {
  2. /**
  3. * @param Integer $k
  4. * @param Integer[] $nums
  5. */
  6. static $nums;
  7. public $k;
  8. function __construct($k, $nums) {
  9. $this->k = $k;
  10. $this->nums = $nums;
  11. }
  12. /**
  13. * @param Integer $val
  14. * @return Integer
  15. */
  16. function add($val) {
  17. array_push($this->nums, $val);
  18. rsort($this->nums);
  19. $this->nums = array_slice($this->nums, 0, $this->k);
  20. return $this->nums[$this->k - 1];
  21. }
  22. }

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

  1. class KthLargest {
  2. /**
  3. * @param Integer $k
  4. * @param Integer[] $nums
  5. */
  6. static $nums;
  7. public $k;
  8. function __construct($k, $nums) {
  9. $this->k = $k;
  10. $this->nums = $nums;
  11. }
  12. /**
  13. * @param Integer $val
  14. * @return Integer
  15. */
  16. function add($val) {
  17. array_push($this->nums, $val);
  18. rsort($this->nums);
  19. $this->nums = array_slice($this->nums, 0, $this->k);
  20. return $this->nums[$this->k - 1];
  21. }
  22. }
相关推荐
阅读 +