PHP7.2 データ構造の使用

不言
不言オリジナル
2018-07-06 15:11:121954ブラウズ

この記事では主に PHP7.2 データ構造の使用方法を紹介します。これは一定の参考価値があります。今、それをみんなに共有します。必要な友人はそれを参照してください。

PHP7.2 データ構造の使用

1. インストール

pecl install ds
brew install homebrew/php/php71-ds

現在、PHP7.2 は brew を使用したインストールをサポートしていません。

2. PHP オリジナルのデータ構造 Array

PHP5.x の時代では、Array がコレクションを表す唯一のデータ型です。 PHP 、彼は List であり Map であり、すべてです。

<?php $a = array(1,2,3,4);
$b = array(&#39;a&#39;=>1,'b'=>2,'c'=>3);

このデータ型は開発者に利便性をもたらしますが、特に他の言語を学習する場合、PHPer がデータ構造の利点を無視できるようになります。

PHP が 7 にアップグレードされた後、Array も最適化されましたが、その構造は変更されず、「すべてに最適化され、何も最適化されない」という改善の余地がありました。したがって、より便利なデータ構造を導入することでパフォーマンスを最適化し、同時にコードの記述もより便利になるのであれば、なぜそうしないのでしょうか?

「SPL データ構造についてはどうですか?」
残念ながら、それらはひどいものです。これらは PHP 7 より前にはいくつかの利点を提供していましたが、それ以降は実用的な価値がなくなるまで無視されてきました。設計と実装が非常に貧弱なので、新しいものに置き換えた方がよいでしょう。


「SPL データ構造の設計はひどいものです。」 - Anthony Ferrara

Array

#PHP の配列は、存在しないキーにアクセスすると null を取得する可能性があり、致命的なエラーは発生しませんが、E_NOTICE が発生します。この E_NOTICE は、set_error_handler によって登録された関数によってインターセプトされます。明らかに、この種の汚れたコードと不要なパフォーマンスのオーバーヘッドは完全に回避できます。
  • <?php $a = [];
    $a[&#39;a&#39;]; // PHP Notice:  Undefined offset
    一般的な PHPer は array_key_exists を使用せず、それ以外の場合はそれを処理するため、少し面倒になります。

Array を使用すると、パフォーマンスが非常に低下することがあります。配列は本質的にはマップです。要素のシフトを解除すると、各要素のキーが変更されます。これは O(n) 操作です。さらに、PHP の配列はその値 (キーとそのハッシュを含む) をバケットに保存するため、各バケットを確認してハッシュを更新する必要があります。
  • PHP は内部で新しい配列を作成することで array_unshift 操作を完了しますが、パフォーマンスの問題が発生することは想像に難くありません。
DataStructures、PHP7 の拡張機能、配列 (Array) の代替品。

Github

: https://github.com/php-ds

名前空間:

Ds\

インターフェイス クラス:

Collection、Sequence、Hashable

実装クラス (最終クラス):

Vector、Deque、Map、Set、Stack、Queue、PriorityQueue、Pair

インターフェイス クラスPHP7.2 データ構造の使用

Collection は、データ コレクションの基本操作を定義する基本インターフェイスです (ここでのコレクションとは、Set ではなく Collection を指します)。 foreach、echo、count、print_r、var_dump、serialize、json_encode、clone など。
  • Sequence は、配列のようなデータ構造の基本インターフェイスであり、contains、map、filter、reduce、find、first、last など、多くの重要で便利なメソッドを定義します。図からわかるように、Vector、Deque、Stack、Queue はすべて、直接的または間接的にこのインターフェイスを実装しています。その特性は次のとおりです:
  • 値には常にインデックスが付けられます [0, 1, 2, …, size - 1]
    • 削除または挿入すると、連続するすべての値の位置が更新されます。
    • [0, size-1] のインデックスを持つ値へのアクセスのみを許可します。
    • #Hashable は図では孤立しているように見えますが、マップとセットにとっては重要です。オブジェクトが Hashable を実装している場合、Map のキーや Set の要素として使用できます。このように、Map と Set は Java と同じように便利に使用できます。
  • 実装クラス

Vector は最も一般的に使用されるデータ構造の 1 つであり、Ruby の Array または Python の List と考えることができます。要素の値のインデックスはバッファ内のインデックスとなるため、非常に効率的です。配列を使用する必要があり、挿入、削除、シフト、シフト解除を必要としない限り、これを使用できます。
    #ビデオの説明

    • PhotoShop で使用される主なデータ構造は Vector です ---- Sean Parent
      • #挿入、削除、シフト、およびシフト解除の複雑さは O(n)です。
      • ##メモリ使用量が少ない
      • #get、set の複雑さプッシュとポップの割合は O(1)

      • 利点:

      • 欠点:

      • Deque ([デク]と発音します) は「両端キュー」です。ヘッド ポインターがキューに追加されるため、シフトとシフト解除も O(1) 複素数になります。しかし、パフォーマンスの低下はそれほど大きくありません。

      • 先頭と末尾を追跡するために 2 つのポインターが使用されます。ポインターはバッファーの末尾を「ラップアラウンド」することができるため、スペースを空けるために他の値を移動する必要がなくなります。 。これにより、シフトとシフトが非常に高速になります。Vector はこれに匹敵することはできません。ビデオの説明

      挿入と削除の複雑さは O(n) です。

      • バッファ容量は 2 の n 乗でなければなりません。

      • #メモリ使用量が少ない。
      • get、set、push、pop、shift、unshift の複雑さは O(1) です。
      • 利点:
      • 欠点:
      • スタックは、によれば「LIFO」構造です。 「後入れ先出し」の原則により、構造の最上位にある値にアクセス、横断、および破棄することができます。 DsStack は内部で DsVector の実装を使用します。
      • キューは、「先入れ先出し」の原則に従って、構造の先頭にある値のアクセス、トラバース、および破棄を可能にする「FIFO」構造です。 DsQueue は内部で DsDeque の実装を使用します。
      • PriorityQueue (優先キュー) はキューと非常によく似ています。値は割り当てられた優先度に従ってキューにプッシュされます。最も高い優先度を持つ値は常に先頭にあります。列。 PriorityQueue の走査は破壊的であり、キューが空になるまでポップ操作が継続されることになります。
      • 最大ヒープ実装を使用します

      • Hashable は、オブジェクトをキーとして使用できるようにするインターフェイスです。注: hashTable ではありません。 Hashable では、hash と equals の 2 つのメソッドのみが導入されます。 Hashable インターフェイスをサポートするデータ構造は Map と Set です。

      • Map 、キーと値のペアの連続コレクション。配列の使用と一致しており、キーはどのようなタイプでもかまいませんが、一意である必要があります。同じキーがマップに追加されると、元のキーが置き換えられます。配列と同様に、挿入順序も保持されます。

      • key がオブジェクトの場合、配列に変換できません。

        • 効率とメモリ使用量は Array とほぼ同じです

          マップのサイズが小さくなると十分なサイズがある場合、割り当てられたメモリは自動的に解放されます。
        • キーと値は、オブジェクトを含む任意のタイプにすることができます。
        • #put、get、remove、hasKey の複雑さは O(1)です。
        • 利点:

        欠点:
        • Set は、順序付けされていない一意の値のコレクションです。 Map は内部で set の実装を使用しており、それらはすべて Array の同じ内部構造に基づいています。つまり、Set の並べ替えの複雑さは O(n*log n) です。
        プッシュ、ポップ、挿入、シフト、シフト解除はサポートされません
      • インデックス作成前に値が削除されると、複雑さが低下します。 be O(1) から O(n)
        • # 追加、削除、参照はすべて O(1) の複雑さです
        • #Hashable を使用したインターフェイス
        • あらゆるタイプの値をサポートします。

        • メリット:
        • デメリット:
        • こちら明確にするために、Array の値自体にはインデックスがないため、

          in_array()
        • を使用すると、複雑さ O(n) の線形検索になります。
        • 一意の値の配列を作成したい場合は、

          array_unique()

          を使用できます。
        • array_unique()
        はキーではなく値をターゲットとするため、各配列メンバーは制限されます。探索すると計算量はO(n²)になります。

      上記がこの記事の全内容です。皆様の学習に少しでもお役に立てれば幸いです。その他の関連コンテンツについては、PHP 中国語 Web サイトをご覧ください。 関連する推奨事項:
      php で拡張 Redis と swoole をコンパイルしてインストールする方法

      サービス コンテナーと依存関係の注入PHP 分析

    以上がPHP7.2 データ構造の使用の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

    声明:
    この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。