web-dev-qa-db-ja.com

Python内のlist.index(x)の複雑さ

私はこれについて言及しています: http://docs.python.org/tutorial/datastructures.html

ビッグO表記の観点から、list.index(x)関数の実行時間はどれくらいですか?

30
user734027

それはO(n)です。以下もチェックしてください: http://wiki.python.org/moin/TimeComplexity

このページでは、現在のCPythonでのさまざまな操作の時間の複雑さ(別名「Big O」または「Big Oh」)について説明します。その他のPython実装(またはCPythonの古いバージョンまたはまだ開発中のバージョン)は、パフォーマンス特性が若干異なる場合があります。ただし、一般に、 O(log n)...

33
zeekay

上記のドキュメントによると:

list.index(x)

値がxである最初の項目のリスト内のインデックスを返します。無い場合はエラーとなります。

これは検索を意味します。効果的にやっているx in sですが、TrueまたはFalseを返すのではなく、xのインデックスを返します。そのため、O(n)の リストされている時間の複雑さ を使用します。

8
user257111

すべてのリスト実装は、線形検索(たとえば、list.index)のO(n)複雑さ)を持ちます。たぶん、もっと悪いいくつかの奇抜な実装があるかもしれませんが...

順序付きリストやセットなどのさまざまなデータ構造を使用することで、検索の複雑さを改善できます。これらは通常、バイナリツリーで実装されます。ただし、これらのデータ構造は、含まれる要素に制約を課します。バイナリツリーの場合、要素は順序付け可能である必要がありますが、ルックアップコストはO(log n)まで下がります。

前述のように、標準のランタイムコストについてはこちらをご覧くださいPythonデータ構造: http://wiki.python.org/moin/TimeComplexity

1
Alex Smith

次のコードを使用してタイミングを確認します。その複雑さはO(n)です。

import time


class TimeChecker:

    def __init__(self, name):
        self.name = name

    def __enter__(self):
        self.start = self.get_time_in_sec()
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        now = self.get_time_in_sec()
        time_taken = now - self.start  # in seconds
        print("Time Taken by " + self.name + ": " + str(time_taken))

    def get_time_in_sec(self):
        return int(round(time.time() * 1000))


def test_list_index_func(range_num):
    lis = [1,2,3,4,5]
    with TimeChecker('Process 1') as tim:
        for i in range(range_num):
            lis.index(4)

test_list_index_func(1000)
test_list_index_func(10000)
test_list_index_func(100000)
test_list_index_func(1000000)

print("Time: O(n)")
0
Geetesh Gupta