1

配列に整数を 1 つずつ入力する必要があります。入力のプロセスが進行している間、数値の上位 (最大) 1/3 から最小の数値を何度でも見つけるように求められる場合があります。

例えば:

input 1

input 7 

input 9

tell the number

input 21

input 8

input 5

tell the number

input 11

tell the number

出力は次のようになります。

9

9

11

説明:

  • 最初のクエリまで、配列の数字は 1 7 9 であるため、上位 1/3 の数字は 9 になります。
  • 2 番目のクエリが作成されると、配列は のよう1 7 9 21 8 5になるため、並べ替え配列は次のようになります:
    21 9 8 7 5 1、上位 1/3 の数字は 21 と 9 になります。それらの最小値は 9 になります。
  • 最後のクエリ配列には1 7 9 21 8 5 11、ソート時に21 11 9 8 7 5 1上位 1/3 の数字が 21 と 11 になります。これらの最小値は 11 です。

配列内の整数の総数は 250000 です

私のアプローチは、パーティションで選択アルゴリズムを適用することですが、時間制限を超えています。

4

3 に答える 3

3

選択アルゴリズムが失敗する理由:
選択アルゴリズムの使用は #elements で線形であることに注意してください。#requests が #elements で線形であると仮定すると、二次解につながります。これが制限時間を超える理由です。

別のアプローチ: 最大ヒープH1と最小ヒープの 2 つのヒープを維持するH2

最大ヒープ ( H1) は 2/3 の最小値を保持し、最小ヒープは 1/3 の最大値を保持します。

次に、読み取った要素ごとにx、トップ 1/3 ヒープ ( H2) を増やす必要があるかどうかを確認します。必要な場合は、 を追加する必要がありますmax{x,H1.max()}。追加した場合H1.max()は、ヒープから削除し、x代わりに挿入する必要があります。追加が必要ない場合は、 が より大きいかどうかを確認し、x大きい場合はH2.min()最小フォームを削除してH2に挿入しH1、 に追加xH1ます。


注: このソリューションで探している数はO(1)、いつでも見つけることができます。これは、最小ヒープ ( H2) の最小値です。

このソリューションの複雑さの合計O(nlogn + k)- ここでnは数字の数、kは「数字を伝える」リクエストの総数です。

: より簡単な解決策 (おそらく遅くなりますが) は、並べ替えられたリストを維持し (たとえば、BSTまたはスキップリストで)、二分探索を使用して関連する要素を探すことです。

例:

init:
H1 = {}
H2 = {}

input1:
H1 = {1}
H2 = {}

input7:
H1={1,7}
H2 = {}

input 9: //need to add a max, in this case: x > H2.max() -> add x to H2.
H1 = {1,7}
H2 = {9}

tell the number
H2.min() = 9

input 21: // 21>9 -> remove H2.min() add it to H1, add x to H2
H1 = {1,7,9}
H2 = {21}

input 8:
H1 = {1,7,8,9}
H2 = {21}

input 5: //remove max from H1, add max to H2, add x to H1
H1 = {1,7,5,8}
H2 = {9,21}

tell the number
H2.min() = 9

input 11: //remove min from H2, add it to H1, add x to H2.
H1 = {1,7,5,8,9}
H2 = {11,21}
tell the number
H2.min() = 11
于 2012-07-09T12:13:08.053 に答える
0

どうですか:

  1. 配列をソートして保持、挿入コスト = log(n)
  2. 1/3 = O(1) から最小値を取得
于 2012-07-09T18:15:11.320 に答える
0

(この質問はある種の宿題だと思います (「私たちはしなければなりません」)。したがって、私は率直に答えているわけではありません。)

タスクを再定式化する: オンライン アルゴリズムを使用して 66 パーセンタイルを見つけるよう求められます。50 パーセンタイルである median に対する SO の質問が既にあるので、そこから適応できるはずです。そのアルゴリズムがうまくいかない場合は、オンラインの中央値アルゴリズムについて調査してください。そのほとんどは、問題にも当てはまるはずです。

于 2012-07-09T11:59:13.043 に答える