質問

私は興味深い機能を持っています。それは{1、...、n}のサブセットを正の整数、すなわち $ f:p([n])\ requearrow z ^ + $ に取ります。 SがS 'のサブセットである場合、 $ f(s)の場合、私は知っています。また、SとS 'が同じ基数を持つ場合、fによって引き起こされる順序は辞書であるので、 $ f(\ {1,2,4 \})。 値 z を考えると、 $ f(s)<= z $ $ f(s)<= f(t)<= z $ $ f(s)= f(t)$ です。 - つまり、[N]のサブセットの格子上の検索をしたいです。

発注が完全に辞書であった場合は、単純なバイナリ検索を使用します。私はそれがそうではないと思います(例えば、 $ f(\ {1,2,3,4,5,6 \)$ おそらく $ f(\ {7 \})$ より大きいです)。 POSETでこの検索を行うための良いO(N)アルゴリズムはありますか?明らかに高いサイズのNのために、私はF上でFを計算し、メモリ内の保存に頼らないでください。

議論の後の説明: 特定の $ f $ 私はAddivibital - 特に $ f(s)=sum_ {k \ $ g $ 単調に増加する関数を持つ} g(k)+ f(\ emptyset)$ 。これは一般的なケース(どちらも興味深いが私の特定の問題ではありません)よりも簡単かもしれません。

役に立ちましたか?

解決

これは $ o(n ^ 2)$ 時間と $ o(n)で動作する単純なアルゴリズムです。 $ f(\ emptyset)$ $ f(\ {1 \})を仮定して、スペース$ スペース$ $ f(\ {2 \})$ $ \ cdot $ $ f(\ {n \})$ は配列内にあります。

開始のアイデアは彼のコメントの中でopによって与えられたものとほぼ同じです。 $ k $ ごとに、x span class="math-container"> $ 0 $ から、辞書の順番を使ってサイズkのサブセットを検索します。 $ n $ へ。 $ f $ の最良値を持つものを保持します。 "

サイズのサブセットの $ f $ の最良値を検索する方法は、span class="math-container"> $ k $ 、 $ b_k $ $ o(n)$ 時間。バイナリ検索の代わりに、 $ n $ $ n-1 $ 、\ cdotsかどうかを確認します。 $ 1 $ は、サブセットの辞書の順序の実際の利点を考えると、1つずつのサブセットに含める必要があります。

  1. $ b_k= f(\ emptyset)$ を初期化します。 $ \ b_k $ は、この手順の最後に、sys $ k $ のサブセットの最良の値になります。 。
  2. initialize $ count= 0. $ $ \ count $ は、持っている要素の数です。これまでのところ最良のサブセットに含まれています。
  3. check $ f(\ {n \})$ $ b_k + f(\ {n \})+ f(\ {1,2、\ cdots、kカウント-1 \})\ le z $ $ n $ を含める必要があります。 $ f(\ {n \})$ f(\ {n \})$ f(\ {n \})$ $ b_k $ を追加し、 $ count $
  4. check $ f(\ {n-1 \})$ $ b_k + f(\ {n-1 \})+ f(\ {1,2、\ cdots、k-count-1 \})\ Le z $ $ n-1 $ に含める必要があります。 $ f(\ {n-1 \})$ f(\ {n-1 \})$ への $ b_k $ を追加し、1を追加します。 SPAN CLASS="math-container"> $ count $ 。
  5. など。
  6. 私たちがチェックしたまで $ f(\ {1 \})$ または $ count== k $ < / SPAN>。
  7. $ o(n)$ を撮るのは疑問に思うかもしれません。 $ f(\ {1 、2、\ Cdots、K-Count-1 \})$ 、各 $ b_k $ 単独で $ O(n * n)$ 時間。ただし、 $ f $ はandialsですので、 $ f(\ {1 \})$のすべての接頭辞の合計を計算できます。 $ f(\ {2 \})$ $ \ cdot $ 、< SPAN CLASS="math-container"> $ f(\ {n \})$ upfront in $ o(n)$ 時間。その後、 $ o(1)$ になります。

    $ b_k $ を検索してから $ o(n)$ x 時間、 $ k $ から $ 0 $ $ n $ 全走行時間は $ o(n ^ 2)$ です。


    アルゴリズムの上記の説明は、 $ f(\ emptyset)\ gt z $ のときに最も簡単な場合をスキップします。その場合、アルゴリズムはそのようなサブセットがないことを返すべきです。

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