PHP代碼實現TopN

在一堆數據中按分數值由大到小取前N個數據,用小根堆的方法來實現,具體代碼以下:php

<?php
class TopN extends SplMinHeap
{
    private $top_n;

    /**
     * @param int $top_n 前top_n名
     */
    public function __construct($top_n)
    {
        $this->top_n = $top_n;
    }

    /**
     * 添加一個元素
     * @param number $score 排序值
     * @param mixed  $value 元素
     */
    public function add($score,$value)
    {
        if ($this->top_n) {
            $this->insert(array($score,$value));
            $this->top_n--;
        } else {
            $top = $this->top();
            if ($top[0] < $score) {
                $this->extract();
                $this->insert(array($score,$value));
            }
        }
    }

    /**
     * 獲取topN的結果
     * @return array
     */
    public function getResult()
    {
        $list = array();
        while ($this->valid()) {
            $value = $this->current();
            $list[] = $value[1];
            $this->next();
        }
        return array_reverse($list);
    }
}

$mTopN = new TopN(3);
$mTopN->add(70,array('name'=>'張三','score'=>70));
$mTopN->add(80,array('name'=>'李四','score'=>80));
$mTopN->add(100,array('name'=>'王五','score'=>100));
$mTopN->add(90,array('name'=>'趙六','score'=>90));
$result = $mTopN->getResult();
print_r($result);
/*
Array
(
    [0] => Array
        (
            [name] => 王五
            [score] => 100
        )

    [1] => Array
        (
            [name] => 趙六
            [score] => 90
        )

    [2] => Array
        (
            [name] => 李四
            [score] => 80
        )

)
*/
相關文章
相關標籤/搜索