4

python data strcutures ページhttp://docs.python.org/tutorial/datastructures.htmlは言う

リストをキューとして使用することもできます。この場合、最初に追加された要素が最初に取得された要素になります (「先入れ先出し」)。ただし、リストはこの目的には効率的ではありません。リストの末尾からの追加とポップは高速ですが、リストの先頭からの挿入またはポップは低速です (他のすべての要素を 1 つシフトする必要があるため)。

リストの先頭に挿入すると非効率になる理由は理解できます。しかし、リストの先頭/先頭のポップが遅いと言うのはなぜですか? リストでポップ操作を行っている間、シフトは必要ありません。

4

2 に答える 2

9

リストヘッドでポップ操作をしている間、シフトは必要ありませんか?

リストを参照の配列と考えてください。リストの最初の要素は常に配列の位置0にあります。リストの最初の要素をポップするときは、すべての参照を1つ左にシフトする必要があります。

リストの先頭をポップするのが安価な代替実装を想像することができます(たとえば、dequeスタイル)。これについてはPythonのドキュメントを信頼できると思いますが、これは組み込みクラスの実装方法ではないと思います。list

コンテナの前面から効率的に取り外す必要がある場合は、次を使用してcollections.dequeください。

Dequeは、スレッドセーフでメモリ効率の高い追加と、Dequeの両側からのポップをサポートし、どちらの方向でもほぼ同じO(1)パフォーマンスを実現します。

于 2012-05-03T06:55:33.493 に答える
1

通常、最初の要素を削除するには、他のすべての要素を移動する必要があるため、前の[1]要素は[0]削除後に配置されます。もちろん、Cベースの実装では、配列が最初の要素ではなく2番目の要素から始まるようにポインターを変更するだけですが、リストの先頭でまだ使用可能な要素の数を追跡する必要があります。

于 2012-05-03T06:54:51.923 に答える