先日のプログラミングコンテストに初めて提出したコードの復讐をするために、
計算量オーダーを算出したいと思っています。
以下のように計算したのですが、合っているかどうかの添削をお願いします。
python
1count = 0 2for i in range(n): 3 for k in range(i+1,n+1): 4 if sum(s[i:k]) == 0: 5 count += 1 6
計算手順
まずif文を無視するとforの二重ループは
\sum_{k=1}^{n}k = \frac {1}{2}n(n-1)
という風に計算できるので、
1/2 * O(n^2 + n) = O(n^2)
となります。
(teratailでの数式の記述の仕方がわかりませんでした。読みにくくてすいません)
特にわからないのはif文の条件式の部分ですが、
sum()とsliceのオーダーの求め方が合っているかわかりません。
このサイトを参考にするとsliceはO(k)だそうなので、
全体で見るとsliceの部分は、
\sum_{k=1}^{n}\sum_{l=1}^{k}l = \frac {1}{6}n(n+1)(n+2)
となるので、O(n^3)。
sum()も要素数でしょうか、
だとすると、上と同じ計算でO(n^3)。
よって、O(n^2) + 2O(n^3) = O(n^3)
とてもめちゃくちゃな計算になっている気がします・・。
よろしくお願いします。
sliceの中身に詳しくないのですが、参考にしているサイトでばO(k+n)になっていますが、sliceのnは考慮しなくてもいい感じですか?

すいません。よくわからないまま「Get Slice」の欄を見てO(k)にしたのですが、この場合だと「Set Slice」を見るのが適切なのでしょうか

回答2件
あなたの回答
tips
プレビュー