<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>アルゴリズム &#8211; システム開発・AI導入なら株式会社taiziii（タイジー</title>
	<atom:link href="https://taiziii.com/column_cat/algorithm/feed/" rel="self" type="application/rss+xml" />
	<link>https://taiziii.com</link>
	<description>事業理解に強いITコンサルタントとフルスタックエンジニアが、Webサービス・アプリ・業務システムを戦略設計から実装・保守運用まで一気通貫で支援。AI活用や内製化支援で成果に直結する開発を実現します。</description>
	<lastBuildDate>Wed, 19 Feb 2025 15:04:04 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://taiziii.com/wp-content/uploads/2023/10/favicon.ico</url>
	<title>アルゴリズム &#8211; システム開発・AI導入なら株式会社taiziii（タイジー</title>
	<link>https://taiziii.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>絶対に知っておきたい！超重要なデータ構造 7選</title>
		<link>https://taiziii.com/column/406/</link>
		
		<dc:creator><![CDATA[THiNGMAjiG_admin_user_kato]]></dc:creator>
		<pubDate>Mon, 14 Aug 2023 14:17:43 +0000</pubDate>
				<guid isPermaLink="false">https://taiziii.com/?post_type=column&#038;p=406</guid>

					<description><![CDATA[今回は、データ構造に関する内容だね！ データ構造の仕組みや特徴について学んでいきましょう！ 本記事で学べること ・基本的なデータ構造の仕組み・特徴 はじめに データ構造には、さまざまな種類があり、それぞれのデータ構造には [&#8230;]]]></description>
										<content:encoded><![CDATA[<div class="balloonWrap">
<div class="balloon2-left">
<p>今回は、データ構造に関する内容だね！</p>
</div>
<div class="balloon2-right">
<p>データ構造の仕組みや特徴について学んでいきましょう！</p>
</div>
</div>
<h2>本記事で学べること</h2>
<p>・基本的なデータ構造の仕組み・特徴</p>
<h2>はじめに</h2>
<p>データ構造には、さまざまな種類があり、それぞれのデータ構造には、長所と短所があるため、プログラムの要件に応じて適切なデータ構造を選択する必要があります。本記事では、さまざまなデータ構造の特徴を紹介することで、読者の選択肢を増やすと共に、選択するための判断基準を提供したいと考えています。<br />
それでは本題に入りましょう。まず、データ構造とは何かについて説明したいと思います。</p>
<h2>データ構造とは</h2>
<p>データ構造とは、データの集合を目的に応じて特定の形式で格納および管理するために使われる、形式化されたデータ構成のことをいいます。データ構造は、データの効率的な検索、追加、削除、更新などを可能にすることで、プログラムのパフォーマンスを向上させます。<br />
データ構造の選択は、プログラムのパフォーマンスに大きな影響を与えます。適切なデータ構造を選択することで、プログラムの実行速度を向上させ、メモリ使用量を削減することができます。また、データ構造の選択は、プログラムの保守性にも影響を与えます。適切なデータ構造を選択することで、プログラムのコードがわかりやすく、変更が容易になります。<br />
さっそく具体的なデータ構造について紹介していきましょう。</p>
<h2>リスト</h2>
<p>リストは、複数の要素を順序付けて格納するためのデータ構造です。それでは3つのデータからなるリストを例にして、詳しく説明していきましょう。</p>
<p><img decoding="async" class="alignnone size-medium wp-image-407 lazyload" data-src="https://taiziii.com/wp-content/uploads/2023/08/スクリーンショット-2023-08-12-21.49.28-300x50.png" alt="" width="300" height="50" data-srcset="https://taiziii.com/wp-content/uploads/2023/08/スクリーンショット-2023-08-12-21.49.28-300x50.png 300w, https://taiziii.com/wp-content/uploads/2023/08/スクリーンショット-2023-08-12-21.49.28-768x129.png 768w, https://taiziii.com/wp-content/uploads/2023/08/スクリーンショット-2023-08-12-21.49.28.png 932w" sizes="(max-width: 300px) 100vw, 300px" ><br />
リストでは基本的に、一つのノードにデータと次のノードを指すポインタが含まれています。今回は、前二つのノードに、Apple とポインタ、Peach とポインタがそれぞれ格納されています。ただし、Lemon が格納されているノードは、ポインタが格納されないことに注意してください。これは、Lemon が格納されているノードが最後尾であるため、その先にアクセスするノードがないからです。<br />
各ノードには、ポインタを頭から辿ることでしかアクセスできません。この例の場合、Lemon にアクセスしたいときには、まず Apple にアクセスし、さらに Peach を辿らなければなりません。<br />
データの追加は、追加する前後のポインタを指し替えるだけで済むので、簡単に行えます。例えば、Peach と Lemon の間に Mango を追加したいときには、Peach のポインタを Mango に指し替え、Mango のポインタを Lemon に向ければ完了です。</p>
<p><img decoding="async" class="alignnone size-medium wp-image-408 lazyload" data-src="https://taiziii.com/wp-content/uploads/2023/08/スクリーンショット-2023-08-12-22.06.16-300x119.png" alt="" width="300" height="119" data-srcset="https://taiziii.com/wp-content/uploads/2023/08/スクリーンショット-2023-08-12-22.06.16-300x119.png 300w, https://taiziii.com/wp-content/uploads/2023/08/スクリーンショット-2023-08-12-22.06.16-768x304.png 768w, https://taiziii.com/wp-content/uploads/2023/08/スクリーンショット-2023-08-12-22.06.16.png 950w" sizes="(max-width: 300px) 100vw, 300px" ><br />
データの削除も追加のときと同様に、ポインタの指し替えで行えます。例えば、Mango を削除したかったら、Peach のポインタを Lemon を指すようにすればいいだけです。<br />
以上をまとめると、リストには、データの追加や削除がしやすい反面、アクセスには時間がかかるという特徴があります。なお、ここでは、最も基本的な単方向リストの仕組みについて説明しましたが、他にも最後尾のノードが先頭のノードを指す環状リストや各ノードにポインタを二つ持たせて前後のノードを指すようにした双方向リストなどがあります。</p>
<h2>配列</h2>
<p>配列は、データを一列に並べます。a という名前の配列に3つのデータが格納されているとすると、a の横の [ ] は、配列の何番目かを表しています。</p>
<p><img decoding="async" class="alignnone size-medium wp-image-409 lazyload" data-src="https://taiziii.com/wp-content/uploads/2023/08/スクリーンショット-2023-08-12-22.22.33-300x72.png" alt="" width="300" height="72" data-srcset="https://taiziii.com/wp-content/uploads/2023/08/スクリーンショット-2023-08-12-22.22.33-300x72.png 300w, https://taiziii.com/wp-content/uploads/2023/08/スクリーンショット-2023-08-12-22.22.33-768x186.png 768w, https://taiziii.com/wp-content/uploads/2023/08/スクリーンショット-2023-08-12-22.22.33.png 1018w" sizes="(max-width: 300px) 100vw, 300px" ><br />
配列では、インデックスを指定するだけで、求めているデータに直接アクセスすることができます。Lemon にアクセスしたいときは、a[2] を指定すれば直接アクセスできます。<br />
データを追加する場合は、リストに比べてコストが高くなります。例を使って説明すると、a[1] に Mango を追加する場合、まず、配列の最後に追加する空間を確保します。</p>
<p><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-410 lazyload" data-src="https://taiziii.com/wp-content/uploads/2023/08/スクリーンショット-2023-08-12-22.39.40-300x113.png" alt="" width="300" height="113" data-srcset="https://taiziii.com/wp-content/uploads/2023/08/スクリーンショット-2023-08-12-22.39.40-300x113.png 300w, https://taiziii.com/wp-content/uploads/2023/08/スクリーンショット-2023-08-12-22.39.40-1024x384.png 1024w, https://taiziii.com/wp-content/uploads/2023/08/スクリーンショット-2023-08-12-22.39.40-768x288.png 768w, https://taiziii.com/wp-content/uploads/2023/08/スクリーンショット-2023-08-12-22.39.40.png 1082w" sizes="auto, (max-width: 300px) 100vw, 300px" ><br />
その後、追加される空間を空けるため、1つずつデータをずらしていきます。つまり、まず Lemon をずらし、その後に Peach をずらすことになります。そして、Mango を a[1] に格納します。</p>
<p><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-411 lazyload" data-src="https://taiziii.com/wp-content/uploads/2023/08/スクリーンショット-2023-08-12-22.39.48-300x103.png" alt="" width="300" height="103" data-srcset="https://taiziii.com/wp-content/uploads/2023/08/スクリーンショット-2023-08-12-22.39.48-300x103.png 300w, https://taiziii.com/wp-content/uploads/2023/08/スクリーンショット-2023-08-12-22.39.48-1024x352.png 1024w, https://taiziii.com/wp-content/uploads/2023/08/スクリーンショット-2023-08-12-22.39.48-768x264.png 768w, https://taiziii.com/wp-content/uploads/2023/08/スクリーンショット-2023-08-12-22.39.48.png 1060w" sizes="auto, (max-width: 300px) 100vw, 300px" ><br />
データを削除する場合は、追加と逆の手順を踏めばよいです。つまり、Mango を削除する場合、まず、Mango を削除し、その後で、Peach、Lemon を右に一つずつずらします。<br />
配列には、データへのアクセスは簡単に行えますが、追加や削除にコストがかかるという特徴があります。</p>
<h2>スタック</h2>
<p>スタックは、LIFO（Last In, First Out, 後入れ先出し）の原則に則ったデータ構造です。後に追加したデータほど、先に取り出します。なおスタックでは、データを追加することをプッシュ、データを取り出すことをポップといいます。<br />
例えば、Apple というデータをプッシュし、その後で Peach というデータをプッシュした場合、以下のようになります。</p>
<p><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-421 lazyload" data-src="https://taiziii.com/wp-content/uploads/2023/08/スクリーンショット-2023-08-14-22.37.11-300x147.png" alt="" width="300" height="147" data-srcset="https://taiziii.com/wp-content/uploads/2023/08/スクリーンショット-2023-08-14-22.37.11-300x147.png 300w, https://taiziii.com/wp-content/uploads/2023/08/スクリーンショット-2023-08-14-22.37.11-1024x502.png 1024w, https://taiziii.com/wp-content/uploads/2023/08/スクリーンショット-2023-08-14-22.37.11-768x376.png 768w, https://taiziii.com/wp-content/uploads/2023/08/スクリーンショット-2023-08-14-22.37.11.png 1216w" sizes="auto, (max-width: 300px) 100vw, 300px" ><br />
ここでポップを行うと、Peach が取り出されます。</p>
<p><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-426 lazyload" data-src="https://taiziii.com/wp-content/uploads/2023/08/スクリーンショット-2023-08-14-22.47.43-300x136.png" alt="" width="300" height="136" data-srcset="https://taiziii.com/wp-content/uploads/2023/08/スクリーンショット-2023-08-14-22.47.43-300x136.png 300w, https://taiziii.com/wp-content/uploads/2023/08/スクリーンショット-2023-08-14-22.47.43-1024x464.png 1024w, https://taiziii.com/wp-content/uploads/2023/08/スクリーンショット-2023-08-14-22.47.43-768x348.png 768w, https://taiziii.com/wp-content/uploads/2023/08/スクリーンショット-2023-08-14-22.47.43.png 1100w" sizes="auto, (max-width: 300px) 100vw, 300px" ><br />
スタックは、途中のデータにはアクセスできませんが、常に最新のデータにアクセスしたいときには便利です。</p>
<h2>キュー</h2>
<p>キューは、FIFO（First In, First Out, 先入れ先出し）の原則に則ったデータ構造です。先に追加したデータほど、先に取り出します。なおキューでは、データを追加することをエンキュー、データを取り出すことをデキューといいます。<br />
例えば、Apple というデータをエンキューし、その後で Peach というデータをエンキューした場合、以下のようになります。</p>
<p><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-423 lazyload" data-src="https://taiziii.com/wp-content/uploads/2023/08/スクリーンショット-2023-08-14-22.44.33-300x131.png" alt="" width="300" height="131" data-srcset="https://taiziii.com/wp-content/uploads/2023/08/スクリーンショット-2023-08-14-22.44.33-300x131.png 300w, https://taiziii.com/wp-content/uploads/2023/08/スクリーンショット-2023-08-14-22.44.33-1024x446.png 1024w, https://taiziii.com/wp-content/uploads/2023/08/スクリーンショット-2023-08-14-22.44.33-768x334.png 768w, https://taiziii.com/wp-content/uploads/2023/08/スクリーンショット-2023-08-14-22.44.33.png 1208w" sizes="auto, (max-width: 300px) 100vw, 300px" ><br />
ここまでは、スタックと同じですね。しかし、ここで、デキューした場合、Apple が取り出されます。</p>
<p><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-425 lazyload" data-src="https://taiziii.com/wp-content/uploads/2023/08/スクリーンショット-2023-08-14-22.46.13-300x122.png" alt="" width="300" height="122" data-srcset="https://taiziii.com/wp-content/uploads/2023/08/スクリーンショット-2023-08-14-22.46.13-300x122.png 300w, https://taiziii.com/wp-content/uploads/2023/08/スクリーンショット-2023-08-14-22.46.13-1024x416.png 1024w, https://taiziii.com/wp-content/uploads/2023/08/スクリーンショット-2023-08-14-22.46.13-768x312.png 768w, https://taiziii.com/wp-content/uploads/2023/08/スクリーンショット-2023-08-14-22.46.13.png 1196w" sizes="auto, (max-width: 300px) 100vw, 300px" ><br />
キューは、スタックと同様に、途中のデータにはアクセスできません。しかし、常に古いデータから処理したいときには便利です。</p>
<h2>ハッシュテーブル</h2>
<p>ハッシュテーブルは、ハッシュ関数を利用することで、キーとバリューがセットになったデータの検索を効率的に行えるようにしたデータ構造です。例えば、[キー, バリュー] が [太郎, 男] のデータを 5 つの箱がある配列に格納することを考えてみましょう。</p>
<p><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-428 lazyload" data-src="https://taiziii.com/wp-content/uploads/2023/08/スクリーンショット-2023-08-14-22.50.43-300x131.png" alt="" width="300" height="131" data-srcset="https://taiziii.com/wp-content/uploads/2023/08/スクリーンショット-2023-08-14-22.50.43-300x131.png 300w, https://taiziii.com/wp-content/uploads/2023/08/スクリーンショット-2023-08-14-22.50.43-1024x447.png 1024w, https://taiziii.com/wp-content/uploads/2023/08/スクリーンショット-2023-08-14-22.50.43-768x335.png 768w, https://taiziii.com/wp-content/uploads/2023/08/スクリーンショット-2023-08-14-22.50.43.png 1168w" sizes="auto, (max-width: 300px) 100vw, 300px" ><br />
まず、キーである太郎をハッシュ関数で変換します。すると、3569 になったとします（なお、ハッシュ関数の出力結果をハッシュ値と呼びます）。</p>
<p><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-429 lazyload" data-src="https://taiziii.com/wp-content/uploads/2023/08/スクリーンショット-2023-08-13-21.57.07-1-300x70.png" alt="" width="300" height="70" data-srcset="https://taiziii.com/wp-content/uploads/2023/08/スクリーンショット-2023-08-13-21.57.07-1-300x70.png 300w, https://taiziii.com/wp-content/uploads/2023/08/スクリーンショット-2023-08-13-21.57.07-1-768x179.png 768w, https://taiziii.com/wp-content/uploads/2023/08/スクリーンショット-2023-08-13-21.57.07-1.png 790w" sizes="auto, (max-width: 300px) 100vw, 300px" ><br />
これを mod 5（ 5 つの箱がある配列を考えているため）で考えると、3569 は 4 に等しくなります。したがって、[太郎, 男] は、4 の箱に格納されることになります。</p>
<p><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-430 lazyload" data-src="https://taiziii.com/wp-content/uploads/2023/08/スクリーンショット-2023-08-14-22.52.54-300x130.png" alt="" width="300" height="130" data-srcset="https://taiziii.com/wp-content/uploads/2023/08/スクリーンショット-2023-08-14-22.52.54-300x130.png 300w, https://taiziii.com/wp-content/uploads/2023/08/スクリーンショット-2023-08-14-22.52.54-1024x442.png 1024w, https://taiziii.com/wp-content/uploads/2023/08/スクリーンショット-2023-08-14-22.52.54-768x332.png 768w, https://taiziii.com/wp-content/uploads/2023/08/スクリーンショット-2023-08-14-22.52.54.png 1200w" sizes="auto, (max-width: 300px) 100vw, 300px" ><br />
次に、[ 花子, 女] というデータを考えてみましょう。花子をハッシュ関数で格納して、mod 5 で考えたときに、結果が 0 ~ 3 のどれかと等しくなった場合、等しくなった番号の箱に格納します。もし、結果が 4 と等しくなった場合、以下のようにリストを利用して、[太郎, 男] のデータにつなげます。</p>
<p><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-436 lazyload" data-src="https://taiziii.com/wp-content/uploads/2023/08/スクリーンショット-2023-08-14-22.59.15-300x147.png" alt="" width="300" height="147" data-srcset="https://taiziii.com/wp-content/uploads/2023/08/スクリーンショット-2023-08-14-22.59.15-300x147.png 300w, https://taiziii.com/wp-content/uploads/2023/08/スクリーンショット-2023-08-14-22.59.15.png 614w" sizes="auto, (max-width: 300px) 100vw, 300px" ><br />
ハッシュテーブルは、ハッシュ関数を利用することで、データへの素早いアクセスを可能にしています。また、ハッシュ値を mod 演算した結果が衝突した時には、リストを利用します。また、今回紹介したリストを利用する方法は、チェイン（連鎖）法と呼ばれており、他にもハッシュ関数をいくつか利用する方法や線形操作法などがあります。</p>
<h2>ヒープ</h2>
<p>ヒープは、グラフの木構造の一種で、プライオリティキューの実装のときに使われます。プライオリティキューとは、データを自由に追加でき、小さいものから取り出すことができるデータ構造です。例として、以下のヒープについて考えてみましょう。各ノードに書かれている数字が格納されているデータです。</p>
<p><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-439 lazyload" data-src="https://taiziii.com/wp-content/uploads/2023/08/スクリーンショット-2023-08-14-23.02.48-300x148.png" alt="" width="300" height="148" data-srcset="https://taiziii.com/wp-content/uploads/2023/08/スクリーンショット-2023-08-14-23.02.48-300x148.png 300w, https://taiziii.com/wp-content/uploads/2023/08/スクリーンショット-2023-08-14-23.02.48-1024x504.png 1024w, https://taiziii.com/wp-content/uploads/2023/08/スクリーンショット-2023-08-14-23.02.48-768x378.png 768w, https://taiziii.com/wp-content/uploads/2023/08/スクリーンショット-2023-08-14-23.02.48.png 1264w" sizes="auto, (max-width: 300px) 100vw, 300px" ><br />
ヒープは、最大2つの子ノードを持ち、ノードは上に詰め、同じ段では左に詰めます。また、子ノードの数字は必ず親ノードの数字よりも大きくなります。<br />
ここで、ヒープに5を追加してみましょう。初めは、6の右側の子ノードに格納されますが、それだと親ノードの方が子ノードよりも大きくなってしまうので、5の位置と6の位置を入れ替えます。</p>
<p><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-441 lazyload" data-src="https://taiziii.com/wp-content/uploads/2023/08/スクリーンショット-2023-08-14-23.05.13-300x132.png" alt="" width="300" height="132" data-srcset="https://taiziii.com/wp-content/uploads/2023/08/スクリーンショット-2023-08-14-23.05.13-300x132.png 300w, https://taiziii.com/wp-content/uploads/2023/08/スクリーンショット-2023-08-14-23.05.13-768x337.png 768w, https://taiziii.com/wp-content/uploads/2023/08/スクリーンショット-2023-08-14-23.05.13.png 1016w" sizes="auto, (max-width: 300px) 100vw, 300px" ><br />
次に、ここから1を削除する場合を考えてみましょう。1を削除した場合、最後尾の数が1に移動します。ヒープは上詰め、左詰めなので、今回は、6になります。</p>
<p><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-442 lazyload" data-src="https://taiziii.com/wp-content/uploads/2023/08/スクリーンショット-2023-08-14-23.06.20-300x150.png" alt="" width="300" height="150" data-srcset="https://taiziii.com/wp-content/uploads/2023/08/スクリーンショット-2023-08-14-23.06.20-300x150.png 300w, https://taiziii.com/wp-content/uploads/2023/08/スクリーンショット-2023-08-14-23.06.20-1024x513.png 1024w, https://taiziii.com/wp-content/uploads/2023/08/スクリーンショット-2023-08-14-23.06.20-768x385.png 768w, https://taiziii.com/wp-content/uploads/2023/08/スクリーンショット-2023-08-14-23.06.20.png 1202w" sizes="auto, (max-width: 300px) 100vw, 300px" ><br />
しかし、このままだと、親ノードが子ノードより大きくなるので、子ノードのうち小さい方と入れ替えます。3と5だと3の方が小さいので、3と6を入れ替えます。</p>
<p><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-443 lazyload" data-src="https://taiziii.com/wp-content/uploads/2023/08/スクリーンショット-2023-08-14-23.07.26-300x128.png" alt="" width="300" height="128" data-srcset="https://taiziii.com/wp-content/uploads/2023/08/スクリーンショット-2023-08-14-23.07.26-300x128.png 300w, https://taiziii.com/wp-content/uploads/2023/08/スクリーンショット-2023-08-14-23.07.26-1024x437.png 1024w, https://taiziii.com/wp-content/uploads/2023/08/スクリーンショット-2023-08-14-23.07.26-768x328.png 768w, https://taiziii.com/wp-content/uploads/2023/08/スクリーンショット-2023-08-14-23.07.26.png 1190w" sizes="auto, (max-width: 300px) 100vw, 300px" ><br />
同様に、6と4を入れ替えれば完成です。</p>
<p><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-444 lazyload" data-src="https://taiziii.com/wp-content/uploads/2023/08/スクリーンショット-2023-08-14-23.09.19-300x138.png" alt="" width="300" height="138" data-srcset="https://taiziii.com/wp-content/uploads/2023/08/スクリーンショット-2023-08-14-23.09.19-300x138.png 300w, https://taiziii.com/wp-content/uploads/2023/08/スクリーンショット-2023-08-14-23.09.19-1024x472.png 1024w, https://taiziii.com/wp-content/uploads/2023/08/スクリーンショット-2023-08-14-23.09.19-768x354.png 768w, https://taiziii.com/wp-content/uploads/2023/08/スクリーンショット-2023-08-14-23.09.19.png 1210w" sizes="auto, (max-width: 300px) 100vw, 300px" ><br />
ヒープは、常に一番上に最小のデータがあるため、最小値を取得しやすいという特徴があります。</p>
<h2>2分探索木</h2>
<p>2分探索木は、グラフの木構造を利用したデータ構造です。各ノードは最大2つの子ノードを持ちます。以下の例を使って、説明していきます。</p>
<p><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-445 lazyload" data-src="https://taiziii.com/wp-content/uploads/2023/08/スクリーンショット-2023-08-14-23.11.12-300x191.png" alt="" width="300" height="191" data-srcset="https://taiziii.com/wp-content/uploads/2023/08/スクリーンショット-2023-08-14-23.11.12-300x191.png 300w, https://taiziii.com/wp-content/uploads/2023/08/スクリーンショット-2023-08-14-23.11.12-1024x652.png 1024w, https://taiziii.com/wp-content/uploads/2023/08/スクリーンショット-2023-08-14-23.11.12-768x489.png 768w, https://taiziii.com/wp-content/uploads/2023/08/スクリーンショット-2023-08-14-23.11.12.png 1190w" sizes="auto, (max-width: 300px) 100vw, 300px" ><br />
2分探索木は、全てのノードは、そのノードの左部分木に含まれる数よりも大きくなければいけないという特徴があります。例えば、13はその左部分木に含まれる、7, 2, 8, 5よりも大きくなっています。また、全てのノードは、そのノードの右部分木に含まれる数よりも小さくなくてはいけません。例えば、7は8よりも小さくなっています。この2つの特徴から、2分探索木に格納されたデータの最小値は、決まって左部分木を辿った末路にあります。今回の場合は、2が最小値となります。<br />
それでは、2分探索木にデータを追加してみましょう。4を追加してみることにしましょう。まず、4と13を比べると、4の方が大きいので、左に一段下がります。次に、7と比べると、7の方が大きいので、左に一段下がります。そして、2と比べると4の方が大きいので、右に一段下がります。最後に5と比べると5の方が大きいので、4は5の左側の子ノードに位置することになります。</p>
<p><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-446 lazyload" data-src="https://taiziii.com/wp-content/uploads/2023/08/スクリーンショット-2023-08-14-23.12.10-300x254.png" alt="" width="300" height="254" data-srcset="https://taiziii.com/wp-content/uploads/2023/08/スクリーンショット-2023-08-14-23.12.10-300x254.png 300w, https://taiziii.com/wp-content/uploads/2023/08/スクリーンショット-2023-08-14-23.12.10-1024x868.png 1024w, https://taiziii.com/wp-content/uploads/2023/08/スクリーンショット-2023-08-14-23.12.10-768x651.png 768w, https://taiziii.com/wp-content/uploads/2023/08/スクリーンショット-2023-08-14-23.12.10.png 1078w" sizes="auto, (max-width: 300px) 100vw, 300px" ><br />
次に、2分探索木からデータを削除してみることにします。7を削除してみましょう。このとき、7の左部分木から最大ノードを見つけ、7の位置に移します。今回は、5を移します。5を移した後は、4を5の位置に移して完成です。</p>
<p><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-442 lazyload" data-src="https://taiziii.com/wp-content/uploads/2023/08/スクリーンショット-2023-08-14-23.06.20-300x150.png" alt="" width="300" height="150" data-srcset="https://taiziii.com/wp-content/uploads/2023/08/スクリーンショット-2023-08-14-23.06.20-300x150.png 300w, https://taiziii.com/wp-content/uploads/2023/08/スクリーンショット-2023-08-14-23.06.20-1024x513.png 1024w, https://taiziii.com/wp-content/uploads/2023/08/スクリーンショット-2023-08-14-23.06.20-768x385.png 768w, https://taiziii.com/wp-content/uploads/2023/08/スクリーンショット-2023-08-14-23.06.20.png 1202w" sizes="auto, (max-width: 300px) 100vw, 300px" ><br />
2分探索木では、前述した2つの特徴を持つため、データの探索を行う際には、現在いる場所のデータとの大小を比較するだけで右と左のどちらに進めばよいのかが簡単にわかるようになっています。なお、2分探索木では一つのノードが持つ子ノードの数は最大二つまでですが、この制約を3つ、4つ・・・と拡張した木構造のことをB木と呼びます。</p>
<h2>まとめ</h2>
<p>今回は、プログラムに関わる人なら絶対に知っておきたい重要な7つのデータ構造について紹介しました。データ構造について初めて学ぶ人にとっては少々難しく感じたかもしれませんが、本記事の内容を丁寧に追っていけば、必ず理解できると思います。根気強く頑張りましょう！</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
