データ構造とアルゴリズムの概要1

1共通のデータ構造

1.1一般的なデータ構造と手法

  • 配列、文字列
  • リンクリスト
  • スタック
  • キュー
  • Deque

(1)アレイとキャラクターベッドの長所と短所

利点:配列の作成は非常に簡単です。O(1)時間で配列の添え字に基づいて要素をクエリできます。

短所:構築中に連続スペースを割り当てる必要があります。要素が存在するかどうかを照会するときに配列全体をトラバースする必要があり、O(n)時間かかります。要素を削除および追加する場合も、O(n)時間かかります。

(2)リンクリスト

単一リンクリスト:リンクリストの各要素は実際には個別のオブジェクトであり、すべてのオブジェクトは各要素の参照フィールドによってリンクされます。
ここに画像の説明を挿入
二重リンクリスト:単一リンクリストとは異なり、二重リンクリストの各ノードには2つ含まれます。参照フィールド
ここに画像の説明を挿入

利点:メモリスペースを柔軟に割り当てる; O(1)時間で要素を削除または追加できる。
欠点:クエリ要素は
問題解決するためにO(n)時間を必要とする:高速および低速のポインターを使用する(場合によっては3つのポインターが必要)。リストヘッド。例:2つのソートされたリンクリストが統合され、ソートされます。リンクリストの奇数と偶数が元の順序で分離され、前半が奇数、後半が偶数のリンクリストが生成されます。
(3)スタック
機能:ラストインファーストアウト
アルゴリズムの基本的な考え方:使用可能単一リンクリストが実装されています。最後の操作のみが関係します。最後の操作が処理された後、前の操作はO(1)時間で見つかります
( 4)キューの
機能:ファーストイン、ファーストアウト
一般的なシナリオ:幅の最初の検索
(5)ダブルエンドキュー
基本的な実現:ダブルリンクリストを使用できます。キューの先頭と末尾でデータを表示、追加、削除できます。 O(1)時間で。
一般的なシナリオ:動的に変化するウィンドウまたは連続長を実現する間隔
(6)ツリーツリーの共通性
:直感的な構造。ツリーの問題を通じて再帰アルゴリズムをチェックして、再帰の習熟度習得します。
よくテストされるツリーの形状インタビューでは
、通常のバイナリツリー、
バランスの取れたバイナリツリー、
完全なバイナリツリー
、バイナリ検索ツリー、
クアッドツリー、
マルチツリー、
特殊ツリー:赤黒ツリー、自己バランスバイナリ検索ツリー
トラバーサル:事前注文トラバーサル;中間-注文トラバーサル;注文後トラバーサル

2高レベルのデータ構造

優先度付きキュー

プレフィックスツリー
ラインセグメントツリー
ツリー配列
(1)優先度付きキュー
と通常のキューの違い:毎回削除される要素がキュー内で最高の優先度であることを確認します。優先度レベルはカスタマイズできます。
最も一般的に使用されるシナリオ:from乱雑なデータ特定の順序(または優先度)に従ってデータをフィルター処理する
本質:完全なバイナリツリーを実現するために配列構造を使用する、バイナリヒープの構造。
ここに画像の説明を挿入
機能:
配列array [0]の最初の要素の優先度が最も高くなります。
添え字iが与えられた場合、要素array [i]の場合、親ノードに対応する要素インデックスは(i-1)/ 2、左側の子ノードに対応する要素インデックスは2 i + 1、対応する要素は右の子ノードへ添え字は21 + 2
です。配列内の各要素の優先度は、その両側の子ノードよりも高くする必要があります。
基本的な操作には、次の2つがあります
上向きにフィルタリング
下向きにフィルタリング
もう1つの最も重要な時間複雑さ:優先度付きキューの初期化
(2)グラフ
最も基本的な知識ポイントは次のとおりです。
順序、次数
ツリー、フォレスト、リング
、有向グラフ、無向グラフ、完全有向グラフ、完全無向グラフ、
接続グラフ、接続コンポーネント
グラフストレージ式:隣接行列、隣接リンクリスト
グラフアルゴリズムは多様です:
グラフトラバーサル:深さ優先、幅優先、
リング検出:有向グラフ、無向グラフ、
トポロジ順、
最短パスアルゴリズム、
接続グラフ関連アルゴリズム
グラフ彩色と巡回セールスマン問題
。習得する必要のある知識ポイント:
グラフの保存と表現:隣接行列、隣接リンクリスト
グラフトラバーサル:深さ優先、幅優先の
2分割グラフ検出、ツリー検出、リング検出:有向グラフ、無向グラフ、
トポロジカルソート、
共同検索アルゴリズム、
最短パス
(3)プレフィックスツリー、
辞書ツリーとも呼ばれます。
このデータ構造は辞書検索で広く使用されています。たとえば
、辞書検索とは
、辞書を構成する一連の文字列が与えられた場合です。 、辞書で「ABC」で始まるすべての文字列を見つける必要があります
方法1:Profiteering検索方法
方法2:プレフィックスツリー
最も基本的な操作:作成
方法:入力文字列を1回トラバースし、各文字列の文字をトラバースします、プレフィックスツリーのルートノードから開始して、ノードの子ラン文字セットに各文字を追加します。文字セットにすでにこの文字が含まれている場合は、スキップします。現在の文字が文字列の最後である場合は、現在のノードのisEndをtrueとしてマークします。
最も基本的な操作:検索
方法:プレフィックスツリーのルートノードから開始し、入力したプレフィックス文字を1つずつ一致させます。 、次のレベルに進みます。検索が見つからない場合は、すぐに
(4)線分ツリーに戻り
ます。n個の要素を含む配列array [0、...、n-1]があるとすると、頻繁に実行する必要があります。配列全体の2つのこと:
1。配列要素の値を更新します
2.配列の任意の間隔で要素の合計(または平均)を見つけます
方法1:配列を1回トラバースし、時間の複雑さO(n)
方法2 :線分ツリー、時間の複雑さO(logn)
ラインセグメントツリーとは:バイナリツリーの形式でデータを格納する構造。各ノードは、
配列内の特定のセグメントの合計を格納します。例:array [1,3,5,7,9,11]
ここに画像の説明を挿入
( 5)ツリー配列は
バイナリインデックスツリーも呼ばれ
ます。n個の要素を持つ配列array [0、...、n-1]があるとします。次に、配列全体に対して2つのことを頻繁に行う必要があり
ます。1。配列要素の値
2.配列の最初のk要素の合計(または平均)を求め
ます方法1:ラインセグメントツリー
時間の複雑さ:O(logn)
方法2:ツリー配列
時間の複雑さ:O(logn)
重要な基本機能
用途詳細を表現するデータフォークツリーの構造は、
優先キューにいくらか似ています。優先キューは、配列を使用して完全な二分木を表しますが、ツリー配列はポリツリー
です。ツリー配列の最初の要素は空のノードです。 。
ノードtree [y]がtree [x]の場合、の親ノード、y = x-(x&(-x))

おすすめ

転載: blog.csdn.net/wqs12345612/article/details/113954588