2016-08-14 13 views
0

次の擬似コードを考えてみましょう。 if/else/ifステートメントがあります。各条件分岐内には、トリプルネストされたforループがあります。この文の複雑さはO(n^3)なので、関数は1つのパス(つまり、if、elifなど)を取ることができるか、それより複雑です。if/elif/else文を使った関数のO(n^3)複雑度

def myFunction(myVariable, myList): 
    if myList == conditionOne: 
     for sublist in myList: 
      for element in sublist: 
       for char in element: 
        print(char) 
    elif myList == conditionTwo: 
     for sublist in myList: 
      for element in sublist: 
       for char in element: 
        print(char) 
    else: 
     for sublist in myList: 
      for element in sublist: 
       for char in element: 
        print(char) 
+1

です。ここにはさまざまなシーケンスがありますが、どれがどれくらいの長さですか? –

答えて

2

これはそれよりも複雑ですが、条件付きのためではありません。あなたの現在のコードはすべてのブランチで同じことをしますが、あなたの本当のコードはおそらくまったく同じようには見えませんが、良い近似であるかもしれません。この場合、難しさは他の場所から完全に生じます。

現在のコードの複雑さは、すべてのサブリストのすべての要素の長さの合計です。 nmyListの長さの上限である場合、sublistelementの場合、これはO(n3)になります。そうでない場合は複雑になる可能性があります。

別の簡単な特殊なケースは次のとおりです。

  • myListは長さnを持っています。
  • すべてsublistは、最大でもmです。
  • すべてelementは、最大でもkです。

次に、あなたの複雑さが陽性であることがnmkと仮定すると、O(NMK)となります。

+1

微妙な訂正:k = 0の場合、すべての要素が空ですが、リストとサブリストを調べる必要があるため、O(nm)が残ります。 – gnasher729

0

私は、あなたの関数の時間計算量がリストmyListの長さに依存するだけでなく、依存するだけでなく、あなたがnリストmyList(サブリストの数)の長さであると仮定したとします。

  • 各サブリストの最大長さ(各サブリスト内の要素の最大数 - 各分岐条件の2 for-loop

  • 各要素の最大長さ(各要素における文字の数 - 3 for-loop

正確に、nmpは、それぞれリストの長さは、各サブリストの最大長さ、及びある場合各要素の最大長さ、最悪の場合、アルゴリズムの時間複雑さはO(n * m * p)です。

+0

はい、集合O(n \ * m \ * p)内の関数も集合O(max {m、n、p}^3)にあります。 – Bakuriu

+0

はい、それは当てはまりますが、これはかなり近似しています... –

+0

10億の文字を持つ1つのサブリストを持つリストがある場合、O(max(m、n、p)^ 3)は非常に、非常に悪い近似。それは真実だが、誤解を招く。 「私のコンピュータは数秒でそれをする」と「世界中のコンピュータやコンピュータがこれを行うことはありません」との違いです。 – gnasher729

0

このコードの複雑さは実際にはO(1)です。どの条件が真で、リスト、サブリスト、要素の長さは何ですか?最初の文字を読んだ後はすぐに戻ります。それは間違いだとあなたが実際にすべての文字を反復処理している場合

、それはn何であるかに依存するだろう、とそれを定義する2つの一般的な方法があります:通常

  1. 時間の複雑さについて話して、我々はそれを定義します入力の点で。ここでは、あなたのアルゴリズムは(すべての要素を反復していると仮定して)入力の大きさが線形であるので、複雑さは実際にはO(n)です。あなたはmylistにおけるサブリストの数ではなく、入力の大きさ、及び各サブリストはmの要素を持っているINHに加え、長さk(平均上のすべて)の各としてnを参照する場合Run-time analysis is a theoretical classification that estimates and anticipates the increase in running time (or run-time) of an algorithm as its **input size (usually denoted as n) increases**....
  2. wikipediaから。次に、複雑さはO(n*m*k)
+0

最初の文字を返す間違いをしました。私はそれを修正した。はい、nはmylistのサブリストの数です。 –

+0

これは言語によって異なります。キーワード 'return'がPythons' yield'のように振る舞う言語があるかもしれません。 ;-) –

+0

@HermannDöppes引用が必要です。私は 'return'を' yield'とした擬似コードを書いた記事を見たことがなく、正当な理由があります。 (とにかく、OPは彼の質問を修正したので、間違いのようですので、答えの第2部分が適用されます) – amit

関連する問題