在本篇文章里小编给大家整理了一篇关于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. }

更多相关文章

  1. Android(安卓)UI元素使用初步
  2. Android(安卓)五大布局
  3. JS实现元素的拖动与占位功能
  4. JS实现元素的拖动与占位功能
  5. JS实现元素的拖动与占位功能
  6. Android(安卓)五大布局FrameLayout,LinearLayout ,AbsoluteLayou
  7. android 界面布局
  8. 基于Java LinkedList,实现Android大数据缓存策略
  9. php去除数组中为0的元素的实例分析

随机推荐

  1. 【android基础】之Android返回键处理(事
  2. Android之XUtils的框架总结
  3. eclipse下android的sdk配置问题
  4. 我是如何自学Android,资料分享(2015 版)
  5. Android中的Shape美化
  6. Android(安卓)TextView文字横向自动滚动(
  7. Android 技术专题系列之三 -- 编译(build)
  8. Android 相对布局:RelativeLayout
  9. Android分区解释:boot, system, recovery,
  10. Android(安卓)init 启动过程分析1