プログラマが理解すべき検索(java実装)
3358 ワード
先週はランキングについていくつかのブログを書いて、たくさんの道友の支持を得て、ここでとても感謝しています.
ソートを比較すると、今日の検索は簡単ですが、今日はまず次のようにします.
1、シーケンシャル検索
2、半角検索
一、順序検索の基本思想:
テーブルの端から順番にテーブルをスキャンし、スキャンしたノードキーと所定の値(aと仮定)を順番に比較し、現在のノードキーがaと等しい場合は検索に成功し、スキャンが終了してもキーワードがaと等しいノードが見つからない場合は検索に失敗する.
はっきり言って、最初から最後まで、一つ一つ比べて、同じものを探して成功して、見つからないと失敗します.明らかな欠点は、検索効率が低いことです.
リニア・テーブルのシーケンス・ストレージ構造とチェーン・ストレージ構造に適しています.
検索平均の長さを計算します.
例えば上の表では、1を検索するには1回、2を検索するには2回、順に下に押すと、16を検索するには16回、
これらの検索回数を合計するだけで(中学校では、底に高さを乗じて2で割る)、次いで結点数で割ると平均検索長であることがわかります.
n=ノード数を設定
平均ルックアップ長=(n+1)/2
Javaで実現:
二、二分法検索(折半検索)の基本思想:
前提:
(1)この区間の中点位置を決定する:mid=(low+high)/2
minは区間の中間の接点の位置を表し、lowは区間の最も左の接点の位置を表し、highは区間の最も右の接点の位置を表す
(2)検索対象のa値をノードmidのキーワード(以下R[mid].key)と比較し、等しい場合は検索に成功し、そうでない場合は新しい検索区間を決定する.
R[mid].key>aは、表の秩序性から分かる、R[mid].keyの右側の値はいずれもaより大きいので、aに等しいキーワードが存在する場合、必ずR[mid]になる.keyの左の表にあります.このときhigh=mid-1
R[mid].key
R[mid].key=aの場合、検索に成功します.
(3)次のルックアップ新しいルックアップ区間について、手順(1)と(2)を繰り返す
(4)検索中にlowが徐々に増加し,highが徐々に減少し,low>highであれば検索に失敗する.
平均ルックアップ長=Log 2(n+1)-1
注意:二分法は効率的ですが、テーブルをキーワードでソートします.ソート自体は時間のかかる演算であるため,二分法は順序記憶構造に適している.テーブルの秩序性を維持するには、シーケンス構造で多くのノードを挿入および削除する必要があります.したがって、二分ルックアップは、確立されると変更が少なく、常にルックアップが必要な線形テーブルに特に適している.
だから、折半で検索するときはシーケンスが秩序正しくなければなりません.
Javaで実現:
ソートを比較すると、今日の検索は簡単ですが、今日はまず次のようにします.
1、シーケンシャル検索
2、半角検索
一、順序検索の基本思想:
テーブルの端から順番にテーブルをスキャンし、スキャンしたノードキーと所定の値(aと仮定)を順番に比較し、現在のノードキーがaと等しい場合は検索に成功し、スキャンが終了してもキーワードがaと等しいノードが見つからない場合は検索に失敗する.
はっきり言って、最初から最後まで、一つ一つ比べて、同じものを探して成功して、見つからないと失敗します.明らかな欠点は、検索効率が低いことです.
リニア・テーブルのシーケンス・ストレージ構造とチェーン・ストレージ構造に適しています.
検索平均の長さを計算します.
例えば上の表では、1を検索するには1回、2を検索するには2回、順に下に押すと、16を検索するには16回、
これらの検索回数を合計するだけで(中学校では、底に高さを乗じて2で割る)、次いで結点数で割ると平均検索長であることがわかります.
n=ノード数を設定
平均ルックアップ長=(n+1)/2
Javaで実現:
import java.util.Scanner;
public class SequentialSearch {
int a[]={49,38,65,97,76,13,27,49,78,34,12,64,5,4,62,99,98,54,56,17,18,23,34,15,35,25,53,51};
public SequentialSearch(){
System.out.println(" :");
Scanner input=new Scanner(System.in);
int input1=input.nextInt();
for(int i=0;i
二、二分法検索(折半検索)の基本思想:
前提:
(1)この区間の中点位置を決定する:mid=(low+high)/2
minは区間の中間の接点の位置を表し、lowは区間の最も左の接点の位置を表し、highは区間の最も右の接点の位置を表す
(2)検索対象のa値をノードmidのキーワード(以下R[mid].key)と比較し、等しい場合は検索に成功し、そうでない場合は新しい検索区間を決定する.
R[mid].key>aは、表の秩序性から分かる、R[mid].keyの右側の値はいずれもaより大きいので、aに等しいキーワードが存在する場合、必ずR[mid]になる.keyの左の表にあります.このときhigh=mid-1
R[mid].key
R[mid].key=aの場合、検索に成功します.
(3)次のルックアップ新しいルックアップ区間について、手順(1)と(2)を繰り返す
(4)検索中にlowが徐々に増加し,highが徐々に減少し,low>highであれば検索に失敗する.
平均ルックアップ長=Log 2(n+1)-1
注意:二分法は効率的ですが、テーブルをキーワードでソートします.ソート自体は時間のかかる演算であるため,二分法は順序記憶構造に適している.テーブルの秩序性を維持するには、シーケンス構造で多くのノードを挿入および削除する必要があります.したがって、二分ルックアップは、確立されると変更が少なく、常にルックアップが必要な線形テーブルに特に適している.
だから、折半で検索するときはシーケンスが秩序正しくなければなりません.
Javaで実現:
import java.util.ArrayList;
import java.util.List;
public class binarySearch {
public binarySearch(){
List list=new ArrayList();
for(int i=0;i<10000;i+=2){ // list 1-10000 , , , !
list.add(i); //
}
int low=0;
int high=list.size();
int key=3334;
while(low<=high){
int mid=(low+high)/2;
if(key==list.get(mid)){
System.out.println(" list :"+mid);
break;
}
if(key>list.get(mid)){
low=mid+1; // , low ,high
}
if(keyhigh){
System.out.println(" !");
}
}
}
, java , , :
http://blog.csdn.net/shan9liang/article/details/7555811
《 》, 。