web-dev-qa-db-ja.com

リストスライスのBig-O

Pythonリスト、my_listにN個の要素が含まれているとします。単一の要素はmy_list[i_1]を使用してインデックス付けできます。ここで、i_1はインデックスのインデックスですただし、Pythonリストはmy_list[i_1:i_2]にインデックスを付けることができます。ここで、i_1からi_2までのリストの「スライス」が望ましいです。サイズNのリストをスライスするBig-O(最悪の場合)表記?

個人的には、「スライサー」をコーディングしている場合、i_1からi_2まで反復し、新しいリストを生成してそれを返し、O(N)を示唆して、これはPythonそうですか?

ありがとうございました、

31
mjgpy3

スライスの取得はO(i_2 - i_1)です。これは、Pythonのリストの内部表現が配列であるため、i_1から開始してi_2まで繰り返すことができるためです。

詳細については、Python time complex wiki entry を参照してください。

必要に応じて、実装を CPythonソース で確認することもできます。

21
Sam Mussmann

http://wiki.python.org/moin/TimeComplexity によると

O(k)ここで、kはスライスサイズです。

13
Joran Beasley

サイズNのリストとサイズMのスライスの場合、反復は実際にはO(M)のみであり、O(N)ではありません。 Mは<< Nであることが多いため、これは大きな違いをもたらします。

実際、あなたの説明を考えれば、その理由がわかります。 i_1からi_2まで反復しているだけで、0からi_1まで、次にI_1からi_2まで反復していない。

5
abarnert