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

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

新規登録して質問してみよう
ただいま回答率
85.46%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

810閲覧

以下のコードの計算量について伺いたいです

inoino

総合スコア12

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2020/10/03 14:01

質問内容

以下のコードの計算量を教えてください。Atcoder,ARC104-B問題です。
計算量はO(N^2)と判断しました。Nは最大でも5,000しかとらないと明言されているため、計算量は多く見積もっても10^8で収まると考えましたがTLEとなりました。

以下のコードの計算量を教えてください。
また、計算量に問題がないのであればどの部分で計算量が増大してしまったのかも併せて教えていただけると幸いです。

ソースコード

python3

1from operator import sub 2 3N,S = input().split() 4 5N = int(N) 6ans = 0 7 8codes = [[0,0,0,0]] 9 10for i in range(N): 11 codes.append(codes[i][:]) 12 if S[i] == "A": 13 codes[i+1][0] += 1 14 elif S[i] == "T": 15 codes[i+1][1] += 1 16 elif S[i] == "G": 17 codes[i+1][2] += 1 18 elif S[i] == "C": 19 codes[i+1][3] += 1 20tem = [] 21 22for i in range(N+1): 23 for j in range(i+1,N+1): 24 tem.append(list(map(sub,codes[j],codes[i]))) 25 26for l in tem: 27 if l[0] == l[1] and l[2] == l[3]: 28 ans += 1 29 30print(ans)

試したこと

一番オーダーが大きい部分はi,jの二重ループでappendの計算量はO(1)のため、計算量はO(N^2)と判断しました。

補足情報

初めての質問ですので、何か失礼がありましたらご教示いただけると幸いです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

計算量はあってますが、純粋にPythonが遅いので時間がかかってるだけです。
ほかの人の提出を見ても無駄がない書き方をしてギリギリのようです。
C++のように早い言語ならこういう書き方でバグを減らすことも全然かまわないと思いますが、Pythonだとあらかじめ長さがわかってる配列をappendで構築する必要があるのかとか、そもそも配列が必要なのかを検討したほうがいいでしょう。

投稿2020/10/03 17:34

yudedako67

総合スコア2047

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

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

inoino

2020/10/03 21:20

yudedako67さん 回答ありがとうございました。計算量はあっていたようで安心しました。もともとpythonは遅いということはわかっていましたが、ここまでとは思っておりませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問