<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ja">
	<id>https://orsj-ml.org/orwiki/wiki/index.php?action=history&amp;feed=atom&amp;title=%E3%83%87%E3%83%BC%E3%82%BF%E6%A7%8B%E9%80%A0</id>
	<title>データ構造 - 版の履歴</title>
	<link rel="self" type="application/atom+xml" href="https://orsj-ml.org/orwiki/wiki/index.php?action=history&amp;feed=atom&amp;title=%E3%83%87%E3%83%BC%E3%82%BF%E6%A7%8B%E9%80%A0"/>
	<link rel="alternate" type="text/html" href="https://orsj-ml.org/orwiki/wiki/index.php?title=%E3%83%87%E3%83%BC%E3%82%BF%E6%A7%8B%E9%80%A0&amp;action=history"/>
	<updated>2026-04-16T02:40:03Z</updated>
	<subtitle>このウィキのこのページに関する変更履歴</subtitle>
	<generator>MediaWiki 1.35.3</generator>
	<entry>
		<id>https://orsj-ml.org/orwiki/wiki/index.php?title=%E3%83%87%E3%83%BC%E3%82%BF%E6%A7%8B%E9%80%A0&amp;diff=9680&amp;oldid=prev</id>
		<title>Imahori: 基礎編と用語編のマージ</title>
		<link rel="alternate" type="text/html" href="https://orsj-ml.org/orwiki/wiki/index.php?title=%E3%83%87%E3%83%BC%E3%82%BF%E6%A7%8B%E9%80%A0&amp;diff=9680&amp;oldid=prev"/>
		<updated>2008-03-13T13:58:07Z</updated>

		<summary type="html">&lt;p&gt;基礎編と用語編のマージ&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left diff-editfont-monospace&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;ja&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← 古い版&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;2008年3月13日 (木) 13:58時点における版&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l1&quot; &gt;1行目:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;1行目:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;'''【でーたこうぞう (data structure)】'''&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;'''【でーたこうぞう (data structure)】'''&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;=== 概要 ===&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;与えられたデータを,  計算の高速化のために構造をもたせて記憶する手法の総称.  目的に合わせ, あるいくつかの機能を, 高速,  あるいは省メモリで行えるよう設計される.  例えば, ある言葉を&amp;lt;math&amp;gt;n \,&amp;lt;/math&amp;gt; 個の言葉の辞書データから検索するとき,  通常の配列では, 最悪で挿入・削除に &amp;lt;math&amp;gt;O(n) \,&amp;lt;/math&amp;gt;, 検索に &amp;lt;math&amp;gt;O(\log n) \,&amp;lt;/math&amp;gt; か,  挿入と削除に &amp;lt;math&amp;gt;O(1) \,&amp;lt;/math&amp;gt;, 検索に &amp;lt;math&amp;gt;O(n) \,&amp;lt;/math&amp;gt; の時間を要する.   二分探索木というデータ構造は,  これらの機能を &amp;lt;math&amp;gt;O(\log n) \,&amp;lt;/math&amp;gt; 時間で行い,  使用メモリは &amp;lt;math&amp;gt;O(n) \,&amp;lt;/math&amp;gt; である.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;与えられたデータを,  計算の高速化のために構造をもたせて記憶する手法の総称.  目的に合わせ, あるいくつかの機能を, 高速,  あるいは省メモリで行えるよう設計される.  例えば, ある言葉を&amp;lt;math&amp;gt;n \,&amp;lt;/math&amp;gt; 個の言葉の辞書データから検索するとき,  通常の配列では, 最悪で挿入・削除に &amp;lt;math&amp;gt;O(n) \,&amp;lt;/math&amp;gt;, 検索に &amp;lt;math&amp;gt;O(\log n) \,&amp;lt;/math&amp;gt; か,  挿入と削除に &amp;lt;math&amp;gt;O(1) \,&amp;lt;/math&amp;gt;, 検索に &amp;lt;math&amp;gt;O(n) \,&amp;lt;/math&amp;gt; の時間を要する.   二分探索木というデータ構造は,  これらの機能を &amp;lt;math&amp;gt;O(\log n) \,&amp;lt;/math&amp;gt; 時間で行い,  使用メモリは &amp;lt;math&amp;gt;O(n) \,&amp;lt;/math&amp;gt; である.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;詳しくは&lt;/del&gt;[[&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;《データ構造》&lt;/del&gt;|&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;基礎編：データ構造&lt;/del&gt;]]&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;を参照&lt;/del&gt;.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;=== 詳説 ===&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;　データ構造とは, 与えられたデータに対して, そのデータを使った計算の高速化, そのデータを記憶するために必要な領域の減少等の目的で, データに構造を持たせ, データに対する操作の効率化を行う手法の総称である. あるいくつかの機能を, データの記憶形式と, その形式のデータを操作するアルゴリズムにより実現する. &lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt; &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;　通常のコンピューター言語では, データを蓄える手法として配列かリスト, またはその両方が用意されている. 配列は指定した位置にあるデータに&amp;lt;math&amp;gt;\mbox{O}(1)\, &amp;lt;/math&amp;gt;時間でアクセスでき, リストは与えられたデータを並べて記憶し, 隣のデータに&amp;lt;math&amp;gt;\mbox{O}(1)\, &amp;lt;/math&amp;gt;時間でアクセスできる. リストは配列により実現可能だが, リストで配列は実現できない. &lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt; &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;　配列やリストは最も単純なデータ構造である. ここで両者を使ったデータ構造の性能の違いを見てみよう. 例として &amp;lt;math&amp;gt;n\, &amp;lt;/math&amp;gt; 行 &amp;lt;math&amp;gt;n\, &amp;lt;/math&amp;gt; 列の行列 &amp;lt;math&amp;gt;M\, &amp;lt;/math&amp;gt; を保持し, 他の行列との掛け算を行うためのデータ構造を考える. 通常の配列を使用して行列を記憶する場合 &amp;lt;math&amp;gt;\mbox{O}(n^2)\, &amp;lt;/math&amp;gt; のメモリが必要であるが, もし &amp;lt;math&amp;gt;M\, &amp;lt;/math&amp;gt; の非零要素の数 &amp;lt;math&amp;gt;H\, &amp;lt;/math&amp;gt; が小さい場合, 非零要素を連結してリストで持つことにより, 記憶容量を &amp;lt;math&amp;gt;\mbox{O}(H)\, &amp;lt;/math&amp;gt; まで減少させることができる. 行列の掛け算は非零要素に関する部分だけ計算を行えばよいので, 計算時間も2つの行列の非零要素の数の積に比例する. しかし, リストは一要素を記憶するのに必要なメモリが配列に比べて大きいので, 非零要素が多い場合はリストのほうが遅く, メモリも多くなる. &lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt; &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;　次に, &amp;lt;math&amp;gt;n\, &amp;lt;/math&amp;gt; 個の用語の辞書データを保持し, その中から与えられた用語を検索するためのデータ構造を考える. データに変更がないときは, 用語を辞書順で並べて記憶すれば, 二分探索により&amp;lt;math&amp;gt;\mbox{O}(\log n)\, &amp;lt;/math&amp;gt;時間で1つの用語が検索できる. しかし, 辞書データの中の用語を削除する・新しい用語を追加する, という操作が必要な場合には, 通常平均的に&amp;lt;math&amp;gt;\mbox{O}(n)\, &amp;lt;/math&amp;gt;の時間を要する. 辞書順に並べるかわりに, 二分探索木 ([[AVL木]], 2-3[[木]]など) というデータ構造を用いれば, 使用メモリは&amp;lt;math&amp;gt;\mbox{O}(n)\, &amp;lt;/math&amp;gt;のままで, これらの操作の実行時間を&amp;lt;math&amp;gt;\mbox{O}(\log n)\, &amp;lt;/math&amp;gt;まで減らすことができる. このようにデータの動的な変化に対しても効率が良く操作が行えるよう設計されたデータ構造を動的データ構造という. 辞書データを扱う他の効率の良いデータ構造としては[[ハッシュ表]]が知られている. &lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt; &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;　動的データ構造の中で最も基礎的なものとしては[[ヒープ]]が挙げられる. 基本的なヒープは, &amp;lt;math&amp;gt;n\, &amp;lt;/math&amp;gt; 個の要素の中の最小値を得る・要素の追加・削除するという操作を, 1回あたり&amp;lt;math&amp;gt;\mbox{O}(\log n)\, &amp;lt;/math&amp;gt;時間で実行し, またメモリ使用量も&amp;lt;math&amp;gt;\mbox{O}(n)\, &amp;lt;/math&amp;gt;である. 応用も広く, プリム法 (最小木問題のアルゴリズム), 最少費用フロー問題 (最小費用流問題) のアルゴリズムなどで使用される. また, 改良版の &lt;/ins&gt;[[&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;フィボナッチヒープ&lt;/ins&gt;|&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;Fヒープ]] (フィボナッチヒープ) は, 最短路問題を解くアルゴリズムで使われている. その他, &amp;lt;math&amp;gt;n\, &amp;lt;/math&amp;gt; 個の区間の集合を保持し, 質問点を含む区間を列挙する, 区間の挿入・削除を行う, などの操作を1回あたり &amp;lt;math&amp;gt;\mbox{O}(\log n)\, &amp;lt;/math&amp;gt;時間で行う区分木, 大きさ &amp;lt;math&amp;gt;n\, &amp;lt;/math&amp;gt; の木構造のグラフに対し, 合併・分割・変形・ある頂点の子孫数を求める, など多くの操作を&amp;lt;math&amp;gt;\mbox{O}(\log n)\, &amp;lt;/math&amp;gt;時間で行う[[動的木]], 集合の合併と要素の探索を高速化し, &amp;lt;math&amp;gt;n\, &amp;lt;/math&amp;gt; 回の合併と &amp;lt;math&amp;gt;m\, &amp;lt;/math&amp;gt; 回の探索の合計時間がほぼ &amp;lt;math&amp;gt;\mbox{O}(m+n)\, &amp;lt;/math&amp;gt; となる集合ユニオン・ファインド木, 動的に変化する有向グラフの強連結性を保持し, &amp;lt;math&amp;gt;k\, &amp;lt;/math&amp;gt; 回の枝の挿入・削除を &amp;lt;math&amp;gt;\mbox{O}(kn^{1.3})\, &amp;lt;/math&amp;gt; で行うデータ構造[7], など数多くのものが考案されている. 文字列やグラフを扱う離散アルゴリズムの多くは, これらの基礎的なデータ構造に手を加えたものを使用することにより高速化されている. また, アルゴリズムの動作記録を変換して保持し, パラメーターの変更による計算結果の変化を出力するデータ構造は動的計画, 組み合わせ最適化問題の感度分析などに応用が広い. &lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt; &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;　データ構造, 特に動的データ構造は, 計算幾何学における発展が著しい. 幾何的なデータはデータの量に対して構造が複雑なものが多い. 例えば, 平面上の &amp;lt;math&amp;gt;n\, &amp;lt;/math&amp;gt; 点の集合に対し, 距離が &amp;lt;math&amp;gt;d\, &amp;lt;/math&amp;gt; 以下の2点を枝でつないだグラフ(幾何グラフ)を考える. このグラフは &amp;lt;math&amp;gt;O(n^2)\, &amp;lt;/math&amp;gt; 本の枝を含む可能性があるが, このグラフを記憶するには点集合だけ記憶すれば十分である. つまり, メモリや計算時間を省略するためには, 点集合のデータから必要な枝の情報を得るための構造が必要となる. また, 枝の交差など, グラフ的な情報からは導けないものもあり, それらの情報を効率的に得るためにもデータ構造はかかせない. 幾何的なデータ構造としては, 平面上の&amp;lt;math&amp;gt;n\, &amp;lt;/math&amp;gt;点集合の凸包を保持し, 点の追加・消去に対し新しい凸包を &amp;lt;math&amp;gt;\mbox{O}(\log n)\, &amp;lt;/math&amp;gt; 時間で求めるもの, &amp;lt;math&amp;gt;k\, &amp;lt;/math&amp;gt; 次元の &amp;lt;math&amp;gt;n\, &amp;lt;/math&amp;gt; 点集合に対し, 質問点から近い順に点を1個あたり平均 &amp;lt;math&amp;gt;\mbox{O}(1)\, &amp;lt;/math&amp;gt;時間で出力する &amp;lt;math&amp;gt;k-d\, &amp;lt;/math&amp;gt; 木, 質問領域の中に含まれる点を1個あたり&amp;lt;math&amp;gt; \mbox{O}(\log^{k-1} n)\, &amp;lt;/math&amp;gt; で出力するレンジサーチ木 [8], 平面をいくつかの領域に分割する &amp;lt;math&amp;gt;n\, &amp;lt;/math&amp;gt; 本の線分の集合が与えられたとき, 質問点がどの領域に含まれるかを &amp;lt;math&amp;gt;\mbox{O}(\log n)\, &amp;lt;/math&amp;gt; 時間で答える領域探索などが挙げられる. その他に, 線分の集合に対し, ある点から見える点, すなわち2点をつなぐ線分が他の線分と交差しないような点集合を保持するデータ構造など, 交差, 領域に関してさまざまなデータ構造が考案されている. &lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt; &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;　前述の幾何的なデータ構造は, 幾何的な対象を扱う計算幾何学のアルゴリズムで多く使われている. 多角形の三角形分割の線形時間アルゴリズムなども高度な技術を用いてデータ構造を活用しているが, しかしその反面複雑になりすぎ, 現実的ではないという欠点がある. また, 個々のアルゴリズムで使用するデータ構造がそのアルゴリズムに特化した, 一般性のないアルゴリズムとデータ構造も少なくない. それゆえ, 最近では簡素化も視野に入れた研究が進んでいる. スパーシフィケイション [6] もその一つであり, 動的データ構造高速化の一般化した技術を提供している. スパーシフィケーションにより, &amp;lt;math&amp;gt;n\, &amp;lt;/math&amp;gt; 頂点 &amp;lt;math&amp;gt;m\, &amp;lt;/math&amp;gt; 枝を持つ無向グラフの最小全張木を保持するデータ構造は, 1回の枝の追加・削除・重みの変化に対する計算時間が, &amp;lt;math&amp;gt;\mbox{O}(m^{1/2})\, &amp;lt;/math&amp;gt; から&amp;lt;math&amp;gt;\mbox{O}(n^{1/2})\, &amp;lt;/math&amp;gt; に高速化される. また同様にグラフの二部グラフ性の判定, 二連結性の判定, 頂点連結性の判定なども, 一回の操作の計算時間が &amp;lt;math&amp;gt;\mbox{O}(m)\, &amp;lt;/math&amp;gt; から &amp;lt;math&amp;gt;\mbox{O}(n)\, &amp;lt;/math&amp;gt; に高速化される. &lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt; &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;　最後に参考文献を挙げる. 動的木などグラフ的なデータ構造は [3], [4], [5] 等に詳しい. また, 幾何的データ構造については [1], [2] 等が詳しい. &lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt; &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt; &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt; &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;----&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;'''参考文献'''&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt; &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;[1] F. P. Preparata and M. L. Shamos, &amp;quot;Computational Geometry - An Introduction,&amp;quot; Springer-Verlag, 1985. 浅野孝夫, 浅野哲夫 訳,『計算幾何学入門』, 総研出版, 1992.&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt; &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;[2] 今井浩, 今井圭子,『計算幾何学』, 共立出版, 1994.&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt; &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;[3] T. H. Cormen, C. E. Leiserson and R. L. Rivest, &amp;quot;Introduction To Algorithms,&amp;quot; The MIT Press, 1990. 浅野哲夫, 岩間和生, 梅尾博司, 山下雅史, 和田幸一 訳,『アルゴリズムイントロダクション 1,2,3巻』, 近代科学, 1995.&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt; &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;[4] 浅野孝夫,『情報の構造 上, 下』, 日本評論社, 1994.&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt; &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;[5] 茨木俊秀,『アルゴリズムとデータ構造』, 昭晃堂, 1989.&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt; &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;[6] D. Eppstein, Z. Galil, G. F. Italiano, A. Nissenzweig &amp;quot;Sparsification - A Technique for Speeding up Dynamic Graph Algorithms,&amp;quot; ''FOCS'', '''33''', 1992&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt; &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;[7&lt;/ins&gt;] &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;S. Khanna, R. Motwani and R. H. Wilson, &amp;quot;On Certificates and Lookahead in Dynamic Graph Problems,&amp;quot; ''SODA'', 1995&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt; &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;[8&lt;/ins&gt;] &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;D. E. Willard &amp;quot;New Data Structures for Orthogonal Range Queries,&amp;quot; ''SIAM Journal on Computing'', '''14''' (1985), 232-253&lt;/ins&gt;.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt; &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt; &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;[[Category:組合せ最適化|でーたこうぞう]]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Imahori</name></author>
	</entry>
	<entry>
		<id>https://orsj-ml.org/orwiki/wiki/index.php?title=%E3%83%87%E3%83%BC%E3%82%BF%E6%A7%8B%E9%80%A0&amp;diff=8328&amp;oldid=prev</id>
		<title>2007年8月8日 (水) 11:40にKanda.kによる</title>
		<link rel="alternate" type="text/html" href="https://orsj-ml.org/orwiki/wiki/index.php?title=%E3%83%87%E3%83%BC%E3%82%BF%E6%A7%8B%E9%80%A0&amp;diff=8328&amp;oldid=prev"/>
		<updated>2007-08-08T11:40:19Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left diff-editfont-monospace&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;ja&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← 古い版&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;2007年8月8日 (水) 11:40時点における版&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l2&quot; &gt;2行目:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;2行目:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;与えられたデータを,  計算の高速化のために構造をもたせて記憶する手法の総称.  目的に合わせ, あるいくつかの機能を, 高速,  あるいは省メモリで行えるよう設計される.  例えば, ある言葉を&amp;lt;math&amp;gt;n \,&amp;lt;/math&amp;gt; 個の言葉の辞書データから検索するとき,  通常の配列では, 最悪で挿入・削除に &amp;lt;math&amp;gt;O(n) \,&amp;lt;/math&amp;gt;, 検索に &amp;lt;math&amp;gt;O(\log n) \,&amp;lt;/math&amp;gt; か,  挿入と削除に &amp;lt;math&amp;gt;O(1) \,&amp;lt;/math&amp;gt;, 検索に &amp;lt;math&amp;gt;O(n) \,&amp;lt;/math&amp;gt; の時間を要する.   二分探索木というデータ構造は,  これらの機能を &amp;lt;math&amp;gt;O(\log n) \,&amp;lt;/math&amp;gt; 時間で行い,  使用メモリは &amp;lt;math&amp;gt;O(n) \,&amp;lt;/math&amp;gt; である.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;与えられたデータを,  計算の高速化のために構造をもたせて記憶する手法の総称.  目的に合わせ, あるいくつかの機能を, 高速,  あるいは省メモリで行えるよう設計される.  例えば, ある言葉を&amp;lt;math&amp;gt;n \,&amp;lt;/math&amp;gt; 個の言葉の辞書データから検索するとき,  通常の配列では, 最悪で挿入・削除に &amp;lt;math&amp;gt;O(n) \,&amp;lt;/math&amp;gt;, 検索に &amp;lt;math&amp;gt;O(\log n) \,&amp;lt;/math&amp;gt; か,  挿入と削除に &amp;lt;math&amp;gt;O(1) \,&amp;lt;/math&amp;gt;, 検索に &amp;lt;math&amp;gt;O(n) \,&amp;lt;/math&amp;gt; の時間を要する.   二分探索木というデータ構造は,  これらの機能を &amp;lt;math&amp;gt;O(\log n) \,&amp;lt;/math&amp;gt; 時間で行い,  使用メモリは &amp;lt;math&amp;gt;O(n) \,&amp;lt;/math&amp;gt; である.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;詳しくは[[《データ構造》|基礎編：データ構造]]を参照.&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Kanda.k</name></author>
	</entry>
	<entry>
		<id>https://orsj-ml.org/orwiki/wiki/index.php?title=%E3%83%87%E3%83%BC%E3%82%BF%E6%A7%8B%E9%80%A0&amp;diff=7498&amp;oldid=prev</id>
		<title>Orsjwiki: &quot;データ構造&quot; を保護しました。 [edit=sysop:move=sysop]</title>
		<link rel="alternate" type="text/html" href="https://orsj-ml.org/orwiki/wiki/index.php?title=%E3%83%87%E3%83%BC%E3%82%BF%E6%A7%8B%E9%80%A0&amp;diff=7498&amp;oldid=prev"/>
		<updated>2007-07-20T03:03:54Z</updated>

		<summary type="html">&lt;p&gt;&amp;quot;データ構造&amp;quot; を保護しました。 [edit=sysop:move=sysop]&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left diff-editfont-monospace&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;ja&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← 古い版&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;2007年7月20日 (金) 03:03時点における版&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;ja&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(相違点なし)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Orsjwiki</name></author>
	</entry>
	<entry>
		<id>https://orsj-ml.org/orwiki/wiki/index.php?title=%E3%83%87%E3%83%BC%E3%82%BF%E6%A7%8B%E9%80%A0&amp;diff=4591&amp;oldid=prev</id>
		<title>2007年7月13日 (金) 14:51に124.144.188.143による</title>
		<link rel="alternate" type="text/html" href="https://orsj-ml.org/orwiki/wiki/index.php?title=%E3%83%87%E3%83%BC%E3%82%BF%E6%A7%8B%E9%80%A0&amp;diff=4591&amp;oldid=prev"/>
		<updated>2007-07-13T14:51:25Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left diff-editfont-monospace&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;ja&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← 古い版&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;2007年7月13日 (金) 14:51時点における版&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l1&quot; &gt;1行目:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;1行目:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;'''【でーたこうぞう (data structure)】'''&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;'''【でーたこうぞう (data structure)】'''&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;与えられたデータを,  計算の高速化のために構造をもたせて記憶する手法の総称.  目的に合わせ, あるいくつかの機能を, 高速,  あるいは省メモリで行えるよう設計される.  例えば, ある言葉を&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;$&lt;/del&gt;n&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;$ &lt;/del&gt;個の言葉の辞書データから検索するとき,  通常の配列では, 最悪で挿入・削除に O&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;$&lt;/del&gt;(n)&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;$&lt;/del&gt;, 検索に O&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;$&lt;/del&gt;(\log n)&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;$ &lt;/del&gt;か,  挿入と削除に O&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;$&lt;/del&gt;(1)&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;$&lt;/del&gt;, 検索に O&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;$&lt;/del&gt;(n)&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;$ &lt;/del&gt;の時間を要する.   二分探索木というデータ構造は,  これらの機能を O&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;$&lt;/del&gt;(\log n)&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;$ &lt;/del&gt;時間で行い,  使用メモリは O&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;$&lt;/del&gt;(n)&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;$ &lt;/del&gt;である.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;与えられたデータを,  計算の高速化のために構造をもたせて記憶する手法の総称.  目的に合わせ, あるいくつかの機能を, 高速,  あるいは省メモリで行えるよう設計される.  例えば, ある言葉を&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;&amp;lt;math&amp;gt;&lt;/ins&gt;n &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;\,&amp;lt;/math&amp;gt; &lt;/ins&gt;個の言葉の辞書データから検索するとき,  通常の配列では, 最悪で挿入・削除に &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;&amp;lt;math&amp;gt;&lt;/ins&gt;O(n) &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;\,&amp;lt;/math&amp;gt;&lt;/ins&gt;, 検索に &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;&amp;lt;math&amp;gt;&lt;/ins&gt;O(\log n) &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;\,&amp;lt;/math&amp;gt; &lt;/ins&gt;か,  挿入と削除に &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;&amp;lt;math&amp;gt;&lt;/ins&gt;O(1) &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;\,&amp;lt;/math&amp;gt;&lt;/ins&gt;, 検索に &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;&amp;lt;math&amp;gt;&lt;/ins&gt;O(n) &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;\,&amp;lt;/math&amp;gt; &lt;/ins&gt;の時間を要する.   二分探索木というデータ構造は,  これらの機能を &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;&amp;lt;math&amp;gt;&lt;/ins&gt;O(\log n) &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;\,&amp;lt;/math&amp;gt; &lt;/ins&gt;時間で行い,  使用メモリは &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;&amp;lt;math&amp;gt;&lt;/ins&gt;O(n) &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;\,&amp;lt;/math&amp;gt; &lt;/ins&gt;である.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>124.144.188.143</name></author>
	</entry>
	<entry>
		<id>https://orsj-ml.org/orwiki/wiki/index.php?title=%E3%83%87%E3%83%BC%E3%82%BF%E6%A7%8B%E9%80%A0&amp;diff=4450&amp;oldid=prev</id>
		<title>2007年7月13日 (金) 06:53に122.17.2.240による</title>
		<link rel="alternate" type="text/html" href="https://orsj-ml.org/orwiki/wiki/index.php?title=%E3%83%87%E3%83%BC%E3%82%BF%E6%A7%8B%E9%80%A0&amp;diff=4450&amp;oldid=prev"/>
		<updated>2007-07-13T06:53:15Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left diff-editfont-monospace&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;ja&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← 古い版&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;2007年7月13日 (金) 06:53時点における版&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l1&quot; &gt;1行目:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;1行目:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;【でーたこうぞう (data structure) 】&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;'''&lt;/ins&gt;【でーたこうぞう (data structure)】&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;'''&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;　データ構造とは&lt;/del&gt;, &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;与えられたデータに対して&lt;/del&gt;, &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;そのデータを使った計算の高速化, そのデータを記憶するために必要な領域の減少等の目的で, データに構造を持たせ, データに対する操作の効率化を行う手法の総称である. &lt;/del&gt;あるいくつかの機能を, &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;データの記憶形式と, その形式のデータを操作するアルゴリズムにより実現する. &lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;与えられたデータを&lt;/ins&gt;, &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt; 計算の高速化のために構造をもたせて記憶する手法の総称.  目的に合わせ&lt;/ins&gt;, あるいくつかの機能を, &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;高速&lt;/ins&gt;,  &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;あるいは省メモリで行えるよう設計される&lt;/ins&gt;.  &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;例えば&lt;/ins&gt;, &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;ある言葉を&lt;/ins&gt;$n$ &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;個の言葉の辞書データから検索するとき&lt;/ins&gt;, &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt; 通常の配列では&lt;/ins&gt;, &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;最悪で挿入・削除に &lt;/ins&gt;O$(n)$, &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;検索に &lt;/ins&gt;O$(\log n)$ &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;か&lt;/ins&gt;, &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt; 挿入と削除に &lt;/ins&gt;O$(&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;1&lt;/ins&gt;)$, &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;検索に &lt;/ins&gt;O$(n)$ &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;の時間を要する&lt;/ins&gt;. &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;  二分探索木というデータ構造は&lt;/ins&gt;, &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt; これらの機能を &lt;/ins&gt;O$(\log n)$ &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;時間で行い&lt;/ins&gt;, &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt; 使用メモリは &lt;/ins&gt;O$(n)$ &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;である&lt;/ins&gt;.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt; &lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;　通常のコンピューター言語では, データを蓄える手法として配列かリスト, またはその両方が用意されている. 配列は指定した位置にあるデータに O$(1)$ 時間でアクセスでき, リストは与えられたデータを並べて記憶し, 隣のデータにO$(1)$ 時間でアクセスできる. リストは配列により実現可能だが, リストで配列は実現できない. &lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt; &lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;　配列やリストは最も単純なデータ構造である. ここで両者を使ったデータ構造の性能の違いを見てみよう. 例として $n$ 行 $n$ 列の行列 $M$ を保持し, 他の行列との掛け算を行うためのデータ構造を考える. 通常の配列を使用して行列を記憶する場合 O$(n^2)$ のメモリが必要であるが, もし $M$ の非零要素の数 $H$ が小さい場合, 非零要素を連結してリストで持つことにより, 記憶容量を O$(H)$ まで減少させることができる. 行列の掛け算は非零要素に関する部分だけ計算を行えばよいので, 計算時間も2つの行列の非零要素の数の積に比例する. しかし, リストは一要素を記憶するのに必要なメモリが配列に比べて大きいので, 非零要素が多い場合はリストのほうが遅く, メモリも多くなる. &lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt; &lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;　次に, $n$ 個の用語の辞書データを保持し, その中から与えられた用語を検索するためのデータ構造を考える. データに変更がないときは, 用語を辞書順で並べて記憶すれば, 二分探索により O$(\log n)$ 時間で1つの用語が検索できる. しかし, 辞書データの中の用語を削除する・新しい用語を追加する, という操作が必要な場合には, 通常平均的に O$(n)$ の時間を要する. 辞書順に並べるかわりに, 二分探索木 ([[AVL木]], 2-3[[木]]など) というデータ構造を用いれば, 使用メモリは O$(n)$ のままで, これらの操作の実行時間をO$(\log n)$ まで減らすことができる. このようにデータの動的な変化に対しても効率が良く操作が行えるよう設計されたデータ構造を動的データ構造という. 辞書データを扱う他の効率の良いデータ構造としては[[ハッシュ表]]が知られている. &lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt; &lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;　動的データ構造の中で最も基礎的なものとしては[[ヒープ]]が挙げられる. 基本的なヒープは, $n$ 個の要素の中の最小値を得る・要素の追加・削除するという操作を, 1回あたり O$(\log n)$ 時間で実行し, またメモリ使用量も O$(n)$ である. 応用も広く&lt;/del&gt;,  &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;プリム法(最小木問題のアルゴリズム), 最少費用フロー問題(最小費用流問題)のアルゴリズムなどで使用される. また, 改良版の [[Fヒープ]] (フィボナッチヒープ) は, 最短路問題を解くアルゴリズムで使われている&lt;/del&gt;.  &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;その他&lt;/del&gt;, $n$ &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;個の区間の集合を保持し&lt;/del&gt;, &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;質問点を含む区間を列挙する&lt;/del&gt;, &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;区間の挿入・削除を行う, などの操作を1回あたり &lt;/del&gt;O$(&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;\log &lt;/del&gt;n)$ &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;時間で行う区分木, 大きさ $n$ の木構造のグラフに対し, 合併・分割・変形・ある頂点の子孫数を求める&lt;/del&gt;, &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;など多くの操作を &lt;/del&gt;O$(\log n)$ &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;時間で行う[[動的木]]&lt;/del&gt;, &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;集合の合併と要素の探索を高速化し, $n$ 回の合併と $m$ 回の探索の合計時間がほぼ &lt;/del&gt;O$(&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;m+n&lt;/del&gt;)$ &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;となる集合ユニオン・ファインド木, 動的に変化する有向グラフの強連結性を保持し&lt;/del&gt;, &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;$k$ 回の枝の挿入・削除を &lt;/del&gt;O$&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;(kn^{1.3})$ で行うデータ構造\cite{A-C-05+kyourenketsu}, など数多くのものが考案されている. 文字列やグラフを扱う離散アルゴリズムの多くは, これらの基礎的なデータ構造に手を加えたものを使用することにより高速化されている. また, アルゴリズムの動作記録を変換して保持し, パラメーターの変更による計算結果の変化を出力するデータ構造は動的計画, 組み合わせ最適化問題の感度分析などに応用が広い. &lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt; &lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;　データ構造, 特に動的データ構造は, 計算幾何学における発展が著しい. 幾何的なデータはデータの量に対して構造が複雑なものが多い. 例えば, 平面上の $n$ 点の集合に対し, 距離が $d$ 以下の2点を枝でつないだグラフ(幾何グラフ)を考える. このグラフは $O&lt;/del&gt;(n&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;^2&lt;/del&gt;)$ &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;本の枝を含む可能性があるが, このグラフを記憶するには点集合だけ記憶すれば十分である&lt;/del&gt;. &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;つまり&lt;/del&gt;, &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;メモリや計算時間を省略するためには, 点集合のデータから必要な枝の情報を得るための構造が必要となる. また, 枝の交差など, グラフ的な情報からは導けないものもあり, それらの情報を効率的に得るためにもデータ構造はかかせない. 幾何的なデータ構造としては, 平面上の$n$ 点集合の凸包を保持し, 点の追加・消去に対し新しい凸包を &lt;/del&gt;O$(\log n)$ &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;時間で求めるもの&lt;/del&gt;, &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;$k$ 次元の $n$ 点集合に対し, 質問点から近い順に点を1個あたり平均 O$(1)$ 時間で出力する $k-d$ 木, 質問領域の中に含まれる点を1個あたり &lt;/del&gt;O$(&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;\log^{k-1} &lt;/del&gt;n)$ &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;で出力するレンジサーチ木 \cite{A-C-05+range}, 平面をいくつかの領域に分割する $n$ 本の線分の集合が与えられたとき, 質問点がどの領域に含まれるかを O$(\log n)$ 時間で答える領域探索などが挙げられる. その他に, 線分の集合に対し, ある点から見える点, すなわち2点をつなぐ線分が他の線分と交差しないような点集合を保持するデータ構造など, 交差, 領域に関してさまざまなデータ構造が考案されている. &lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt; &lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;　前述の幾何的なデータ構造は, 幾何的な対象を扱う計算幾何学のアルゴリズムで多く使われている. 多角形の三角形分割の線形時間アルゴリズムなども高度な技術を用いてデータ構造を活用しているが, しかしその反面複雑になりすぎ, 現実的ではないという欠点がある. また, 個々のアルゴリズムで使用するデータ構造がそのアルゴリズムに特化した, 一般性のないアルゴリズムとデータ構造も少なくない. それゆえ, 最近では簡素化も視野に入れた研究が進んでいる. スパーシフィケイション [6] もその一つであり, 動的データ構造高速化の一般化した技術を提供している. スパーシフィケーションにより, $n$ 頂点 $m$ 枝を持つ無向グラフの最小全張木を保持するデータ構造は, 1回の枝の追加・削除・重みの変化に対する計算時間が, O$(m^{1/2})$ からO$(n^{1/2})$ に高速化される. また同様にグラフの二部グラフ性の判定, 二連結性の判定, 頂点連結性の判定なども, 一回の操作の計算時間が O$(m)$ から O$(n)$ に高速化される. &lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt; &lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;　最後に参考文献を挙げる. 動的木などグラフ的なデータ構造は [3], [4], [5] 等に詳しい. また, 幾何的データ構造については [1], [2] 等が詳しい. &lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt; &lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt; &lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;'''参考文献'''&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt; &lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;[1] F. P. Preparata and M. L. Shamos, &amp;quot;Computational Geometry - An Introduction,&amp;quot; Springer-Verlag, 1985. 浅野孝夫, 浅野哲夫 訳,『計算幾何学入門』, 総研出版, 1992.&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt; &lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;[2] 今井浩, 今井圭子,『計算幾何学』, 共立出版, 1994.&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt; &lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;[3] T. H. Cormen, C. E. Leiserson and R. L. Rivest, &amp;quot;Introduction To Algorithms,&amp;quot; The MIT Press, 1990. 浅野哲夫, 岩間和生, 梅尾博司, 山下雅史, 和田幸一 訳,『アルゴリズムイントロダクション 1,2,3巻』, 近代科学, 1995.&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt; &lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;[4] 浅野孝夫,『情報の構造 上, 下』, 日本評論社, 1994.&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt; &lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;[5] 茨木俊秀,『アルゴリズムとデータ構造』, 昭晃堂, 1989.&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt; &lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;[6] D. Eppstein, Z. Galil, G. F. Italiano, A. Nissenzweig &amp;quot;Sparsification - A Technique for Speeding up Dynamic Graph Algorithms,&amp;quot; ''FOCS'', '''33''', 1992&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt; &lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;[7] S. Khanna, R. Motwani and R. H. Wilson, &amp;quot;On Certificates and Lookahead in Dynamic Graph Problems,&amp;quot; ''SODA'', 1995&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt; &lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;[8] D. E. Willard &amp;quot;New Data Structures for Orthogonal Range Queries,&amp;quot; ''SIAM Journal on Computing'', '''14''' (1985), 232-253&lt;/del&gt;.&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;/tr&gt;

&lt;!-- diff cache key orsjml2021_wiki:diff::1.12:old-1645:rev-4450 --&gt;
&lt;/table&gt;</summary>
		<author><name>122.17.2.240</name></author>
	</entry>
	<entry>
		<id>https://orsj-ml.org/orwiki/wiki/index.php?title=%E3%83%87%E3%83%BC%E3%82%BF%E6%A7%8B%E9%80%A0&amp;diff=1645&amp;oldid=prev</id>
		<title>122.26.167.76: 新しいページ: '【でーたこうぞう (data structure) 】  　データ構造とは, 与えられたデータに対して, そのデータを使った計算の高速化, そのデータを...'</title>
		<link rel="alternate" type="text/html" href="https://orsj-ml.org/orwiki/wiki/index.php?title=%E3%83%87%E3%83%BC%E3%82%BF%E6%A7%8B%E9%80%A0&amp;diff=1645&amp;oldid=prev"/>
		<updated>2007-07-03T06:23:03Z</updated>

		<summary type="html">&lt;p&gt;新しいページ: &amp;#039;【でーたこうぞう (data structure) 】  　データ構造とは, 与えられたデータに対して, そのデータを使った計算の高速化, そのデータを...&amp;#039;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新規ページ&lt;/b&gt;&lt;/p&gt;&lt;div&gt;【でーたこうぞう (data structure) 】&lt;br /&gt;
&lt;br /&gt;
　データ構造とは, 与えられたデータに対して, そのデータを使った計算の高速化, そのデータを記憶するために必要な領域の減少等の目的で, データに構造を持たせ, データに対する操作の効率化を行う手法の総称である. あるいくつかの機能を, データの記憶形式と, その形式のデータを操作するアルゴリズムにより実現する. &lt;br /&gt;
&lt;br /&gt;
　通常のコンピューター言語では, データを蓄える手法として配列かリスト, またはその両方が用意されている. 配列は指定した位置にあるデータに O$(1)$ 時間でアクセスでき, リストは与えられたデータを並べて記憶し, 隣のデータにO$(1)$ 時間でアクセスできる. リストは配列により実現可能だが, リストで配列は実現できない. &lt;br /&gt;
&lt;br /&gt;
　配列やリストは最も単純なデータ構造である. ここで両者を使ったデータ構造の性能の違いを見てみよう. 例として $n$ 行 $n$ 列の行列 $M$ を保持し, 他の行列との掛け算を行うためのデータ構造を考える. 通常の配列を使用して行列を記憶する場合 O$(n^2)$ のメモリが必要であるが, もし $M$ の非零要素の数 $H$ が小さい場合, 非零要素を連結してリストで持つことにより, 記憶容量を O$(H)$ まで減少させることができる. 行列の掛け算は非零要素に関する部分だけ計算を行えばよいので, 計算時間も2つの行列の非零要素の数の積に比例する. しかし, リストは一要素を記憶するのに必要なメモリが配列に比べて大きいので, 非零要素が多い場合はリストのほうが遅く, メモリも多くなる. &lt;br /&gt;
&lt;br /&gt;
　次に, $n$ 個の用語の辞書データを保持し, その中から与えられた用語を検索するためのデータ構造を考える. データに変更がないときは, 用語を辞書順で並べて記憶すれば, 二分探索により O$(\log n)$ 時間で1つの用語が検索できる. しかし, 辞書データの中の用語を削除する・新しい用語を追加する, という操作が必要な場合には, 通常平均的に O$(n)$ の時間を要する. 辞書順に並べるかわりに, 二分探索木 ([[AVL木]], 2-3[[木]]など) というデータ構造を用いれば, 使用メモリは O$(n)$ のままで, これらの操作の実行時間をO$(\log n)$ まで減らすことができる. このようにデータの動的な変化に対しても効率が良く操作が行えるよう設計されたデータ構造を動的データ構造という. 辞書データを扱う他の効率の良いデータ構造としては[[ハッシュ表]]が知られている. &lt;br /&gt;
&lt;br /&gt;
　動的データ構造の中で最も基礎的なものとしては[[ヒープ]]が挙げられる. 基本的なヒープは, $n$ 個の要素の中の最小値を得る・要素の追加・削除するという操作を, 1回あたり O$(\log n)$ 時間で実行し, またメモリ使用量も O$(n)$ である. 応用も広く,  プリム法(最小木問題のアルゴリズム), 最少費用フロー問題(最小費用流問題)のアルゴリズムなどで使用される. また, 改良版の [[Fヒープ]] (フィボナッチヒープ) は, 最短路問題を解くアルゴリズムで使われている.  その他, $n$ 個の区間の集合を保持し, 質問点を含む区間を列挙する, 区間の挿入・削除を行う, などの操作を1回あたり O$(\log n)$ 時間で行う区分木, 大きさ $n$ の木構造のグラフに対し, 合併・分割・変形・ある頂点の子孫数を求める, など多くの操作を O$(\log n)$ 時間で行う[[動的木]], 集合の合併と要素の探索を高速化し, $n$ 回の合併と $m$ 回の探索の合計時間がほぼ O$(m+n)$ となる集合ユニオン・ファインド木, 動的に変化する有向グラフの強連結性を保持し, $k$ 回の枝の挿入・削除を O$(kn^{1.3})$ で行うデータ構造\cite{A-C-05+kyourenketsu}, など数多くのものが考案されている. 文字列やグラフを扱う離散アルゴリズムの多くは, これらの基礎的なデータ構造に手を加えたものを使用することにより高速化されている. また, アルゴリズムの動作記録を変換して保持し, パラメーターの変更による計算結果の変化を出力するデータ構造は動的計画, 組み合わせ最適化問題の感度分析などに応用が広い. &lt;br /&gt;
&lt;br /&gt;
　データ構造, 特に動的データ構造は, 計算幾何学における発展が著しい. 幾何的なデータはデータの量に対して構造が複雑なものが多い. 例えば, 平面上の $n$ 点の集合に対し, 距離が $d$ 以下の2点を枝でつないだグラフ(幾何グラフ)を考える. このグラフは $O(n^2)$ 本の枝を含む可能性があるが, このグラフを記憶するには点集合だけ記憶すれば十分である. つまり, メモリや計算時間を省略するためには, 点集合のデータから必要な枝の情報を得るための構造が必要となる. また, 枝の交差など, グラフ的な情報からは導けないものもあり, それらの情報を効率的に得るためにもデータ構造はかかせない. 幾何的なデータ構造としては, 平面上の$n$ 点集合の凸包を保持し, 点の追加・消去に対し新しい凸包を O$(\log n)$ 時間で求めるもの, $k$ 次元の $n$ 点集合に対し, 質問点から近い順に点を1個あたり平均 O$(1)$ 時間で出力する $k-d$ 木, 質問領域の中に含まれる点を1個あたり O$(\log^{k-1} n)$ で出力するレンジサーチ木 \cite{A-C-05+range}, 平面をいくつかの領域に分割する $n$ 本の線分の集合が与えられたとき, 質問点がどの領域に含まれるかを O$(\log n)$ 時間で答える領域探索などが挙げられる. その他に, 線分の集合に対し, ある点から見える点, すなわち2点をつなぐ線分が他の線分と交差しないような点集合を保持するデータ構造など, 交差, 領域に関してさまざまなデータ構造が考案されている. &lt;br /&gt;
&lt;br /&gt;
　前述の幾何的なデータ構造は, 幾何的な対象を扱う計算幾何学のアルゴリズムで多く使われている. 多角形の三角形分割の線形時間アルゴリズムなども高度な技術を用いてデータ構造を活用しているが, しかしその反面複雑になりすぎ, 現実的ではないという欠点がある. また, 個々のアルゴリズムで使用するデータ構造がそのアルゴリズムに特化した, 一般性のないアルゴリズムとデータ構造も少なくない. それゆえ, 最近では簡素化も視野に入れた研究が進んでいる. スパーシフィケイション [6] もその一つであり, 動的データ構造高速化の一般化した技術を提供している. スパーシフィケーションにより, $n$ 頂点 $m$ 枝を持つ無向グラフの最小全張木を保持するデータ構造は, 1回の枝の追加・削除・重みの変化に対する計算時間が, O$(m^{1/2})$ からO$(n^{1/2})$ に高速化される. また同様にグラフの二部グラフ性の判定, 二連結性の判定, 頂点連結性の判定なども, 一回の操作の計算時間が O$(m)$ から O$(n)$ に高速化される. &lt;br /&gt;
&lt;br /&gt;
　最後に参考文献を挙げる. 動的木などグラフ的なデータ構造は [3], [4], [5] 等に詳しい. また, 幾何的データ構造については [1], [2] 等が詳しい. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''参考文献'''&lt;br /&gt;
&lt;br /&gt;
[1] F. P. Preparata and M. L. Shamos, &amp;quot;Computational Geometry - An Introduction,&amp;quot; Springer-Verlag, 1985. 浅野孝夫, 浅野哲夫 訳,『計算幾何学入門』, 総研出版, 1992.&lt;br /&gt;
&lt;br /&gt;
[2] 今井浩, 今井圭子,『計算幾何学』, 共立出版, 1994.&lt;br /&gt;
&lt;br /&gt;
[3] T. H. Cormen, C. E. Leiserson and R. L. Rivest, &amp;quot;Introduction To Algorithms,&amp;quot; The MIT Press, 1990. 浅野哲夫, 岩間和生, 梅尾博司, 山下雅史, 和田幸一 訳,『アルゴリズムイントロダクション 1,2,3巻』, 近代科学, 1995.&lt;br /&gt;
&lt;br /&gt;
[4] 浅野孝夫,『情報の構造 上, 下』, 日本評論社, 1994.&lt;br /&gt;
&lt;br /&gt;
[5] 茨木俊秀,『アルゴリズムとデータ構造』, 昭晃堂, 1989.&lt;br /&gt;
&lt;br /&gt;
[6] D. Eppstein, Z. Galil, G. F. Italiano, A. Nissenzweig &amp;quot;Sparsification - A Technique for Speeding up Dynamic Graph Algorithms,&amp;quot; ''FOCS'', '''33''', 1992&lt;br /&gt;
&lt;br /&gt;
[7] S. Khanna, R. Motwani and R. H. Wilson, &amp;quot;On Certificates and Lookahead in Dynamic Graph Problems,&amp;quot; ''SODA'', 1995&lt;br /&gt;
&lt;br /&gt;
[8] D. E. Willard &amp;quot;New Data Structures for Orthogonal Range Queries,&amp;quot; ''SIAM Journal on Computing'', '''14''' (1985), 232-253.&lt;/div&gt;</summary>
		<author><name>122.26.167.76</name></author>
	</entry>
</feed>