SlideShare a Scribd company logo
17
Most read
21
Most read
22
Most read
木を綺麗に描画する

アルゴリズム
どうやって木を描画するか?
• 木はグラフの一部なので描画方法はいろいろ
• どうやったら綺麗に描画できる?
• 以下,とりあえず2分木を対象
描画原則
1. 親は子より上に描画

特に2分木なら左の子は親より左,

右の子は親より右に描画
2. 辺は交差しない
3. 同じ深さのノードは同じ高さで描画
描画位置の求め方
• y方向はノード自身の深さ
• 問題はx方向の位置
(多分)一番簡単な方法
• 木をpre-orderで探索
• x = 0から初めて探索していったノードから順に左
からx方向の値を割り振る
• 一説によるとknuthが考えたらしい

(というかknuthが1971年に出した論文のサンプルコードで使われていた手法)
(多分)一番簡単な方法
(多分)一番簡単な方法
(多分)一番簡単な方法の問題
• 木がだいたいバランスしている場合はこれでも十分
• でも,木が偏っていると不格好になりがち
• 何がいけないのか?
1. 深さに対するノード数によらずx方向が決定される

=> 結果として横にひろがりやすい
2. 2分木なのに親が子の中央に位置していない
描画原則 改
1. 親は子より上に描画

特に2分木なら左の子は親より左,

右の子は親より右に描画
2. 辺は交差しない
3. 同じ深さのノードは同じ高さで描画
4. なるべく狭く描画する
5. 親は子の中央に位置させる
狭く描画する
• とりあえず狭く描画したい各深さごとに使えるxの
インデックスを保持すればOK
• pre-orderで探索して,各ノードの深さで配置可能
な場所に左から配置する
狭く描画する
親を子の中央に配置する
• pre-orderで探索するとノードを描画するとき右の
子の位置が確定していない
• post-orderで探索し,
• 葉にはその深さで配置可能な場所に左詰めで配置
• 親は子ノードの中央に配置

このとき,親の位置が親の深さで配置可能な場合より左の場合には,その
親をルートとするサブツリー全体をその分だけ右にシフトする
親を子の中央に配置する
この方法の問題点
• これで割とよく描画できる!
• でもさっきの例をよく見ると木の構造が対称なのに
対称に描画されていない..
描画原則 改二
1. 親は子より上に描画

特に2分木なら左の子は親より左,

右の子は親より右に描画
2. 辺は交差しない
3. 同じ深さのノードは同じ高さで描画
4. なるべく狭く描画する
5. 親は子の中央に位置させる
6. 任意のサブツリーは場所によらず同じように描画する
Tilford-Reingold アルゴリズム
• 1980年考案
• post-order で探索し,
• ノードが葉ならそのノードのx位置は0とする
• そうでなければ,右の子を左の子にできるだけ近づける
• 親の位置を子ノードの中央に設定
• 単純そうに見えるが,実際には親の位置を決定するのに少し工夫
が必要
• ちなみに,グラフ描画アルゴリズムのFruchterman-ReingoldアルゴリズムのReingoldと同じ人
Tilford-Reingold アルゴリズム
描画アルゴリズムのオーダー
• Tilford-Reingold アルゴリズムは,サブツリーの
シフトが再帰的が発生するが,少し計算を工夫する
ことでO(n^2)
• Tilford-Reingold を改良して,木の描画をO(n)で
配置するアルゴリズムが考案されているらしい

(末尾の文献を参照)
m分木への拡張
• 今までは2分木を対称としていたが,Tilford-
Reingoldアルゴリズムをm分木に拡張するのはそ
れほど難しくない(はず)
• ようするに子の中央に親を配置するのがポイント
ところで,DOT
• グラフ記述言語

ex)





• Graphvizの内部で使用
• これで書いておけばGraphvizで描画できる

(他にも対応しているものはいろいろ)
• いちいちアルゴリズムを実装していられない時に
• DOTはあくまでグラフ描画用だが,Graphvizで木構造のレイアウトとして描画す
ることができるらしい
DOT
(補足)

木の描画方法の超簡単な歴史
• 1971年: knuthの論文に描画のソースコードが載る

もっと前から何かあったかも
• 1979年: C.WetherellとA.Shannonが木の描画方法に関する論文を発表.これ
以降の論文の基礎になる (ちゃんと読んで無いけど多分このスライドの親を中央
に配置する方法を発表)
• 1980年: Tilford-Reingold アルゴリズム
• 1990年: Tilford-Reingold アルゴリズムを改良した方法をJ.Q.Walkerが発表.
• 2006年: Walker アルゴリズムがO(n^2)だったものを線形にしたアルゴリズム(?)
をC.Bucheimらが考案

ちゃんとやるならこれを読めば良さげ
参考文献
• Bill Mil, Drawing Presentable Trees, http://billmill.org/pymag-trees/#foot1

木の描画方法についてまとまっています.今回の作成にあたり一番参考にしました
• C. Wetherell and A. Shannon. 1979. Tidy Drawings of Trees. IEEE Trans. Softw.
Eng. 5, 5 (September 1979), 514-520. DOI=10.1109/TSE.1979.234212
• Reingold, Edward M.; Tilford, J.S., "Tidier Drawings of Trees," Software
Engineering, IEEE Transactions on , vol.SE-7, no.2, pp.223,228, March 1981.
doi: 10.1109/TSE.1981.234519
• J. Q. Walker, II. 1990. A node-positioning algorithm for general trees. Softw.
Pract. Exper. 20, 7 (July 1990), 685-705. DOI=10.1002/spe.4380200705
• Christoph Buchheim, Michael Jünger, and Sebastian Leipert. 2006. Drawing
rooted trees in linear time. Softw. Pract. Exper. 36, 6 (May 2006), 651-665.
DOI=10.1002/spe.v36:6

More Related Content

PDF
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
PDF
直交領域探索
PDF
明日使えないすごいビット演算
PDF
第5回パターン認識勉強会
PDF
ガイデットフィルタとその周辺
PDF
ウィナーフィルタと適応フィルタ
PDF
プログラムを高速化する話
PPTX
Swin Transformer (ICCV'21 Best Paper) を完璧に理解する資料
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
直交領域探索
明日使えないすごいビット演算
第5回パターン認識勉強会
ガイデットフィルタとその周辺
ウィナーフィルタと適応フィルタ
プログラムを高速化する話
Swin Transformer (ICCV'21 Best Paper) を完璧に理解する資料

What's hot (20)

PDF
[DL輪読会]Learning Transferable Visual Models From Natural Language Supervision
PDF
組み込み関数(intrinsic)によるSIMD入門
PDF
ウェーブレット木の世界
PDF
Statistical Semantic入門 ~分布仮説からword2vecまで~
PDF
AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜
PDF
東京大学2021年度深層学習(Deep learning基礎講座2021) 第8回「深層学習と自然言語処理」
PDF
pymcとpystanでベイズ推定してみた話
PDF
動作認識におけるディープラーニングの最新動向1 3D-CNN
PPTX
Chokudai search
PDF
線形計画法入門
PDF
様々な全域木問題
PDF
スパースモデリング、スパースコーディングとその数理(第11回WBA若手の会)
PDF
20分くらいでわかった気分になれるC++20コルーチン
PDF
Re永続データ構造が分からない人のためのスライド
PDF
最小カットを使って「燃やす埋める問題」を解く
PDF
色々なダイクストラ高速化
PDF
プログラミングコンテストでのデータ構造
PDF
Introduction to YOLO detection model
PPTX
SSII2020SS: グラフデータでも深層学習 〜 Graph Neural Networks 入門 〜
[DL輪読会]Learning Transferable Visual Models From Natural Language Supervision
組み込み関数(intrinsic)によるSIMD入門
ウェーブレット木の世界
Statistical Semantic入門 ~分布仮説からword2vecまで~
AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜
東京大学2021年度深層学習(Deep learning基礎講座2021) 第8回「深層学習と自然言語処理」
pymcとpystanでベイズ推定してみた話
動作認識におけるディープラーニングの最新動向1 3D-CNN
Chokudai search
線形計画法入門
様々な全域木問題
スパースモデリング、スパースコーディングとその数理(第11回WBA若手の会)
20分くらいでわかった気分になれるC++20コルーチン
Re永続データ構造が分からない人のためのスライド
最小カットを使って「燃やす埋める問題」を解く
色々なダイクストラ高速化
プログラミングコンテストでのデータ構造
Introduction to YOLO detection model
SSII2020SS: グラフデータでも深層学習 〜 Graph Neural Networks 入門 〜
Ad

More from mfumi (12)

PDF
MMDs 12.3 SVM
PDF
MMDs10.6-7
PDF
IA16 2
PDF
IA16
PDF
IA14
PDF
MMDs Chapter 9
PDF
グラフを奇麗に描画するアルゴリズム
PDF
Algorithms Introduction 9章
PDF
MMDs 6.3-6.5
PDF
MMDs Chapter 5.1 PageRank
PDF
xv6のコンテキストスイッチを読む
PDF
ファイルの隠し方
MMDs 12.3 SVM
MMDs10.6-7
IA16 2
IA16
IA14
MMDs Chapter 9
グラフを奇麗に描画するアルゴリズム
Algorithms Introduction 9章
MMDs 6.3-6.5
MMDs Chapter 5.1 PageRank
xv6のコンテキストスイッチを読む
ファイルの隠し方
Ad

木を綺麗に描画するアルゴリズム