質問

与えられた $ n $ wights $ w_1、...、w_n $ 、および値< SPAN CLASS="math-container"> $ v_1、...、v_n $ 、および重み制限 $ w $ 、目的はまだ最大化されています搬送される項目の合計値(重み制限を超えていない)。さて、新しい制約は、値 $ v_i $ を持つ項目が取られると、値が $より大きいすべての項目が取得されます。 V_I $ も取らなければなりません。 (すべての $ v_i $ が異なると仮定していると仮定しても大丈夫です)

私の目的は、 $ o(n)$ x 時刻でこれを達成することです、そしてここで私の試みはアレイ $ a $ のタプル $(w_i、v_i)$ ):

  1. アイテムの合計重量を計算します。 $ w _ {\ mathrm {total}} \ gets \ sum_ {i= 1} ^ n w_i $

  2. $(w _ {\ mathrm {total}}}> w)$ do:

    2.1 $ p \ $ $ a $ ;

    2.2 $ R \ $ 値が $ p $ より大きい項目を取得します。

    2.3 $ l \ \ setminus r $ を取得します。 (値が $ p $ より小さい項目)

    2.4 $ w_r \ $ $ \ sum_ {a [i] \ in r} w_i $ ;

    2.5 $ w _ {\ mathrm {total}} \ gets w_r $ ;

    2.6 $ A \ GETS R $ ;

  3. $ w \ w-w _ {\ mathrm {total}} $ 。 (残容量)

  4. 配列 $ l $ の手順2を繰り返し、配列 $ l '$ ;

  5. $ l '\ cup $ ;

中央値を見つけるためのアルゴリズムは線形時間を求めます。

私は、私のアルゴリズムが $ o(n)$ 時刻から、入力サイズは半分の繰り返しです。それに自信を持って100%。そのため、このアルゴリズムは本当にリニアタイムにかかるか?そうでなければ、どのような修正を加えることができるか、または線形時間のコストのコストのようなアルゴリズムを設計するための一般的な考え方はありますか?あらゆる助けが高く評価されます! :)

役に立ちましたか?

解決

はいMEMINAINアルゴリズムの中央値を使用する場合、 $ o(n)$ 時刻で実行されます。 あなたはあなたのアルゴリズムを見ることによってそれを証明することができ、あらゆるループで私たちが検討している配列のサイズが半分にカットされることを証明することができます。ループ本体の実行時は $ o(n)$ です(中央値の中央値と配列コピー/フィルタリングは $ o(n)$ とにかく。今次の合計を取得します:

$$ \ sum_ {i= 0} ^ {\ log(n)}} \ frac {n} {2 ^ i} \ leq \ sum_ {i= 0} {\ infty} \ frac {n} {2 ^ i}= n \ cdot \ sum_ {i= 0} ^ {\ infty} \ frac {1} {2 ^ i}= 2n \ in \ in \ in \ in \ in \ in \ in \ in \

$ \ log(n)$ は、配列サイズ $ logを分割できることから来ています( n) $ 1 $ に到着するまで、半分の時間の時間( ^ {\ log(n) }= n $ )。合計のすべての期間は、ループ本体の1回の実行のコストを表します。

ライセンス: CC-BY-SA帰属
所属していません cs.stackexchange
scroll top