21

プログラミングの腕前を伸ばすために、私はThe Standard PHP Libraryを少し掘り下げました。SplDoublyLinkedListこれがクラスの発見につながりました。そこから、WikipediaのLinked ListsDoublely Linked Lists の説明を読みました。

それらがどのように機能するかは理解しています...しかし、なぜそれが必要なのか、またはSplDoublyLinkedListPHPでインデックス付きの連想配列を使用しているため、実際の例が必要な理由がわかりません。

Linked Lists は通常、PHP の内外でどのように使用されますか?

4

7 に答える 7

9

SPL データ構造は、メモリ消費を削減し、パフォーマンスを向上させます。良い説明:

データ構造は本質的に言語に依存せず、数学に基づく一連の論理概念として存在します。これらのコンテナーは、効率を最大化するために、必要に応じてさまざまなアルゴリズムを使用します。

たとえば、連想配列のハッシュ マップ機能が必要ない場合、つまり、特定の目的で配列キーを使用しておらず、列挙型配列のみが必要な場合は、SplFixedArray (以前は SplFastArray、現在は文書化されていません) ) が適切な代替品である可能性があります。唯一の注意点は、配列のサイズが固定されていることです。つまり、クラスをインスタンス化するときにサイズを指定する必要があり、その数を超える要素を格納しようとするとエラーが発生します。これが、平均して、標準の PHP 配列よりも優れたパフォーマンスを発揮する理由です。

http://web.archive.org/web/20130805120049/http://blueparabola.com/blog/spl-deserves-some-reiteration

PHP インタープリターを構成する C コード内では、配列はハッシュ テーブルまたはハッシュ マップと呼ばれるデータ構造として実装されます。配列に含まれる値がそのインデックスによって参照される場合、PHP はハッシュ関数を使用して、そのインデックスを配列内の対応する値の位置を表す一意のハッシュに変換します。

このハッシュ マップの実装により、配列に任意の数の要素を格納し、数値キーまたは文字列キーを使用してそれらの要素すべてに同時にアクセスできるようになります。配列は、提供する機能に対して非常に高速であり、優れた汎用データ構造です。

コンピューター サイエンスでは、リストは順序付けられた値のコレクションとして定義されます。リンクされたリストは、リスト内の各要素が、リスト内のいずれかの側の要素の一方または両方への参照を含むデータ構造です。「双方向リスト」という用語は、後者の場合を指すために使用されます。SPL では、これはクラス SplDoublyLinkedList... の形式を取ります。保存する要素の数が事前にわからず、要素に順番にアクセスするだけでよい場合は、リストを使用するのが理にかなっています。

http://matthewturland.com/2010/05/20/new-spl-features-in-php-5-3/

于 2011-09-22T20:22:41.177 に答える
4

ウィキペディアによると、

従来の配列に対するリンクリストの主な利点は、リンクされたアイテムの順序が、データアイテムがメモリまたはディスクに格納されている順序と異なる場合があることです。そのため、リンクリストでは、一定数の操作で、リスト内の任意のポイントでノードを挿入および削除できます。

一方、リンクリスト自体は、データへのランダムアクセス、または任意の形式の効率的なインデックス作成を許可しません。したがって、リストの最後のノードを取得する、特定のデータを含むノードを見つける、新しいノードを挿入する場所を見つけるなど、多くの基本的な操作では、ほとんどのリスト要素をスキャンする必要があります。

だからあなたの質問に答えるために、私にはわかりません。:)

于 2010-10-18T20:58:19.750 に答える
4

何よりもまず、SplDoublyLinkedListはオブジェクトです。

  • それらは拡張できるため、それらのメソッドをオーバーライドできます (たとえば、すべての文字列を大文字で返すなど)。
  • それらが実装するインターフェースは、のようにチェックできますmyfunc( SplDoublyLinkedList $var ) ...
  • それらはデフォルトで参照として渡されます

次に、SplDoulyLinkedListは反復モードを受け入れるため、外出先で項目を削除したり、配列を並べ替えたりコードを複雑にしたりすることなく方向を切り替えることができます。

SplDoubleLinkedList:: IT_MODE_LIFO (スタック スタイル)

SplDoubleLinkedList:: IT_MODE_FIFO (キュー スタイル) イテレータの動作 (どちらか一方)

SplDoulyLinkedList:: IT_MODE_DELETE (要素は反復子によって削除されます)

SplDoubleLinkedList:: IT_MODE_KEEP (要素は反復子によってトラバースされます)

上記の引用は、いくつかのコード サンプルを含むhttp://simpletechinfo.com/SplDoulyLinkedListからのものです。

他にも利点があります (foreach ですべてのデータをメモリにコピーする必要がないなど)。

于 2014-01-22T02:37:31.140 に答える
1

あなたはおそらく正しいです、そしてそれはあまり役に立ちません。

リンクされたリストには、理論的には多くの用途があります (特にダンシング リンク)。しかし、それらのほとんどは、イテレータを別の場所に保存して複製するか、2 つ以上の方向からコンテンツにアクセスするか、リストを分割してマージするかのいずれかを伴います。SplDoubleLinkedList にはそれらがないように見えました。

アルゴリズムではない場合、1 つの使用法として、オブジェクトが特定のリスト内の自身の参照を一定時間内に削除できるようにし、そのメモリを解放し、挿入または削除後にリストをシャッフルすることなく (最後の項目とのハッシュまたはスワップによって) 使用することができます。ただし、これには、これらのオブジェクトにリストの反復子を格納する必要があります。

これらの機能がなければ、2 つの両端キューのように動作します。イテレータを使用してアイテムにアクセスするだけでよい場合、アイテムは 2 つのスタックのようになります。シングル スレッドの単純なケースで、まだクラスにラップされていない場合を除いて、1 つのより良い方法は、2 つのスタック (おそらく固定配列、または同じ配列の両端) を使用することです。イテレータを移動したいときはいつでも、あるスタックからポップして別のスタックにプッシュします。1 つのスタックの一番上が現在のアイテムです。ヘッドとテールにもアクセスする必要がある場合は、スタックを両端キューに置き換える必要があります。

しかし、最大サイズを知らずにスタックまたは deques 自体を実装したい場合、または通常のリンクされたリストのノードを割り当てたい場合 (PHP のようなライブラリのない言語で)、良い方法は doublely を使用していくつかの固定配列をチェーンすることです。それらの機能のないリンクされたリスト。どういうわけか、あなたはまだそれを必要とします。

Java ドキュメントと同様に、PHP ドキュメント自体は、2 つの deque ではなく、いくつかの奇妙な機能をサポートする単なる deque であると示唆しています (私はそう思います)。二重にリンクされたリストが本当に必要な場合は、それらを使用しないでください。

于 2015-03-21T10:06:19.133 に答える
0

それらが存在するのは、他の言語から来た多くのプログラマーが配列のサイズが固定されており、メモリ管理に注意する必要がある配列に慣れているためです。
したがって、PHP の場合、それらは別のツールにすぎません。多くのアルゴリズムとパターンがリストにリレーされるため、それらが実装されているため、php-arrays に変更する必要はありません。

于 2010-10-18T21:05:28.920 に答える
0

他の人が述べたように、リストは、他の言語で一般的な固定配列の代替です。しかし、見過ごされがちな重要な側面の 1 つは、リスト内の任意の場所から非常に効率的に要素を挿入または削除できることです。

なぜこれが重要なのですか?後でソートする必要がないように、または単に検索時間を最小限に抑えるために、配列内でソートしたままにしておく必要のある項目がいくつかあるとします。この場合、リストは非常に強力なツールになります。特に非常に大規模なデータセットの場合。

于 2012-08-26T07:58:12.443 に答える