差分

このページの2つのバージョン間の差分を表示します。

この比較画面へのリンク

両方とも前のリビジョン前のリビジョン
次のリビジョン
前のリビジョン
次のリビジョン両方とも次のリビジョン
programming_algorithm:dynamic_programming:subset_convolution [2020/02/13] – [定義] ikatakosprogramming_algorithm:dynamic_programming:subset_convolution [2020/02/14] ikatakos
行 19: 行 19:
   部分集合  {}, {0}, {1}, {2}, {0, 1}, {0, 2}, {1, 2}, {0, 1, 2}   部分集合  {}, {0}, {1}, {2}, {0, 1}, {0, 2}, {1, 2}, {0, 1, 2}
  
-  * それぞれの部分集合につき、何らかのスコアが決まっている +  * それぞれの部分集合 $S$ につき、何らかのスコア $f(S)$ が決まっている 
-  * ある部分集合 $S$ について、$\subseteq T$ となるような全ての $T$ のスコアの総和を求めたい+  * ある部分集合 $S_i$ について、$S_i \subseteq T$ となるような全ての $f(T)$ の総和を求めたい
  
   部分集合  {}, {0}, {1}, {2}, {0, 1}, {0, 2}, {1, 2}, {0, 1, 2}   部分集合  {}, {0}, {1}, {2}, {0, 1}, {0, 2}, {1, 2}, {0, 1, 2}
-  スコア     3      4    1      5                    6+  f(S)       3      4    1      5                    6
      
-  S = {1}  →  T = {1}, {0, 1}, {1, 2}, {0, 1, 2} +        Si = {1} 
-      スコアの総和  4  +            6    17+     →  T = {1}, {0, 1}, {1, 2}, {0, 1, 2} 
 +  f(T)の総和  4  +            6    17
  
   * これを全ての部分集合について行うのが「ゼータ変換」であり、高速に行うアルゴリズムを「高速ゼータ変換」という。   * これを全ての部分集合について行うのが「ゼータ変換」であり、高速に行うアルゴリズムを「高速ゼータ変換」という。
  
   部分集合  {}, {0}, {1}, {2}, {0, 1}, {0, 2}, {1, 2}, {0, 1, 2}   部分集合  {}, {0}, {1}, {2}, {0, 1}, {0, 2}, {1, 2}, {0, 1, 2}
-  スコア     3      4    1      5                    6+  f(S)       3      4    1      5                    6
   Z変換     31  21   17   18     11      15              6   Z変換     31  21   17   18     11      15              6
  
-  * また、Z変換後から元のスコアを逆算する処理を「メビウス変換」という。+  * また、Z変換後から元の $f(S)$ を逆算する処理を「メビウス変換」という。
  
-  スコア     3      4    1      5                    6+  f(S)       3      4    1      5                    6
                  ゼータ変換↓   ↑メビウス変換                  ゼータ変換↓   ↑メビウス変換
   Z変換     31  21   17   18     11      15              6   Z変換     31  21   17   18     11      15              6
行 182: 行 183:
 それを考えると、メビウス変換は逆演算が可能でなければならない? maxは逆演算できないので、メビウス変換は適用できないと思われる。 それを考えると、メビウス変換は逆演算が可能でなければならない? maxは逆演算できないので、メビウス変換は適用できないと思われる。
  
-==== 最大公約によめ上げ ====+==== 包含以外の畳み込み ==== 
 + 
 +ゼータ変換後の $f$ を $\zeta(f)$ とする。ゼータ変換①を式で表すと 
 + 
 +  * $\zeta(f)(S) = \sum_{S \subseteq T} f(T)$ 
 + 
 +ここで $S$ はbitフラグを示す一般の字と解釈すると、BitAND演算で示すことも出来る。 
 + 
 +  * $\zeta(f)(i) \sum_{i \ AND \ j=i} f(j)$ 
 + 
 +このBitAND演算を変えて畳み込みを行うバリエーションも存在する。特にゼータ変換②は、BitORにしたものである。
  
-  * [[http://noshi91.hatenablog.com/entry/2018/12/27/121649|高速ゼータ変換の約数版 - noshi91のメモ]]+  * ゼータ変換② 
 +    * $\zeta(f)(i) = \sum_{i \ OR \ j=i} f(j)$ 
 +  * maxによる畳み込み 
 +    * $\zeta(f)(i) = \sum_{\max(i,j)=i} f(j)$ 
 +      * 単なる累積和っぽい? 
 +  * 最大公約数、最小公倍数による畳み込み 
 +    * $\zeta(f)(i) = \sum_{\gcd(i,j)=i} f(j)$ 
 +      * $i$ の倍数であるような $j$ 
 +    * $\zeta(f)(i) = \sum_{\lcm(i,j)=i} f(j)$ 
 +      * $i$ の約数であるような $j$ 
 +    * [[http://noshi91.hatenablog.com/entry/2018/12/27/121649|高速ゼータ変換の約数版 - noshi91のメモ]]
  
programming_algorithm/dynamic_programming/subset_convolution.txt · 最終更新: 2020/02/14 by ikatakos
CC Attribution 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0