線形時間 O(n) でサイズ n の配列の k 番目に小さい (または最大の) 要素を見つけるために、順序統計を読みました。
中央値の中央値を見つけるために必要な 1 つのステップがあります。
- 配列を [n/5] の部分に分割します。各パーツには 5 つの要素があります。
- 各部分の中央値を見つけます。(現在 [n/5] 個の番号があります)
- 最後の数字だけになるまで、手順 1 と 2 を繰り返します。(つまり、再帰的)
T(n) = T(n/5) + O(n) となり、T(n) = O(n) を得ることができます。
しかし、最終的に得られる数値は、中央値の中央値ではなく、大きな配列がある場合、中央値の中央値の中央値の中央値の中央値の中央値の中央値の中央値の中央値です。
125 要素の配列を考えてみてください。
まず、それを 25 の部分に分割し、25 の中央値を見つけます。次に、これらの 25 の数値を 5 つの部分に分割し、5 つの中央値を見つけます。最終的に、中央値の中央値の中央値である数値を取得します。(中央値の中央値ではありません)
私が気にする理由は、中央値の中央値よりも小さい(または大きい)要素が最大で約[3/4] * n個あることがわかるからです。しかし、それが中央値の中央値ではなく、中央値の中央値の中央値である場合はどうなりますか? 最悪の場合、ピボットよりも小さい (または大きい) 要素が少なくなる必要があります。これは、ピボットが配列の境界に近いことを意味します。
非常に大きな配列があり、その中央値の中央値の中央値の中央値の中央値の中央値の中央値を見つけた場合。最悪の場合、見つかったピボットがまだ境界に非常に近い可能性があります。この場合、時間計算量はどのくらいですか?
125 要素のデータセットを作成しました。結果は9ですか?
0.8 0.9 1 inf inf
1.8 1.9 2 inf inf
6.8 6.9 7 inf inf
inf inf inf inf inf
inf inf inf inf inf
2.8 2.9 3 inf inf
3.8 3.9 4 inf inf
7.8 7.9 8 inf inf
inf inf inf inf inf
inf inf inf inf inf
4.8 4.9 5 inf inf
5.8 5.9 6 inf inf
8.8 8.9 9 inf inf
inf inf inf inf inf
inf inf inf inf inf
inf inf inf inf inf
inf inf inf inf inf
inf inf inf inf inf
inf inf inf inf inf
inf inf inf inf inf
inf inf inf inf inf
inf inf inf inf inf
inf inf inf inf inf
inf inf inf inf inf
inf inf inf inf inf
ここで、inf は数値が十分に大きいことを意味します。