1.5 検索

1.5 検索

検索は重要な操作であり、検索とも呼ばれます。検索対象は、線形テーブル、ツリー構造、さらにはファイル構造です。

主な検索方法としては、逐次検索、半検索、木構造による検索、つまりハッシュ法があります。

1.5.1 検索の基本概念

キーは、データ要素を識別するデータ要素内のデータ項目の値です。データ要素を一意に表現できるキーワードをキーワードと呼び、複数のデータ要素を識別するために使用されるキーワードを二次キーワードと呼びます。つまり、任意の value 値について、主キーが value であるレコードはルックアップ テーブル内に 1 つだけ存在できますが、2 次キーが value であるレコードには複数のレコードが存在する可能性があります。

指定された値キーに従って、ルックアップ テーブル内のキーワード Ki=key のレコードを見つけるプロセスは検索と呼ばれ、検索とも呼ばれます。このようなレコードがルックアップ テーブルに存在する場合、ルックアップは成功したと言われますが、そうでない場合、つまり、キーワードが key であるレコードがルックアップ テーブルに存在しない場合、ルックアップは失敗したと言われます。キーはルックアップターゲットと呼ばれます。

検索プロセス中にキーワードを比較する回数を検索長と呼びます。検索アルゴリズムの効率は、検索が成功した場合の平均検索長 (ASL) と検索が成功しなかった場合の検索長を使用して測定されます。

1.5.2 逐次検索方式

ルックアップ テーブル内のキーワードの順序が間違っている場合は、順次ルックアップ方法を使用できます。

逐次検索の戦略は非常にシンプルで、K0 から順に検索対象とキーワードを比較し、一致していれば検索成功、一致していなければ次のキーワードを比較し続けます。ルックアップ テーブル内のすべてのキーワードがルックアップ ターゲットと比較され、等しくない場合、ルックアップは失敗し、ルックアップ プロセスは終了します。

n 個の要素を持つルックアップ テーブルでは、ルックアップが失敗した場合のルックアップの長さは n です。ルックアップが成功したときのルックアップの長さは、ルックアップ テーブル内のルックアップ ターゲットの位置によって異なります。検索対象がルックアップテーブルの最初の位置にある場合は、順番に比較して検索対象を見つけることができ、検索長は 1 です。検索対象がルックアップテーブルの最後の位置にある場合、ターゲットは順に比較して見つかり、検索長は 1; ルックアップ テーブルの最後の位置にある場合、ターゲットを見つけるために n 回比較する必要があり、検索ターゲットは n; 平均検索長は (n +1)/2。

順次検索方式のルックアップ テーブルは、配列またはリンク リストのいずれかになります。ファイルさえも。ルックアップ テーブル内の各レコードのキーは順序どおりである必要はありません。

1.5.3 途中探索方法

非順序ルックアップテーブルの検索効率は高くなく、等効率検索の場合、平均検索長は(n+1)/2となる。

ルックアップ テーブルが順序付けされている場合、ハーフウェイ ルックアップ方法を使用してルックアップ効率を効果的に向上させることができます。

二分探索法は二分探索法とも呼ばれ、ルックアップテーブルの順序を利用し、「分割統治」戦略を採用してまず検索対象の範囲を決定し、その後の比較のたびに大まかな範囲を絞り込むことができます。検索対象が見つかるまで、または検索対象の範囲が空になるまで検索テーブルを作成します。

A[mid]と検索対象の比較は以下の場合に分けられます。

  • A[mid]=key、検索は成功します。

  • A[mid]>key、high=mid、検索範囲内で検索を続けます。

  • A[mid]<key, low=mid+1、検索範囲内で検索を続けます。

    low>highの場合、検索範囲が空、チェックする要素がない、検索テーブルに検索対象がないため、検索は失敗します。

    最初の検索: mid=(8+0)/2=4、a[4] を確認します。

    2 番目の検索:mid=(0+3)/2=1、a[1] を確認します。

    3 番目の検索:mid=(2+3)/2=2、a[2] を確認、キーを見つける

    二分探索プロセス中、キーワード比較シーケンスは、実際には、ルートからリーフ ノードまでのパス上のキーワード シーケンスの一部です。

    中間位置を求める際に四捨五入が発生する場合がありますが、このとき切り上げまたは切り捨てが可能です。一度決定したら、検索全体を通じて一貫性を持たせる必要があります。例 1-2 で、mid=[(low+high)/2] の場合、対応する決定木は図 1-28 に示されています。

1.5.4 ブロック検索方法

ブロック ルックアップでは、大きなルックアップ テーブルをいくつかのブロックに分割する必要があり、各ブロック内の値の順序はバラバラですが、ブロックは順序どおり、つまり全体的な順序が揃っていなければなりません。

任意の i について、i 番目のブロック内のすべてのキーワードは、i+1 番目のブロック内の既存のキー値よりも小さく、さらにインデックス テーブルを確立する必要があり、各ブロック内の最大のキーが使用されますインデックステーブルのキー値としてブロック順に1次元配列に格納され、配列はキー値順に並べられます。

検索するときは、まずインデックス テーブル内を検索して、検索するキーが存在するブロックを特定します。次に、対応するブロック内を検索します。

インデックス テーブルは追加の記憶領域を占有し、インデックス テーブルの検索によってシステムのオーバーヘッドも一定量増加しますが、ルックアップ テーブルがブロックに分割されているため、ブロック内で検索する場合は検索範囲が減少し、シーケンシャル テーブルと比較して検索範囲が減少します。検索方法、効率が向上しました。

1.5.5 B-treeマシンの基本動作、B+ツリーの基本概念

1. Bツリーの基本的な考え方

1970 年に、Bayer らは、B ツリーと呼ばれる多方向バランス検索ツリーを提案しました。次のように定義されます。

M 次 B ツリーは空であるか、次の特性を満たす M 分ツリーです。

  1. ツリー内の各ノードには最大 m 個のサブツリーがあります
  2. ルートノードには少なくとも 2 つのサブツリーがあります
  3. ルート ノードを除き、各ノードには少なくとも [m/2] 個のサブツリーがあります
  4. すべてのリーフ ノードは同じレイヤーに表示されます。
  5. すべてのノードには、次の形式のデータが含まれています: (n,A0,K1,A1,K2,A2,…,Kn,An)

このうち、nはキーワードの数、Ki(i=1,...,n)はキーワードであり、K1<K2<...<Knを満たす。Ai(i=0,1,...,n) はサブツリーのルート ノードへのポインタであり、i=1,2,...,n-1 の場合、サブツリー上の各ノードのすべてのキーワードが指します。 Ai による to は、K より大きいですが、Ki+1 より小さいです。A0 が指すサブツリー内の各ノードのすべてのキーは K1 より小さく、An が指すサブツリー内の各ノードのすべてのキーは Kn より大きくなります。同じノードでは、すべてのポインター Ai は空です。n 個のキーを持つ非リーフ ノードの場合、n+1 個のサブツリーが存在します。

図 1-29 に示すように、これは 5 次 (m=5) の B ツリーです。

m=3 の場合、各ノードには最大 2 つのキーワードと 3 つのポインタ、少なくとも 1 つのキーワードと 2 つのポインタが含まれるため、3 次 B ツリーは 2-3 ツリーとも呼ばれます。

1.5.6 ハッシュテーブル

順次検索、ブロック検索、ハーフ検索、ツリー構造での検索などはすべてキーワードベースの「比較」操作です。ハッシュ検索は、「比較」操作に依存しない検索方法です。ハッシュ化により、キー値とその保存場所との関係が確立され、レコードへのアクセスはキー値に基づいて行われます。つまり、データ要素を含むストアドプロシージャによって、データ要素の検索手順も実現できる。キー値とその格納場所(ハッシュアドレスと呼ばれる)の関係はハッシュ関数(またはハッシュ関数)によって与えられ、レコードを保持する参照テーブルはハッシュテーブル(ハッシュテーブル)とも呼ばれます。ハッシュ関数を用いたハッシュテーブルの検索方法をハッシュ法(またはハッシュ法)といいます。

1. ハッシュ関数

ハッシュ関数は、キーワードをハッシュ アドレスにマッピングするマッピング関係であり、addr=H(key) のように表現されます。ここで、addr はハッシュ テーブル内の要素キーのハッシュ アドレスです。ハッシュ関数の複雑さに影響する要因には、ハッシュ関数の計算に必要な時間、キーの長さ、ハッシュ テーブルのサイズ、キーの分布、レコードの検索頻度などがあります。2 つのキーワードが同じハッシュ アドレスにマッピングされている場合、それは「衝突」と呼ばれます。各キーをハッシュ テーブル内の固有の位置にマップするハッシュ関数は、完全ハッシュ関数と呼ばれます。完全なハッシュ関数では衝突は発生しません。その場合、テーブル内のすべての要素のアクセス時間は一定です O(1) です。

ほとんどの場合、完璧なハッシュ関数は見つからない可能性があります。私たちの目標は、要素を合理的にハッシュしてテーブルに組み込み、衝突を可能な限り回避できる適切なハッシュ関数を見つけることです。優れたハッシュ関数でも、ハッシュ テーブルへのアクセス時間は一定の順序 (O(1)) になります。

特定のデータセットに対して、ハッシュ関数を設計する方法は数多くあります。

1) 剰余メソッドのハッシュ関数は次のとおりです: H(key)=key mod P、ここで p は特定の正の整数です。この関数の結果は 0 から p-1 までです。一般に、p はテーブルの長さを超えない最大の素数をとります。

2) 折り方

フォールディング法では、キーワードをいくつかのセグメントに分割し、それらを結合またはフォールディングしてハッシュ アドレスを取得します。まず、キーワードは複数のサブセクションに分割され、各サブセクションは添え字と同じ長さで、最後の端はわずかに短くなる可能性があります。セグメントを折り畳む方法はさまざまに変えることができます。

シフト フォールディング法では、これらのサブセクションが合計されてハッシュ アドレスが取得されます。

境界の折り方にも多くのバリエーションがあります。ただし、一般に、キーワードのサブセクションは反転されてから追加されます。

折り畳み方法の他の変形では、異なるアルゴリズムを使用してキーのどの部分を反転するかを決定します。

折り畳み方法は、文字列型のキーでハッシュ関数を構築するときにも使用できます。たとえば、文字列を必要な添え字と同じ長さ (バイト単位) の複数の部分文字列に分割し、XOR 関数を使用して複数の部分文字列を結合します。このメソッドは文字列を値に変換することもできるため、変換後に他のメソッド (トリガー メソッドなど) を文字列型に使用することもできます。

3) 正方形中心法

ミッドスクエア法では、キーワードをそれ自体で乗算し、抽出法を使用して二乗結果から対応するビットを抽出してハッシュ アドレスを取得します。

4) 塩基換算方法

基数変換メソッドでは、キーワードは別の数値基数に変換されます。

5) デジタル解析手法

デジタル解析方式(デジット解析方式)は、キーワード内の指定ビットを抽出し、ハッシュアドレスを取得する処理を起動します。

6) 長さ依存方式 長さ
依存方式(長さ依存方式)では、キーワードとキーワードの長さが何らかの方法で組み合わされるか、直接ハッシュ アドレスとして使用され、あるいは他の方式のハッシュ アドレスによってさらに処理されます。

文字列内の各文字をバイナリ形式で処理することにより、文字列型に対して長さに依存する方法も使用できます。

2. 競合の解決

特定のデータセットに対して完全なハッシュ関数が見つかった場合は、複数の要素またはキーワードがハッシュ テーブル内の同じ位置にマッピングされる、いわゆる競合の問題を考慮する必要はありません。完全なハッシュ関数が見つからない場合、またはハッシュ関数を見つけることが非現実的である場合 (たとえば、時間オーバーヘッドが大きすぎる場合)、合理的なハッシュ関数が使用され、競合解決メカニズムが追加されます。

競合を処理するにはいくつかの方法があります。

1) 連鎖メソッド

競合を処理するための連鎖方式では、ハッシュ テーブルを個々のユニットのテーブルではなくセットのテーブルとして扱います。ハッシュ テーブルの各ユニットは、そのアドレスにマップされたすべてのキーで構成されるテーブルへのポインタを保持します。
この方法を使用すると、最悪の場合、ハッシュ関数は要素をテーブルにうまくハッシュ化できないため、n 個の要素のリンク リスト、または約 n/k 個の要素の複数のリンク リストが作成されます。ここで、k は相対的な小さな定数値。この場合、ハッシュテーブルの挿入と検索はO(n)となる。

2) オープンアドレス方式

オープン アドレス指定方法は、要素の元のハッシュ位置とは異なるテーブル内の別のオープン位置を探すことによって競合を処理します。新しいアドレス計算式は次のとおりです。

Hi=(H(key)+di)mod mi = 1,2,'''''',k(k≤m-1) このうち、H(key) はハッシュ関数、m はハッシュ関数の長さです。ハッシュ テーブル、di はインクリメントのシーケンスです。

di=1, 2, 3,..., m-1 の場合、これは線形プローブおよびハッシュ法 (線形プローブ) と呼ばれ、線形プローブとも呼ばれます。

di=1²、-1²、2²、-2²、3²、...、±K² (k≤m/2) の場合、これは二次プローブと呼ばれ、二次プローブとも呼ばれます。

擬似乱数シーケンスがインクリメンタルシーケンス di として使用される場合、それは擬似乱数再ハッシュ法と呼ばれ、擬似乱数検出とも呼ばれます。

線形探索方法の利点は、再探索シーケンスが競合が発生する位置 (基本位置) に到達する前に、テーブル内のすべての位置を新しいレコードを挿入する候補位置として使用できることですが、その再探索によって問題が発生する可能性があることです。後続のレコードで競合が発生します。要素の怒りを集めるこの傾向は、要素の集まりと呼ばれます。

充填係数 a を使用して、ハッシュ テーブルの充足度を表します。

a = テーブルに入力されたレコードの数 / ハッシュ テーブルの長さ

1.5.7 文字列パターンマッチング

文字列はプログラムで最も頻繁に処理されるデータ型の 1 つであり、文字列は略して文字列とも呼ばれます。文字列は 0 個以上の文字列の順序付けられたシーケンスであり、通常は S='a0a1…an-1'(n≥0) として記録されます。

照合プロセス中に、Tj と p が等しくない場合は、次のようになります。

  • i>0 の場合、次の比較におけるパターン文字列 P の比較開始位置は Pnext(i) になります。つまり、パターン文字列 P は i-next[i] 位置だけ右に移動し、そのポインタは Pnext(i) になります。ターゲット文字列 T はバックトラックせず、前のパスで一致しなかった文字を引き続き指します。

  • i=0 の場合、ターゲット文字列 T ポインタは 1 つ右に移動し、パターン文字列 P ポインタは P0 に戻り、次の一致比較の実行を続けます。

  • next[i]=0 の場合、p 内のどの文字も Tj と比較する必要はありませんが、P を i+1 位置だけ右にシフトし、次の比較を P0 と tj+1 から実行する必要があります。

    モジュラス文字列「abaabcac」の次の関数値を表 1-6 に示します。

    表 1-6 モジュール文字列「abaabcac」の次の値

位置 01234567
モジュール文字列 アババク
次の値 -10011201

1.5.8 検索アルゴリズムの解析と応用

時間計算量と検索アルゴリズムの適用は、図 1-7 に示すように簡単に要約できます。

表 1-7 検索アルゴリズムの計算量

アルゴリズム 営業時間 述べる
順次検索 の上) 配列とリンク リストに適用でき、キーワードは順序付けされていない可能性があります
半分で探す O(log2n) 配列に適用され、キーは順序付けされます
ハッシュ検索 ○(1) ハッシュアドレス計算、要素検索(定数)

おすすめ

転載: blog.csdn.net/weixin_53073551/article/details/131113569