|
| 1 | +<?php |
| 2 | +namespace Algo_10; |
| 3 | + |
| 4 | +require_once '../vendor/autoload.php'; |
| 5 | + |
| 6 | +$arr = [9, 8, 11, 4, 2, 6, 5, 1, -1, 3, 20, 10]; |
| 7 | +//$arr=[9,8,11,4,2,6,5,100]; |
| 8 | + |
| 9 | +findMiddle($arr); |
| 10 | + |
| 11 | +//动态数据实时获取中位数 |
| 12 | +function findMiddle($arr) |
| 13 | +{ |
| 14 | + //大顶堆 |
| 15 | + $bigHeap = new Heap(0, 1); |
| 16 | + //小顶堆 |
| 17 | + $smallHeap = new Heap(0, 0); |
| 18 | + |
| 19 | + foreach ($arr as $k => $v) { |
| 20 | + if ($bigHeap->isEmpty()) { |
| 21 | + $bigHeap->insert($v); |
| 22 | + } else { |
| 23 | + $bigPeak = $bigHeap->peak(); |
| 24 | + if ($v < $bigPeak) { |
| 25 | + $bigHeap->insert($v); |
| 26 | + } else { |
| 27 | + $smallHeap->insert($v); |
| 28 | + } |
| 29 | + |
| 30 | + if ($bigHeap->count - $smallHeap->count > 1) { |
| 31 | + $bigPeak = $bigHeap->deleteFirst(); |
| 32 | + $smallHeap->insert($bigPeak); |
| 33 | + } elseif ($smallHeap->count - $bigHeap->count > 1) { |
| 34 | + $smallPeak = $smallHeap->deleteFirst(); |
| 35 | + $bigHeap->insert($smallPeak); |
| 36 | + } |
| 37 | + |
| 38 | + } |
| 39 | + //实时获取中位数 |
| 40 | + echo "现在的中位数为:".implode(',', midPeak($bigHeap, $smallHeap)) . PHP_EOL; |
| 41 | + } |
| 42 | + |
| 43 | + |
| 44 | +} |
| 45 | + |
| 46 | +function midPeak($heap1, $heap2) |
| 47 | +{ |
| 48 | + if ($heap1->count == $heap2->count) { |
| 49 | + $midArr = [$heap1->peak(), $heap2->peak()]; |
| 50 | + } elseif ($heap2->count > $heap1->count) { |
| 51 | + $midArr = [$heap2->peak()]; |
| 52 | + } else { |
| 53 | + $midArr = [$heap1->peak()]; |
| 54 | + } |
| 55 | + return $midArr; |
| 56 | +} |
0 commit comments