このブログは、旧・はてなダイアリー「檜山正幸のキマイラ飼育記 メモ編」(http://d.hatena.ne.jp/m-hiyama-memo/)のデータを移行・保存したものであり、今後(2019年1月以降)更新の予定はありません。

今後の更新は、新しいブログ http://m-hiyama-memo.hatenablog.com/ で行います。

アロケーションの基本

基本的な定義

以下、a, b, cなどは任意の実数(+∞、-∞を含むかも知れない)、x, y, zなどは0以上1以下の実数だとする。[a, b;x]のような形式を考える。これは、aとbを端点とする区間を表し、それに実数xが付随している。[a, b;x]で表現される対象を重み付き区間(weighted interval)と呼ぶ。

a>b のとき、[a, b;x]は空集合、[a, a;x]は一点となる。便宜上、空区間を[;x]、1点区間を[a;x]と書く。これらはゴミ扱いされるが、計算の途中では出てくるかもしれない。空でも1点でもない(重み付き)区間プロパーな区間と呼ぶ。

重み付き区間をα、β、γなどギリシャ小文字で表す。また、単に「区間」と言っても重みが付いているとする。重み(重さ)は、本来実数値だが、現実にはパーセント値として0から100の整数で表す。が、ここでは理屈の話だから実数のまま扱う。

区間α = [a, b;x]に対して、begin(α) = a, end(α) = b, dur(α) = (b - a) とする。空区間は考えない(例外だ)。

区間のリスト[α1, α2, ...]を考える。begin(α1)≦begin(α2)≦ ... となっているとき、このリストは整列されているという。以下で区間のリストを考えるとき、たいていは整列されているとする(整列されてなかったら、まずは整列する)。

区間のリストがあるとき、それをより簡略な形にすることを考える。まず、一点区間は除いておく(空区間は最初から入らないようにすべき)。つまり、すべての区間はプロパーだとしよう。

リストの正規化

[a, b;x]と[c, d;y]がリスト内で隣り合う区間だとする。次の条件を満たすとき、縮約可能という。

  1. x = y (重みが等しい)
  2. b = c (ピッタリくっついている)

このとき、[a, b;x]と[c, d;y]を[a, d;x]に置き換える操作を縮約(contraction)と呼ぶ。縮約すると、リストの長さが1つ短くなる。縮約は何度も繰り返し行えるかもしれない。

[a, b;x]と[c, d;y]がリスト内で隣り合う区間だとするとき、c<b なら、その区間対はオーバラップしているという。オーバラップしている区間対を次の3つの区間に分ける。

  1. [a, c;x]
  2. [c, b;x+y]
  3. [b, b;y]

a=cのときは、最初の区間が点区間になるので捨てる。b=dのときは、3つ目の区間が点区間になるので捨てる。この操作を(うまい名前がないので)オーバラップ解消と呼ぶ。オーバラップ解消で、2つの区間が3つ、または2つ、または1つになる。

次の条件をすべて満たすリストは正規形と呼ぶ。

  1. 整列されている。
  2. すべての区間はプロパーである。
  3. 簡約可能な対が存在しない。
  4. オーバラップしている対が存在しない。

任意に与えられたリストを正規形にすることを正規化と呼ぶ。normalizeを正規化する関数だとすると、

  • Aが正規形 ⇔ normalize(A) = A
  • normalize(normalize(A)) = normalize(A)

であることに注意せよ。

オーバーフローとアロケーション

リスト[α1, ...]があるとき、これを正規化すると、重みが1を超える区間が生じることがある。正規化後に重みが1を超える区間を持つようなリストはオーバーフローしているという。

consをLispの意味でのリスト操作として、cons(α, A) がオーバーフローしないとき、区間αはリストAにconsableと呼ぼう。

区間とは別に、(d, x)という形を考える。これは「durationがd、重みがx」という意味で、beginが指定されてない(未定な)区間の表現と考える。区間[a, b;x]が、b - a = dのとき、(d, x)の実現とか具体化と呼ぶ。

[追記]以下のアロケーションの記述で、αの位置に関して上限と下限の条件が抜けている。実際には、実数s, tがあって、アロケート可能な範囲は[s, t]内に限定する。この条件がないと、無意味なアロケーションを許すことになる。[/追記]

リストAが与えられたとき、(d, x)の適当な実現αが存在して、αがAにconsableなとき、(d, x)はAにおいてアロケート可能という。αは、(d, x)のAにおけるアロケーションであるという。アロケーションはたくさん(無限に)あるかもしれないので、特定のアロケーションアロケーションインスタンスとも呼ぶ。

オーバーフローしてないリストAと、(d, x)を与えられて、アロケート可能かどうかを判定する問題、そして、アロケート可能ならアロケーションインスタンスを決定する問題をアロケーション問題と呼ぶ。アロケーション問題が解けるのはあきらかなので、効率的なアルゴリズムや美しい(?)データ構造を求めることが興味の対象となる。

さらに

上に述べたアロケーション問題は、もっとも簡単なケースであり、実際にはもっと複雑になる。簡単なケースが解けないでは複雑はケースが解けるわけがないので、簡単なケースを十分に理解する。