<?php
class Solution
{
function Heap(&$arr,$idx){
$left = 2*$idx + 1;
$right = 2*$idx + 2;
if (!$arr[$left]){
return;
}
if($arr[$right] && $arr[$right] < $arr[$left]){
$l = $right;
}else{
$l = $left;
}
if ($arr[$idx] > $arr[$l]){
$tmp = $arr[$idx];
$arr[$idx] = $arr[$l];
$arr[$l] = $tmp;
$this->Heap($arr,$l);
}
}
function getTopKey($array, $k)
{
$count = count($array);
if($k > $count){
return $array;
}
$topArr = array_slice($array, 0, $k);
$idx = floor(count($topArr) / 2) - 1;
//生成小顶堆
for($i=$idx;$i>=0;$i--){
$this->Heap($topArr,$i);
}
for ($i=count($topArr); $i < $count; $i++) {
if($array[$i] > $topArr[0]){
$topArr[0] = $array[$i];
$this->Heap($topArr, 0);
}
}
return $topArr;
}
function createNums($num)
{
$nums = [];
for ($i=1; $i <= $num; $i++) {
$nums[] = $i;
}
shuffle($nums);
return $nums;
}
}
//当父结点的键值总是大于或等于任何一个子节点的键值时为最大堆。当父结点的键值总是小于或等于任何一个子节点的键值时为最小堆。下图展示一个最小堆:一般都用数组来表示堆,i结点的父结点下标就为(i – 1) / 2。它的左右子结点下标分别为2 * i + 1和2 * i + 2。如第0个结点左右子结点下标分别为1和2。
$aa = new Solution();
$nums = $aa->createNums(50000);
$topKeyArr = $aa->getTopKey($nums, 10);
var_dump($topKeyArr);
Top key
最新推荐文章于 2022-05-31 21:31:36 发布