このブログの更新は Twitterアカウント @m_hiyama で通知されます。
Follow @m_hiyama

メールでのご連絡は hiyama{at}chimaira{dot}org まで。

はじめてのメールはスパムと判定されることがあります。最初は、信頼されているドメインから差し障りのない文面を送っていただけると、スパムと判定されにくいと思います。

参照用 記事

Power Liftingって、重量上げか?

(木曜日の続きなのです)

あいだがあくと文字通り“間が抜ける”のだけど、

  • [雑記/備忘]データ構造の基本としてのコレクション
  • [雑記/備忘]演算「・」と定数「I」をオーバーロード定義する

の次の話です。リスト、バッグ、セットのパワーを作ります。って、パワーって何?

えーとですね、"power"の訳語は「べき」で、パワーを作るってのは:

集合Xから、Xの部分集合全体の集合を構成すること

です。が、実例を出したほうが分かりやすいでしょう。

Xのパワーセット(訳語はベキ集合)をPow(X)と書くことにして:

  • Pow({}) = {{}}
  • Pow({1}) = {{}, {1}}
  • Pow({1, 2}) = {{}, {1}, {2}, {1, 2}}

我々が扱っていた集合は、(ジェネリックスの記法で書けば)List、Bag、Setでしたよね。これらは、原理的には無限集合なので、そのパワーセットはますます無限集合です。なので、イメージしにくい、完全列挙できない、というような問題がありますが、がんばってイメージしてくださいな。

X上で定義されていた演算や定数(の対応物)をPow(X)上でも考えることを、「…をPow(X)に持ち上げる(リフトする)」と表現することがあります。パワーセットに持ち上げるのでパワーリフティングってことになります。

2項演算・と定数Iのパワーセットへの持ち上げは次のとおり:

  • A・B = {x・y | x∈A, y∈B}
  • 持ち上げたI = {I} (シングルトンセットとして持ち上げる)

これじゃ分かりにくいので、A・Bを作る擬似コードを書いておきましょう。


Result = I; // まず空コレクションを準備
foreach (x in A) {
foreach (y in B) {
Result.add(x・y); // あらゆる組み合わせを寄せ集めて、
}
}
return Result; // それを返す。

(続く)