2016-11-25 6 views
-2

空の辞書のこの__setitem__メソッドの時間複雑度はどのくらいですか?私は辞書の.keyと.valueのpythonメソッドはO(n)(私はどこかで読んでいる)とforループもO(n)だと思う。私の推測はO(n)* O(n)* O(n)+ O(1)= forループ+ if + body + appendの場合です。しかし、私は "if in for loop body"の状況と.itemと.valueがO(n)であることは確信していません。このsetitemメソッドのBig-Oとは何ですか?

助けてください。それは私の学校のテストにあった。コードはPythonで書かれています。

def __setitem__(self,k,v): 
    for item in self._table: 
    if k == item._key: 
     item._value = v 
     return 
    self._table.append(self._Item(k,v)) 

答えて

2

最悪の場合、あなたはself._tableオブジェクト内のすべての要素をチェックする必要がありますので、それは(self._Itemを構築すると仮定するとO(1)です)O(len(self._table))です。

ifステートメントとその本体は、アトミック操作であるため、入力に関してはO(1)となります。したがって、forループの複雑さはO(n) * O(1) * O(1) == O(n)であり、nself._tableのサイズです。それはO(1)を償却ですので

appendは、リストのアトミック操作ですが、この操作に達した場合、あなたはすでにO(n)仕事をやったので、それは方法O(n)になります。

1

複雑さはO(n)です。複雑さを考えると、アルゴリズムに入れるデータが非常に大きいと常に想像しています。また、大きな数値の場合、O(n)は、計算の複雑さに大きな違いをもたらすO(n)のように "大きな"違いがないため、はO(2n)と同じです。大きなOの有効な表記法ではありません。ループ回数がn回で、ネストされたループや貴重な計算がリストにないため、O(n)のリストをループするだけなので、全体の複雑さはO(n)のままです。

関連する問題