ブロック検索はとも呼ばれるインデックスシーケンシャルサーチ、あるシーケンシャルサーチ改良された方法を。
アルゴリズムのプロセス:
- 最初の選択した各ブロックの最大のキーを構成するインデックステーブルを、
- 最初のインデックステーブルの2つの部分求めるバイナリサーチ又はシーケンシャルサーチをするために、未知の起源記録決定にどれ次いで、によって決定されたブロックに、シーケンシャル方式見つけるために。
注:アイデアは、M(Mさ≤N)にN個のデータ要素「ブロック単位の順序」ブロックです。各ブロック内のノードは、注文する必要はなく、ブロック間の各ブロック内の最大の要素「ブロックで注文」しなければならないよりも小さいのすべての要素の一つの任意の値。
したがって、与えられた検索対象に鍵、ルックアップのキー値の位置を、それに行くインデックステーブルで利用シーケンシャルサーチ又はバイナリ検索見つけるためにキーブロックインデックス開始位置は、その後に応じて、開始ブロックインデックス位置し場所は、キーの検索特定の場所を。
ここではいくつかあるブロック探索上記のように、それを介していると考えられているコード、インデックステーブルキーの位置を見つけること。
まず与えるメインテーブルとインデックステーブルを:
1 // 主表、サイズ= 30 2 静的 INT [] mainList = 新しい INT [] { 3 101、102、103、104、105、0、0、0、0、0 、 4 201、202、203、204 、0、0、0、0、0、0 、 5 301、302、303、0、0、0、0、0、0、0 6 }。 7 8 // 索引表 9 静的 IndexItem [] indexItemList = 新しいIndexItem [] { 10 新しい IndexItem(1、0、5 )、 11 新しい IndexItem(2、10、4 )、 12 新IndexItem(3、20、3 ) 13 }。
インデックステーブルカテゴリ:
静的 クラスindexitem { 公共 int型の指標; 比較//インデックス値 パブリック INT スタート; //位置起動 パブリック int型の長さ; //ブロック要素の長さ(空でない) 公衆 indexitem(int型のインデックス、int型スタート、int型の長さ){ この。 =インデックスインデックス; この .start = スタート; この .LENGTH = 長さ; } // ...ゲッターとセッター }
インデックス検索アルゴリズム:
1 公共 静的 INT indexSearch(INT キー){ 2 indexItem =のindexitem NULL ; 3 。4 // インデックス付けルール 5 int型のインデックス=キー/ 100 ; 6 。7 // インデックステーブルトラバース 。8 のための(INT I = 0;私はindexItemListを<長さ、Iは++ ){ 9 // インデックスエントリを見つける 10を IF(indexItemList [I] == .INDEX インデックス){ 11 indexItem =のindexItemList [I]; 12で BREAK 、 13であります } 14 } 15 16 // インデックステーブル内のインデックスエントリが存在しないが 。17 IF(indexItemの== NULL ) 18は、 戻り -1 、 19 20 // 一次ルックアップテーブル内のインデックスエントリ 21である ため(INT I = indexItem.start ; I <indexItem.start + indexItem.length; I ++ ){ 22は、 IF(mainListは、[I] == キー) 23が リターン;私は 24 } 25 26である 戻り -1 ; 27 }
時間複雑度分析:プレスバイナリ検索キーを検索するインデックステーブルおおよその位置のを(コードシーケンシャルサーチを与えられる)、次いで一次表に可能なブロックの開始を見つけるために位置が、時間複雑度はO (log₂(M)+ N / m)のテーブル要素の数は、mは、サブブロックの数であり、N基づき、N / Mは、各ブロック内の要素の数です。
ブロックサーチ挿入アルゴリズム:
1 /** 2 * 插入数据 3 * 4 * @param key 要插入的值 5 * @return true表示插入成功,false表示插入失败 6 */ 7 public static boolean insert(int key) { 8 IndexItem item = null; 9 10 // 建立索引规则 11 int index = key / 100; 12 int i = 0; 13 // 遍历索引表,找到对应的索引项 14 for (i = 0; i < indexItemList.length; i++) { 15 if (indexItemList[i].index == index) { 16 item = indexItemList[i]; 17 break; 18 } 19 } 20 // 索引表中不存在该索引项 21 if (item == null) { 22 return false; 23 } 24 25 // 根据索引项将值插入到主表中 26 mainList[item.start + item.length] = key; 27 // 更新索引表 28 indexItemList[i].length++; 29 30 return true; 31 }
打印主表的函数:
1 /** 2 * 遍历打印 3 */ 4 public static void display(int[] list) { 5 System.out.println("******** 展示开始 ********"); 6 if (list != null && list.length > 0) { 7 for (int i = 0; i < list.length; i++) { 8 System.out.print(list[i] + " "); 9 if ((i + 1) % 10 == 0) { 10 System.out.println(""); 11 } 12 } 13 } 14 System.out.println("******** 展示结束 ********"); 15 }
测试代码:
1 public static void main(String[] args) { 2 System.out.println("******** 索引查找 ********"); 3 System.out.println(""); 4 System.out.println("原始数据:"); 5 display(mainList); 6 System.out.println(""); 7 8 //分块查找 9 int key = 203; 10 System.out.println("元素" + key + "列表中的位置为:" + indexSearch(key) + "\n"); 11 12 //按规则插入数据并查找 13 int value = 106; 14 System.out.println("插入数据:" + value); 15 16 // 插入成功,查找插入位置 17 if (insert(value)) { 18 System.out.println("插入后的主表:"); 19 display(mainList); 20 System.out.println(""); 21 22 System.out.println("元素" + value + "在列表中的位置为:" + indexSearch(value)); 23 } 24 }