-
二分探索木の走査アルゴリズム完全解説:行順・先行順・後行順・レベル順をC++で実装
二分探索木の走査とはこの記事では、二分探索木(BST:Binary Search Tree)に格納されたキーを巡回するための4種類の走査アルゴリズムを解説します。具体的には、以下の4つです。行順(Inorder)走査:左部分木 → 根 → 右部分木の順に訪問先行順(Preorder)走査:根 → 左部分木 → 右部分木の順に訪問後行順(Postorder)走査:左部分木 → 右部分木 → 根の順に訪問レベル順(Level-order)走査:木の上から階層ごとに左から右へ訪問例として使用する木説明のために、次のような二分探索木を想定します。この木に対する各走査の結果は以下のようになります。行順走
-
【データ構造】二分探索木のレベル順走査(Level-Order Traversal)をC++で実装して理解しよう
本記事では、二分探索木(Binary Search Tree)におけるレベル順走査(Level-Order Traversal)の手法について詳しく解説します。レベル順走査は、木の根(ルート)から出発し、上の階層から下の階層へ、同じ深さのノードは左から右の順に訪問していく方法です。この走査は幅優先探索(BFS:Breadth-First Search)とも呼ばれ、木やグラフの探索において非常に重要な基本概念となっています。 例として、次のような二分探索木を考えてみましょう。 この木に対してレベル順走査を実行すると、ノードは次の順序で訪問されます。 10 → 5 → 16 → 8 → 15
-
データ構造入門:二分探索木の後順トラバーサル(ポストオーダー走査)を徹底解説
この記事では、二分探索木(Binary Search Tree)における後順トラバーサル(ポストオーダー走査)の手法を、再帰的なアプローチを中心に詳しく解説します。後順トラバーサルは、「左の子ノード → 右の子ノード → 親ノード」の順でノードを訪問する木の走査方法です。ノードの削除処理や、子ノードを先に評価してから親を処理したいケースなどで広く活用されます。まず、次のような二分探索木を例に考えてみましょう。この木を後順で走査した場合の訪問順序は以下の通りです。8, 5, 15, 23, 20, 16, 10最も深い位置にある左側のノードから順に処理され、最後に根(ルート)である10が出力され
-
データ構造解説:二分探索木の先行順(プレオーダー)トラバーサルを再帰で実装する方法
この記事では、二分探索木(Binary Search Tree)における先行順トラバーサル(プレオーダー走査)の手法を、再帰を用いた実装とともに詳しく解説します。先行順トラバーサルは、木構造の各ノードを「根 → 左部分木 → 右部分木」の順に訪問する走査方法です。 対象となる二分探索木 まず、次のような二分探索木を例として考えます。 この木に対して先行順トラバーサルを実行すると、ノードは以下の順序で訪問されます。 走査順序:10, 5, 8, 16, 15, 20, 23 この順序になる理由は、まず根(10)を出力し、次に左部分木(5 → 8)を処理し、その後に右部分木(16 → 15 →
-
【入門】データ構造の二分探索木(BST)とは?C++での実装例もわかりやすく解説
二分探索木とは二分探索木(Binary Search Tree:BST)は、特定の性質を満たす二分木の一種です。この性質のおかげで、木の中から目的の値を効率的に検索できることが大きな特徴です。主な性質は以下のとおりです。すべての二分探索木は二分木である左の子ノードには、親(ルート)より小さい値が格納される右の子ノードには、親(ルート)より大きい値が格納される理想的な二分探索木では、同じ値を重複して保持しない例として、次のような木を考えてみましょう。この木は上記の性質をすべて満たしているため、正しい二分探索木といえます。ここで注目すべき点として、この木を中順走査(インオーダー走査)で巡回すると、
-
グラフデータ構造と走査(トラバーサル)アルゴリズムの基礎
この記事では、グラフデータ構造とは何か、そしてその走査(トラバーサル)アルゴリズムについて詳しく解説します。グラフは非線形データ構造の一種であり、いくつかのノード(頂点)とそれらを結ぶ辺(エッジ)で構成されます。辺には有向と無向の2種類があります。グラフは一般に G(V, E) の形式で表現できます。ここで V は頂点の集合、E は辺の集合を表します。例えば、下図のグラフは G({A, B, C, D, E}, {(A, B), (B, D), (D, E), (B, C), (C, A)}) と表すことができます。グラフの走査アルゴリズムには主に2種類あります。それが「幅優先探索(Bread
-
データ構造におけるDFSとBFSの応用例|グラフ探索アルゴリズムの活用シーンを徹底解説
グラフ理論において、DFS(深さ優先探索)とBFS(幅優先探索)は最も基本的でありながら、実務のさまざまな場面で活躍する重要なアルゴリズムです。本記事では、それぞれの探索手法がどのような用途で使われているのか、具体的な応用例をわかりやすく解説します。 DFS(深さ優先探索)の主な応用例 DFS(Depth First Search)は、グラフを深く掘り下げるように探索する手法で、以下のような場面で広く利用されています。 最小全域木の構築: 重みなしグラフに対してDFSを実行すると、全ペア最短経路木のための最小全域木を作成できます。 サイクル(閉路)の検出: DFSの探索中にバックエッジ
-
データ構造入門:最小全域木(Minimum Spanning Tree)とは
全域木(スパニングツリー)とは全域木(スパニングツリー)とは、無向グラフの部分集合であり、グラフ内のすべての頂点を最小限の数の辺で接続した木構造のことを指します。グラフ内のすべての頂点が互いに連結されている場合、必ず少なくとも1つの全域木が存在します。また、1つのグラフに対して、複数の全域木が存在することもあります。最小全域木(MST)とは最小全域木(Minimum Spanning Tree:MST)とは、連結された重み付き無向グラフにおいて、すべての頂点を接続しながら、辺の重みの合計が最小となるような辺の部分集合です。MSTを求めるアルゴリズムとしては、プリム法(Prims algorit
-
データ構造におけるベルヌーイ分布とは?定義・数式・C++実装例をわかりやすく解説
ベルヌーイ分布とは ベルヌーイ分布(Bernoulli Distribution)は、試行の結果が「成功」と「失敗」の2通りしかない離散確率分布です。結果は x = 1(成功)と x = 0(失敗)という値で表されます。 成功が起こる確率を p、失敗が起こる確率を q とすると、両者は互いに排他的な事象であるため、次の関係が成り立ちます。 q = 1 − p 確率質量関数 以上より、ベルヌーイ分布の確率質量関数は次のように定義されます。 $$P(x)=\begin{cases}1-p \quad & (x = 0)\\p \quad & (x = 1)\end{cases}$$
-
データ構造における二項分布の基礎とC++での実装例
二項分布とは二項分布(Binomial Distribution)とは、N回のベルヌーイ試行においてn回の成功が得られる確率を表す離散型確率分布 Pp(n | N) です。ここでいうベルヌーイ試行とは、結果が次の2通りしかない試行のことを指します。x = 1:成功(発生確率 p)x = 0:失敗(発生確率 q = 1 − p)このとき、二項分布は以下の式で表されます。$$P_{p}\lgroup n\:\arrowvert\ N\rgroup=\left(\begin{array}{c}N\\ n\end{array}\right) p^{n}\lgroup1-p\rgroup^{N-n}$$
-
データ構造における幾何分布とは?確率質量関数とC++実装例を解説
幾何分布(Geometric Distribution)は、n = 0, 1, 2, … のような非負の整数値をとる離散型確率分布の一つです。一連の独立した試行において「初めて成功するまでに何回失敗するか」という現象をモデル化するために用いられます。 各試行が互いに独立で、成功確率が一定値 p であるとき、幾何分布の確率質量関数は次の式で表されます。 $$P(n)=p(1-p)^{n}$$ ここで、p は1回あたりの成功確率、(1−p) は失敗確率です。一般的には q = 1 − p とおいて表記することも多くあります。 さらに、累積分布関数(分布関数)は次のように与えられます。 $$D(n)
-
データ構造における負の二項分布とは?定義・数式・C++実装例を解説
負の二項分布(Negative Binomial Distribution)は、負の二項離散分布に従う整数値の乱数を生成する確率分布です。この分布は「パスカル分布(Pascals Distribution)」としても知られています。負の二項分布は、「成功確率 p の試行を繰り返し、k 回の成功を得るまでに何回の失敗(i 回)が起こるか」という確率をモデル化したものです。数式では次のように表されます。$$P\lgroup i\arrowvert k,p\rgroup=\lgroup \frac{k+i-1}{i}\rgroup p^{k}\lgroup 1-p\rgroup^{i}$$主なパラメ
-
データ構造入門:最適二分探索木(Optimal BST)で検索コストを最小化する方法
最適二分探索木とはソートされた順序で整数のキー集合が与えられ、同時に各キーの出現頻度を格納した配列 freq も渡されます。この課題は、これらのデータをもとに二分探索木(BST)を構築し、すべての検索にかかるコストの合計を最小にすることです。検索コストは「キーの深さ × 出現頻度」の総和で表されます。そのため、頻度の高いキーほど根に近い浅い位置へ配置できれば、全体のコストを大きく抑えられます。このような木を最適二分探索木(Optimal BST)と呼びます。部分問題の解を保存し、ボトムアップ方式で問題を解決するために、補助配列 cost[n][n] を作成します。このコスト行列には、動的計画法
-
凸包(Convex Hull)とは?ジャービス・マーチ法による求め方とC++実装例
本記事では、計算幾何学における重要な概念である凸包(Convex Hull)について、具体的な例を通じて解説します。平面上に与えられた点集合に対して、すべての点を包含する最小の多角形を、できるだけ少ない点で構成する問題を考えます。この問題を解く代表的な手法の一つがジャービス・マーチ法(Jarvis March)、別名「ギフト包装法」です。ジャービス・マーチ法の概要ジャービス・マーチ法は、与えられた点集合から凸包の頂点(角となる点)を検出するためのアルゴリズムです。基本的な考え方はシンプルで、点集合の中で最も左にある点を出発点とし、そこから反時計回りに回転しながら凸包に含まれる点を順番に選んでい
-
データ構造におけるスタックADT(抽象データ型)の基本と操作を解説
抽象データ型(ADT:Abstract Data Type)は、値の集合とそれに対する操作の集合によって振る舞いが定義される、特殊なデータ型です。「抽象」という言葉が使われる理由は、利用者はこれらのデータ型を使って様々な操作を実行できるものの、その操作が内部でどのように実装され、動作しているのかが完全に隠されているためです。つまりADTはプリミティブなデータ型から構成されていますが、操作のロジックは外部から見えないようにカプセル化されています。 スタックはADTの代表的な例の一つです。スタックは「LIFO(Last In First Out:後入れ先出し)」と呼ばれる方式でデータを管理し、最後
-
データ構造における検索方法の比較:線形探索と二分探索の違いを徹底解説
データ構造の世界では、目的のキー(値)を効率よく見つけるために、状況に応じてさまざまな探索手法が使い分けられています。本記事では、代表的な two つの探索アルゴリズムである線形探索(Sequential Search)と二分探索(Binary Search)について、計算量・データの前提条件・実装の容易さなどの観点から、基本的な違いを詳しく比較していきます。線形探索と二分探索の主な違いまずは、両者の違いを一覧表で確認しましょう。線形探索(Sequential Search)二分探索(Binary Search)時間計算量は O(n)時間計算量は O(log n)先頭位置にあるキーなら定数時間
-
データ構造のソート(並べ替え)アルゴリズム徹底比較:計算量と分類の基礎
ソート(並べ替え)アルゴリズムには200種類以上の手法が存在します。本記事では、その中から代表的な手法を厳選し、それぞれの特徴や時間計算量を比較して解説します。ソートの手法は、大きく分けて「比較ベースのソート」と「非比較ベースのソート」の2つに分類できます。 比較ベースのソートとは バブルソート、選択ソート、挿入ソート、マージソート、クイックソート、ヒープソートなどが、代表的な比較ベースのソートです。これらが「比較ソート」と呼ばれる理由は、要素同士の値を比較しながら、複数のフェーズ(パス)を経て順番に並べていく仕組みだからです。以下の表に、各アルゴリズムの時間計算量をまとめました。 解析
-
グラフ構造の隣接リスト(Adjacency List)とは?基本概念と実装方法を解説
グラフは代表的な非線形データ構造の一つです。頂点(ノード)でデータを表し、その頂点同士の関係を辺(エッジ)で表現します。グラフGは「頂点の集合V」と「辺の集合E」という2つの要素から構成され、G(V,E)という形式で表記されます。まずは具体例を見てみましょう。このグラフには5つの頂点と5つの辺が存在します。すべての辺には向きが定義されています。例として、頂点BとDを結ぶ辺に注目すると、始点はB、終点はDとなります。そのため、BからDへは移動できますが、逆にDからBへ移動することはできません。グラフは非線形であり、一定の規則性を持たない構造です。そのため、メモリ上でグラフを扱うには、目的に応じた
-
データ構造の比較:主要な探索木(BST・AVL・B木・赤黒木・スプレー木)の違いと計算量
データ構造の中でも、データを効率的に検索するために設計された「探索木(サーチツリー)」には、さまざまな種類が存在します。それぞれ性質や特徴が異なり、用途に応じて使い分けられています。本記事では、代表的な探索木を取り上げ、その違いと操作ごとの時間計算量を比較して解説します。主な探索木の種類探索木の基本となるのは二分探索木(Binary Search Tree: BST)です。さらに、バランスを保つ仕組みを持つAVL木、赤黒木(Red-Black Tree)、スプレー木(Splay Tree)、ディスク向けに多分岐を採用したB木などが広く知られています。二分探索木(BST):各ノードが最大2つの子
-
分散共有メモリ(DSM)を実装するための4つのアルゴリズムを徹底解説
共有メモリと分散共有メモリ(DSM)とは共有メモリとは、複数のプログラムからアクセスできるメモリ領域のことです。共有メモリの概念は、プロセス間の通信手段を提供するとともに、冗長性の少ない効率的なメモリ管理を実現するために用いられます。分散共有メモリ(Distributed Shared Memory、略称:DSM)は、この共有メモリの概念を分散システム上で実現したものです。DSMシステムは、ローカルな物理共有メモリを持たない疎結合システムにおいて、共有メモリモデルを実装します。この種のシステムでは、分散階層内のすべてのシステム(ノードとも呼ばれます)がアクセスできる仮想メモリ空間が提供されます