検索 - 線形テーブル検索 - ブロック検索

チャンクで検索

インデックス順次検索とも呼ばれるブロッキング検索は、順次検索とバイナリ検索の中間のパフォーマンスを示す検索方法です。この検索方法では、テーブルそのものに加えて「インデックステーブル」を構築する必要があります。
特徴: データはブロックに格納され、ブロック内で無秩序に配置され、ブロック間で順序付けされます。

ここに画像の説明を挿入します

アルゴリズム的思考

処理の計算:
① 検索対象のレコードがインデックステーブル内でどのブロックに属するかを決定する(シーケンシャルでもハーフフォールドでも可) ② ブロック内をシーケンシャルに
検索

ケース 1 - 正常に検索 (シーケンス)

ルックアップ テーブルで、key=22 を検索するプロセスは、
ここに画像の説明を挿入します
最初のインデックス テーブル 10<22、次のブロックの検索を続けます、
インデックス テーブル 20<22、次のブロックの検索を続けます、
インデックス テーブル 30>=22 , 22 が存在する場合 存在する場合、インデックス テーブル 30 が指すブロック内で、
ここに画像の説明を挿入します
インデックス テーブル 30 のブロックの開始位置と配列添字 6 の位置から順次検索が開始されます
。 List[6] が満たされない場合は続行します。次のビットを検索します。 ,
List[7] = キー、検索は成功しました。

ケース 2 - ルックアップが失敗した (順次)

ルックアップ テーブルで、key=29 を検索するプロセスは、
ここに画像の説明を挿入します
最初のインデックス テーブル 10<29、次のブロックの検索を続けます、
インデックス テーブル 20<29、次のブロックの検索を続けます、
インデックス テーブル 30>=29 , 29 が存在する場合 存在する場合、インデックス テーブル 30 が指すブロック内で、
ここに画像の説明を挿入します
インデックス テーブル 30 のブロックの開始位置と配列添字 6 の位置から順次検索が開始されます。
List[6] が満たされない場合は、続行します。次のビットを検索します。 、
List[7] が満たされない、次の桁の検索を続行します、
List[8] が満たされていない、次の桁の検索を続行します、
List[9] 、ブロック範囲を超えています、そして検索は失敗します。

ケース 3 - 検索成功 (半額)

半分を使用してインデックスを検索し、キー = 30 のレコードを見つけます:
ここに画像の説明を挿入します
半分を使用してインデックスを検索します、mid=(low+high)/2;
①mid=2、key=maxValue; key=30、ブロック内になければなりません。
②インデックステーブル30から、このブロックの開始位置、配列添字6の位置から順次検索を開始します。
③List[8] = 30、検索は成功します。

ケース 4 - 成功した検索 (半分)

半分を使用してインデックスを検索し、キー = 19 のレコードを検索します:
半分を使用してインデックスを検索します、mid=(低+高)/2;
ここに画像の説明を挿入します
① 中=2、キー=19<30、高 = 中 -1=1 ;
ここに画像の説明を挿入します
② mid= 0, key=19>10, low=mid+1=1;
ここに画像の説明を挿入します
③ mid =1, key=19<20, high=mid-1=0; ④ low>high
ここに画像の説明を挿入します
になったとき、指したブロック内でto by low でレコードを検索します。⑤インデックステーブルのブロック20の開始位置、配列添字2の位置から順に検索し、③List[4]=19で検索成功です。

ケース 5 - 検索失敗 (半分)

半分を使用してインデックスを検索し、キー = 54 のレコードを検索します:
半分を使用してインデックスを検索します、mid=(low+high)/2;
① Mid=2、key=54>30、low=mid+1=3 ; ②
mid= 3, key=54>40, low=mid+1=4;
③ mid=4, key=54>50, low=mid+1=5;
ここに画像の説明を挿入します
low>high の範囲を超えているインデックステーブル、検索は失敗します

アルゴリズムの実装

typedef int ElemType;
//索引表
typedef struct{
    
    
    ElemType maxValue;
    int low;
    int hiht;
}Index;
//顺序存储实际元素
ElemType List[100];

ブロック検索効率解析 (ASL)

アルゴリズム概念の説明: Case 1 と Case 2 は逐次検索インデックス テーブルを使用します
アルゴリズム概念の説明: Case 3、Case 4 および Case 5 は半検索インデックス テーブルを使用します。

ここに画像の説明を挿入します

ASL = インデックステーブルの平均検索長 + ブロック検索の平均検索長

ここに画像の説明を挿入します
長さ n のルックアップ テーブルが b 個のブロックに均等に分割され、各ブロックには s 個の要素があるとします。
インデックス検索とブロック内検索の平均検索長をそれぞれL 1と L sとすると、ブロック検索の平均検索長は
ASL=L 1 +L sとなります。

逐次検索インデックステーブル

インデックス テーブルを順番に検索し、
L 1 = 1 + 2 + . . . + bb \frac{1+2+...+b}{b}b1 + 2 + ... + b= b + 1 2 \frac{b+1}{2}2b + 1
L s = 1 + 2 + 。+ ss \frac{1+2+...+s}{s}s1 + 2 + ... + s= s + 1 2 \frac{s+1}{2}2s + 1
ASL = b + 1 2 \frac{b+1}{2}2b + 1+ s + 1 2 \frac{s+1}{2}2s + 1= s 2 + 2 s + n 2 s \frac{s^2+2s+n}{2s}2s2 +2s+ns= n \sqrt nの場合n ASL min = n \sqrt nの場合n +1

半分の検索インデックス テーブル

半分の検索インデックス テーブルを使用し、
ASL min =⌈log 2 (b+1)⌉+ s + 1 2 \frac{s+1}{2}2s + 1
ASL最小値≈log 2ns \frac{n}{s}s+1)+ s 2 \frac{s}{2}2s

ブロック検索の利点:

  • 多くの移動を行わなくても、挿入と削除が簡単になります。
    テーブル内のデータ要素を挿入および削除する場合、その要素に対応するブロックが見つかっていれば、そのブロック内で挿入および削除操作を実行できます。

ブロック検索の欠点:

  • インデックス テーブルの記憶領域を増やし、初期インデックス テーブルに対してソート操作を実行します。

間違いを犯しやすい

インデックステーブルに対して二分検索を実行する場合、インデックステーブルに目的のキーワードが含まれていない場合、最終的に二分検索は low>high で停止し、low が指すブロックで検索が実行されます。

おすすめ

転載: blog.csdn.net/QQ657205470/article/details/127414396