この記事では主に 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('a'=>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 によって登録された関数によってインターセプトされます。明らかに、この種の汚れたコードと不要なパフォーマンスのオーバーヘッドは完全に回避できます。
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
インターフェイス クラス
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 がオブジェクトの場合、配列に変換できません。
マップのサイズが小さくなると十分なサイズがある場合、割り当てられたメモリは自動的に解放されます。 キーと値は、オブジェクトを含む任意のタイプにすることができます。 -
#put、get、remove、hasKey の複雑さは O(1)です。
- 利点:
欠点:
Set は、順序付けされていない一意の値のコレクションです。 Map は内部で set の実装を使用しており、それらはすべて Array の同じ内部構造に基づいています。つまり、Set の並べ替えの複雑さは O(n*log n) です。
プッシュ、ポップ、挿入、シフト、シフト解除はサポートされません インデックス作成前に値が削除されると、複雑さが低下します。 be O(1) から O(n)
# 追加、削除、参照はすべて O(1) の複雑さです -
#Hashable を使用したインターフェイス
- あらゆるタイプの値をサポートします。
-
メリット:
-
デメリット:
はキーではなく値をターゲットとするため、各配列メンバーは制限されます。探索すると計算量はO(n²)になります。
上記がこの記事の全内容です。皆様の学習に少しでもお役に立てれば幸いです。その他の関連コンテンツについては、PHP 中国語 Web サイトをご覧ください。
関連する推奨事項:
php で拡張 Redis と swoole をコンパイルしてインストールする方法
サービス コンテナーと依存関係の注入PHP 分析
以上がPHP7.2 データ構造の使用の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。