ホームページ  >  記事  >  バックエンド開発  >  PHP でデータ ストリーム内の K 番目に大きい要素を計算する方法

PHP でデータ ストリーム内の K 番目に大きい要素を計算する方法

醉折花枝作酒筹
醉折花枝作酒筹転載
2021-07-09 15:59:462107ブラウズ

最小ヒープのプロパティを使用すると、最小ヒープのルート ノードはすべてのノードの中で最小でなければなりません。したがって、サイズ K 要素の最小ヒープを維持するだけで済みます。値が最小ヒープのルート ノードの値より大きい限り、ルート ノードの値が削除され、その値が最小ヒープに挿入されます。

PHP でデータ ストリーム内の K 番目に大きい要素を計算する方法

#データ ストリーム内で K 番目に大きい要素を検索するクラスを設計します。これは並べ替え後の K 番目に大きい要素であり、K 番目の異なる要素ではないことに注意してください。

KthLargest クラスには、整数 k と、データ ストリームの初期要素を含む整数配列 nums の両方を受け入れるコンストラクターが必要です。 KthLargest.add が呼び出されるたびに、現在のデータ ストリーム内の K 番目に大きい要素が返されます。

例:

int k = 3;
int[] arr = [4,5,8,2];
KthLargest kthLargest = new KthLargest(3, arr);
kthLargest.add(3);   // returns 4
kthLargest.add(5);   // returns 5
kthLargest.add(10);  // returns 5
kthLargest.add(9);   // returns 8
kthLargest.add(4);   // returns 8

説明: nums ≥ k-1 および k ≥ 1 の長さと仮定できます。

質問の意味を理解する

この質問は最初理解できませんでしたが、何度か読んで理解できました。k は指定されたものです最も基本的な考慮事項は、各加算には並べ替えが必要であり、その後 k- の値を再検索する必要があるということです。フラッシュバック後は 6. 5, 3, 2、k = 2 の場合は 5 が返され、加算の場合は 1 が返されます。は最後に追加されますが結果には影響しませんが、add 7 の場合は先頭に追加され、戻り値は 6 になります。

問題解決のアイデア

最小ヒープを直接使用します。占有スペースを最小限に抑えるため、ヒープのサイズは k です。 minimum heap は最小値であり、これも望ましい結果です。 PHP の SPL 標準ライブラリには、コード内で SplMinHeap を直接継承する最小ヒープ ライブラリがあります。

PHP 実装

class KthLargest extends SplMinHeap {
    /** 
    * @param Integer $k 
    * @param Integer[] $nums 
    */
    static $nums;
    public $k;
    function __construct($k, $nums) {
        $this->k = $k;
        // 遍历初始化数组,分别插入堆中
        foreach ($nums as $v) {
            $this->add($v);
        }
    }
  
    /** 
    * @param Integer $val 
    * @return Integer 
    */
    function add($val) {
       // 维持堆的大小为k,当堆还未满时,插入数据。
        if ($this->count() < $this->k) {
            $this->insert($val);
        } elseif ($this->top() < $val) {
        // 当堆满的时候,比较要插入元素和堆顶元素大小。大于堆顶的插入。堆顶移除。
            $this->extract();
            $this->insert($val);
        }
        return $this->top();
    }}
    /** 
    * Your KthLargest object will be instantiated and called as such: 
    * $obj = KthLargest($k, $nums); 
    * $ret_1 = $obj->add($val); 
    */

推奨学習: php ビデオ チュートリアル

以上がPHP でデータ ストリーム内の K 番目に大きい要素を計算する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はhxd.lifeで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。