コードフォースの問題を解決しています。社説によると、次のコードの複雑さは O(n) である必要があります。
for(int i = n - 1; i >= 0; --i) {
r[i] = i + 1;
while (r[i] < n && height[i] > height[r[i]])
r[i] = r[r[i]];
if (r[i] < n && height[i] == height[r[i]])
r[i] = r[r[i]];
}
ここで、height[i]
は - 番目の丘の高さであり、は よりも高い右から 1i
番目の丘r[i]
の位置であり、height 配列の他の値の中で常に最大です。height[i]
height[0]
私の質問は、内側の while ループが存在するにもかかわらず、コードの複雑さが O(n) であることをどのように保証できるでしょうか?
内側の while ループで、コードは>にr[i]
なるまで値を更新します。更新の数は、高さの配列によって異なります。たとえば、非減少順でソートされた高さ配列の更新回数は、非増加順でソートされた高さ配列の更新回数とは異なります。(どちらの場合も、この問題では が常に最大であるため、を除く配列をソートします)。height[i]
height[r[i]]
height[0]
height[0]
そして、このような入力データによって変化するアルゴリズムを分析する方法はありますか? 償却分析は答えの1つになりますか?
PS。私の質問をもっと明確にしたいと思います。ループ内に配列 r[] を設定します。そして、これはどうですか?配列height = {5,4,1,2,3}
とi=1
, ( r[2]=3
, r[3]=4
2 は 1 より大きい最初の値であり、3 は 2 より大きい最初の値であるため) の場合、4 と 1 を比較し、4>1 であるため、比較を試み続けます。 4 と 2(= height[r[2]]
)、4 と 3(= height[r[3]]
)。この場合、r[1] を設定するために 4 回比較する必要があります。の場合とは比較回数が異なりますheight = {5,1,2,3,4}
。コードの複雑さが O(n) であることを保証できますか? 見逃した場合はお知らせください。ありがとうございました。