すべてのプログラマーが知っておくべき 3 つの高度なデータ構造

すべてのプログラマーが知っておくべき 3 つの高度なデータ構造

プログラマーとしてデータ構造を使用することは非常に一般的であるため、バイナリ ツリー、スタック、キューなどの基本的なデータ構造に習熟していることが成功に不可欠です。しかし、スキルを向上させて他の人と差をつけたい場合は、高度なデータ構造にも慣れる必要があります。

高度なデータ構造は、データ サイエンスの不可欠な要素であり、非効率的な管理を解消し、大量のデータ セットのストレージを提供するのに役立ちます。ソフトウェア エンジニアとデータ サイエンティストは、常に高度なデータ構造を利用してアルゴリズムとソフトウェアを設計しています。

すべてのエキスパート プログラマが知っておくべき高度なデータ構造について説明します。

1.フィボナッチヒープ

すでにデータ構造の学習に時間を費やしている場合は、バイナリ ヒープに精通している必要があります。フィボナッチ ヒープはかなり似ており、min-heapまたはmax-heapプロパティに従います。フィボナッチ ヒープは、最小値ノードまたは最大値ノードが常にルートにあるツリーのコレクションと考えることができます。

フィボナッチヒープ
画像著作権:ウィキメディア

ヒープは、ノードnが少なくともF(n+2)個のノードを持つように、フィボナッチ プロパティも満たします。フィボナッチ ヒープ内では、各ノードのルートは、通常、二重にリンクされた循環リストを介してリンクされます。これにより、ノードの削除と 2 つのリストの連結がわずか O(1) 時間で可能になります。

フィボナッチ ヒープは、バイナリ ヒープや 2 項ヒープよりもはるかに柔軟であるため、幅広いアプリケーションで役立ちます。これらは、アルゴリズムの実行時間を大幅に改善するために、ダイクストラのアルゴリズムで優先キューとして一般的に使用されます。

2. AVL ツリー

avlの木
画像著作権:ウィキメディア

AVL (Adelson-Velsky and Landis) ツリーは、コンピューター サイエンスにおけるさまざまな種類のツリーの 1 つです。それらは本質的に自己均衡二分探索木です。標準二分探索木は、特定のエッジ ケースで歪む可能性があり、最悪の場合の時間計算量が O(n) になるため、実際のアプリケーションでは非効率になります。自己均衡ツリーは、バランス プロパティに違反すると、自動的に構造を変更します。

AVL ツリーでは、各ノードには、バランス ファクターを含む追加の属性が含まれます。バランス係数は、そのノードで右のサブツリーから左のサブツリーの高さを引いて得られる値です。AVL ツリーのセルフバランス プロパティでは、バランス係数が常に -1、0、または 1 である必要があります。

自己バランス プロパティ (バランス ファクター) に違反すると、AVL ツリーはそのノードを回転させてバランス ファクターを維持します。AVL ツリーは、右回転、左回転、左右回転、および左右回転の 4 つの主な回転を使用します。

AVL ツリーの自己均衡特性により、最悪の場合の時間の複雑さがわずか O(log n) に改善されます。これは、バイナリ サーチ ツリーのパフォーマンスと比較して大幅に効率的です。

AVL ツリーはバランス係数を介して維持されるため、高さを考慮してノードの最小数を計算できます。再帰関係は N(h) = N(h-1) + N(h-2) + 1 になり、AVL ツリーには少なくとも 3 つのノードが必要です (n > 2)。再帰関係の基本ケースは、それぞれ N(0) = 1 と N(1) = 2 です。

3. 赤黒木

赤黒い木
画像著作権:ウィキメディア

赤黒木は、自己平衡プロパティとして余分なビットを使用する、別の自己平衡二分探索木です。ビットは通常、赤または黒と呼ばれるため、赤黒ツリーと呼ばれます。

Red-Black の各ノードは赤か黒ですが、ルート ノードは常に黒でなければなりません。赤のノードが 2 つ隣接することはできず、すべての葉ノードは黒でなければなりません。これらのルールは、ツリーの自己均衡特性を維持します。

二分探索木とは対照的に、赤黒木の効率は約 O(log n) であり、はるかに効率的です。ただし、AVL ツリーは、決定的な自己バランス プロパティにより、はるかにバランスが取れています。

データ構造を改善する

高度なデータ構造を知ることは、就職の面接で大きな違いを生む可能性があり、競合他社との差別化要因になる可能性があります。調べる必要があるその他の高度なデータ構造には、n-Tree、Graph、および Disjoint Sets が含まれます。

特定のシナリオに理想的なデータ構造を特定することは、優れたプログラマーの優れた点の 1 つです。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です