部分的に注文された設定を通してバイナリ - ISH検索
-
29-09-2020 - |
質問
私は興味深い機能を持っています。それは{1、...、n}のサブセットを正の整数、すなわち $ f:p([n])\ requearrow z ^ + $ に取ります。
SがS 'のサブセットである場合、 $ f(s)
発注が完全に辞書であった場合は、単純なバイナリ検索を使用します。私はそれがそうではないと思います(例えば、 $ 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つずつのサブセットに含める必要があります。
- $ b_k= f(\ emptyset)$ を初期化します。 $ \ b_k $ は、この手順の最後に、sys $ k $ のサブセットの最良の値になります。 。
- initialize $ count= 0. $ $ \ count $ は、持っている要素の数です。これまでのところ最良のサブセットに含まれています。
- 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 $ 。
- 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 $ 。
- など。
- 私たちがチェックしたまで $ f(\ {1 \})$ または $ count== k $ < / SPAN>。
$ 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 $ のときに最も簡単な場合をスキップします。その場合、アルゴリズムはそのようなサブセットがないことを返すべきです。