これは宿題です。
配列のモード (正の値) を見つけ、モードがsizeof(array)/2
支配的な値より大きい場合は、その値を二次的に返す必要があります。一部の配列にはどちらもありません。これは簡単ですが、決定の前に配列をソートしてはならないという制約があり、さらに、複雑さは O(nlogn) のオーダーでなければなりません。
この 2 番目の制約とマスター定理を使用して、時間計算量 'T(n) = A*T(n/B) + n^D' を決定できます。ここで、A=B および log_B(A)=D for O(nlogn ) 真であります。したがって、A=B=D=2 です。ドミナント値は、配列の前半、後半、または両方でドミナントでなければならないため、これも便利です。
'T(n) = A*T(n/B) + n^D' を使用すると、検索関数が各レベル (A) で 2 回自身を呼び出し、各レベル (B) で問題セットを 2 で分割することがわかります。アルゴリズムが各レベルで n^2 を考慮に入れる方法を考え出すのに行き詰まっています。
これのいくつかのコードを作成するには:
int search(a,b) {
search(a, a+(b-a)/2);
search(a+(b-a)/2+1, b);
}
ここで欠けている「接着剤」は、これらの分割された機能を組み合わせる方法であり、n^2 の複雑さを実装すると思います。ここには、前半または後半、またはその両方でドミナントがドミナントでなければならないいくつかのトリックがありますが、複雑さの制約で今それがどのように役立つかはよくわかりません.
小さな配列の例をいくつか書き留め、それが分割される方法を示しました。常に優勢な値を返す単一のメソッドを見つけるという正しい方向に進むことができないようです。
レベル 0 では、関数は自分自身を呼び出して配列の前半と後半を検索する必要があります。それは再帰して、それ自体を呼び出す必要があります。次に、各レベルで n^2 操作を実行する必要があります。したがって、配列 [2,0,2,0,2] では、それを [2,0] での検索と [2,0,2] での検索に分割し、さらに 25 回の操作を実行します。[2,0] の検索は、[2] の検索と [0] の検索を呼び出し、4 つの操作を実行します。これらは配列空間自体の検索である必要があると思います。私は C++ を使用し、STL から何かを使用して値を繰り返しカウントすることを計画していました。大きな配列を作成し、そのインデックスでカウントを更新するだけです。