Skip to content

Commit d6dfd94

Browse files
author
huangkui
committed
动态数据流查中位数
1 parent e926928 commit d6dfd94

File tree

1 file changed

+56
-0
lines changed

1 file changed

+56
-0
lines changed

php/10_heap/findmiddle.php

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
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

Comments
 (0)