私は最近 MIT の 6.006 講義を見始めました。最初の講義では、インストラクターがピーク検出アルゴリズムを提示しました。
彼の定義によると:
配列 [a,b,c,d,e,f,g] が与えられ、ここで ag は数値であり、a <= b かつ b>= c の場合に限り、b はピークです。
彼は再帰的なアプローチを与えました:
if a[n/2] < a[n/2 -1] then look for a peak from a[1] ... a[n/2 -1]
else if a[n/2] < a[n/2+1] then look for a peak from a[n/2+1] ... a[n]
else a[n/2] is a peak
彼は、アルゴリズムは T(n) = T(n/2) + o(1) = o(lgn) であると言いました
彼の pdf で、彼は完全な例も示しました。[6,7,4,3,2,1,4,5]
7 と 5 の両方がピークです。しかし、上記のアルゴリズムは、真ん中の要素がたまたま最初の分岐を満たすという理由だけで、ピークとして 7 を見つけるだけではありませんか?
では、すべてのピークを見つけなければならない場合でも、配列全体を見ていくことになりますか? それは最悪のケースNを意味しますか?
彼の定義は、単一のピークを見つけるだけでよいことを意味しているのでしょうか?
この問題は、Riverst のアルゴリズム入門書で最大要素と最小要素を見つけることと見なすことができると思います。