質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

再帰

情報工学における再帰とは、プログラムのあるメソッドの処理上で自身のメソッドが再び呼び出されている処理の事をいいます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

809閲覧

関数呼び出しをするプログラムの時間計算量について

退会済みユーザー

退会済みユーザー

総合スコア0

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

再帰

情報工学における再帰とは、プログラムのあるメソッドの処理上で自身のメソッドが再び呼び出されている処理の事をいいます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/07/07 04:15

前提・実現したいこと

配列が与えられた時に最長の1の数を返すプログラムを書いています。

#入力 A = [1,1,0,0,0,1,1,1,1,0,0] #出力 4

発生している問題・エラーメッセージ

時間計算量(オーダ)を考えたいのですが、今回のプログラムだと最悪の場合で0(n^2)になるという理解で正しいでしょうか。
関数内で関数を呼び出す場合、今回のように繰り返し O(n)が更にn回繰り返されると考えられますか。

該当のソースコード

python

1def loggestnum(A): 2 max = 0 3 for i in range(len(A)): #繰り返し O(n) 4 p = countones(A, i) #繰り返し O(n) 5 if (max<p): 6 max = p 7 return max 8 9def countones(A,i): 10 p = 0 11 j = i 12 while j <= len(A) and A[j] == 1: 13 p = p+1 14 j = j+1 15 return p 16 17A = [1,1,0,0,0,1,1,1,1,0,0] 18print(loggestnum(A))

補足情報(FW/ツールのバージョンなど)

python 3.6

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

そのロジックの場合、1が続く回数をmとするとO(nm)って具合になるでしょう。mをnの線形関数とみなせればO(n^2)かもしれませんが、みなせないはず。分布に仮定を置いていいのなら(0と1が等確率でランダムに出現する、とか)平均計算量をnだけで表すことはたぶんできるでしょう。

関数呼び出しの有無は関係ありません。関数として書かないでループ内でベタに書いても計算量は同じです。

あと、連続する最大数を数えるだけならO(n)でやる方法があります。つまり、そのロジックはうまくないのです。

投稿2019/07/07 04:34

hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/07/10 03:15 編集

ご回答いただきありがとうございます。O(nm)になるアルゴリズムとO(n^2)になるアルゴリズムのちがいがよく理解できていないのですが、 「O(n)が更にn回繰り返される」とき、2nになるかn^2になるのかはどのように区別すればいいのでしょうか。 O(n)に関しては、先ほど質問したのですが動的計画法のアプローチで書けば実現可能という理解で正しいでしょうか。 質問:https://teratail.com/questions/199121
hayataka2049

2019/07/07 04:47

O(n)が更にn回繰り返されるなら紛れもなくO(n^2)ですが、リストの長さnと1が続く回数は別の変数ですから区別してO(nm)と書きます。 O(n)に関しては、動的計画法なんか使わなくてもできます。1が連続する回数を数えたら、その部分はすっ飛ばして続きから数え始めればいいだけなので。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問