分割の一般化とは? わかりやすく解説

分割の一般化

出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2021/05/15 07:59 UTC 版)

2-3 フィンガーツリー」の記事における「分割の一般化」の解説

前述した分割演算では各ノードサイズ計算してキャッシュし、位置がiとなる要素探し、そこで分割した。これをさらに一般化する様々なデータ構造実装できる。 まず各ノードについて、サイズではなく実装するデータ構造応じた値を計算しキャッシュできるようにする。値は例え通常の列を実装するのであればノードサイズ計算し優先順位付きキュー実装するのであればノード内の最大優先順位計算する。より詳しい例は#応用で示す。値はどのような値でもよいが、部分木の値からより大きな木の値を計算できるようにモノイドである必要がある。つまり結合則満たす二項演算⊕とその単位元eを持っている必要がある次に分割点となる要素探すための述語が必要となる。列の例では「位置がiより大きい」という述語使われる分割演算ではこの述語が偽から真に変化する要素探す。 列の例では分割する位置iを減少させながら再帰呼び出ししたが、一般化した状態ではモノイドを使うため減算できない。そこでアキュムレータ用意し再帰呼び出しに入る前に左側部分木の値を累積していき、基準値比べる述語pはアキュムレータ初期値では偽となり、木全に対しては真となる必要がある。列の例では初期値として単位元0を使うので、この制限は「iは0以上、木のサイズ未満である」という制限となる。 以上の条件の元で、一般化した分割演算次のように書ける。ここでmeasureノードから値へ変換する関数である。初期値xから始めて値を累積しながらpを満たす要素探していく。 splitTreeAt p x (Single a) = (Empty, a, Empty) splitTreeAt p x (Deep pr m sf) | p (x ⊕ measure pr) = let (pr1, a, pr2) = splitDigitAt p x pr in (pr1, a, Deep pr2 m sf) | p (x ⊕ measure prmeasure m) = let (sf1, a, sf2) = splitDigitAt p (i ⊕ measure prmeasure m) sf in (Deep pr m sf1, a, pr2) | otherwise = let -- m1とm3はFingerTree、m2はNode。 (ml, xs, mr) = splitTreeAt p (i ⊕ measure pr) m -- lとrはMaybe (Digit a)とする。 (l, a, r) = splitNodeAt p (i ⊕ measure prmeasure ml) xs in -- deepR, deepLは、lやrがNothingの場合繰り下がり処理をしてFingerTree作る関数 (deepR pr ml l, a, deepL r mr sf) 通常はある要素までは述語は常に偽となり、それより先の要素では述語は常に真となるようにする。しかし述語真偽途中で何度も切り替わってもよい。その場合、このアルゴリズム述語が偽から真に切り変わる要素のうち適当な1つ分割する

※この「分割の一般化」の解説は、「2-3 フィンガーツリー」の解説の一部です。
「分割の一般化」を含む「2-3 フィンガーツリー」の記事については、「2-3 フィンガーツリー」の概要を参照ください。

ウィキペディア小見出し辞書の「分割の一般化」の項目はプログラムで機械的に意味や本文を生成しているため、不適切な項目が含まれていることもあります。ご了承くださいませ。 お問い合わせ



英和和英テキスト翻訳>> Weblio翻訳
英語⇒日本語日本語⇒英語
  

辞書ショートカット

すべての辞書の索引

「分割の一般化」の関連用語

分割の一般化のお隣キーワード
検索ランキング

   

英語⇒日本語
日本語⇒英語
   



分割の一般化のページの著作権
Weblio 辞書 情報提供元は 参加元一覧 にて確認できます。

   
ウィキペディアウィキペディア
Text is available under GNU Free Documentation License (GFDL).
Weblio辞書に掲載されている「ウィキペディア小見出し辞書」の記事は、Wikipediaの2-3 フィンガーツリー (改訂履歴)の記事を複製、再配布したものにあたり、GNU Free Documentation Licenseというライセンスの下で提供されています。

©2025 GRAS Group, Inc.RSS