一般的なbig-oの説明を取得しようとしているカウントアルゴリズムがあります。それは恐ろしく入れ子になっていて、恐ろしく指数関数的です。ここにあります:
1. For each T_i in T
2. For k = 1 to max_k
3. For each of 2^k*(n choose k) items
4. For each t in T_i
5. check if the item is in t...etc.
これが各実行時間の行ごとのアイデアです
- これは単純なパーティショニングであり、定数c1を指定します。
- max_kは小さい数で、常にn未満、おそらく4または5程度です。以下でkを使用します。
- このループは常に2^k *(nはkを選択)回実行されます
- ライン1の定数を考慮することで、このラインを一般化して、最悪の場合、合計で2 ^ n回を超えて発火することはないことがわかりますが、通常は2 ^ n回の何分の1かで実行されるため、これを(2 ^ n)/ c2
- これは、これらすべてのループ内の単純なifステートメント操作であるため、c3です。
これらすべてを掛け合わせると、次のようになります。
c1 * k * 2^k * (n choose k) * (2^n)/c2 * c3
big-O表現が必要なので、定数を無視すると次のようになります。
k * 2^k * (n choose k) * (2^n)
(n Choose k)は(n * e / k)^ kによって制限されることが知られているので、次のようになります。
O(k * 2^k * (n * e / k)^k * (2^n))
私の質問は、ここで何を無視できるかということです... nは常にkよりも大きく、通常ははるかに大きいため、2^nは確かに支配的な用語です。これをO(2 ^ n)に簡略化できますか?またはO(2 ^ひどい)?または、O(2 ^ k * 2 ^ n)のように、2 ^ kのままにする必要がありますか?(またはすべての用語を残しますか?)
私の理解では、kまたはmax_kがnと競合または超えることができる場合、それらは不可欠です。しかし、それらは常に支配的であるため、多項式実行時間の低次項のように破棄できますか?指数関数的な実行時間の混乱はすべて私を混乱させていると思います。アドバイスをいただければ幸いです。