2012-05-04 9 views
0

配列のバイナリ検索を実行しようとしています。すべてという文字列が出現する必要があります。私はbsearchで試しましたが、それをどうやって行うのか分かりません。いくつかのオカレンスのバイナリ検索を実行するにはどうすればよいですか?

/* data structures */ 

typedef struct { 
    char *name; 
    char *value; 
} acronym; 

struct { 
    acronym *tab; 
    size_t size; 
} acronymArray; 

/* code */ 

char buf[256]; 
fgets(buf, sizeof buf, stdin); 
for (size_t i = 0; i < acronymArray.size; ++i) 
     if (!strcmp(buf, acronymArray.tab[i].name)) 
      printf("Found: %s\n", acronymArray.tab[i].value); 

/* How to translate it with a binary search ? 
    Of course my array was sorted with qsort previously */ 

私はそれを試してみたが、それは1つの出現のためにのみ機能します。

if ((k = bsearch(k, acronymArray.tab, acronymArray.size, sizeof *acronymArray.tab, compare))) 
    printf("found : %s\n", k->value); 

私は私の構造にブール変数«頭字語»について考え、私はわからないんだけど... これは宿題ではありません。

ありがとうございます!

答えて

5

それは非常に簡単でなければなりません:あなたはバイナリ検索を持つ任意の発生を見つけ、その後、あなたが見つかった項目に等しくないで何かを見つけるまで見つけ発生から前後/見る(またはあなたが見つけるまで、シーケンス終了)。すべての出現はソートされたリスト内で連続していなければなりません。

+2

もし前方/後方を見ているパーツの線形実行時間を避けたいのであれば、2つのバージョンの異なるバイナリ検索ルーチンが必要になります - 最初の一致を見つけるためのものと最後のものを見つけるもう1つのもの'std :: lower_bound'と' std :: upper_bound'をC++で使います。両方とも対数時間で行うことができます。 –

+0

ありがとう、私はそれを試してみます。 – md5

+0

@ Steve:代わりに、指数関数的な検索を使用するだけです。 – Vlad

0

あなたのコードをすべて投稿するべきだと思います。文字列が格納される通常の方法は、ハッシュテーブルまたはバイナリツリーを使用する方法です。

関連する問題