ページ 11

BM法について

Posted: 2013年6月26日(水) 16:16
by hata88bou
C言語 ボイヤー・ムーア法について
私は、ネットなどを利用して、趣味でC言語の勉強をしているのですが、ボイヤー・ムーア法の項目で躓いてしまいました。
ランダムに単語をならべ、そこからある単語を検索して、文字を比べた回数(文字比較の回数)を表示したいと思っているのですが、意図しない回数が表示されてしまいます。さぐりさぐりな状態で、「そんなこともわからんのか」と言われてしまうかもしれませんが、アドバイスを頂けたら、と思います。

#include<stdio.h>

static char text[30]="is he your happy Monday night";
static char key[4]="your";

int shift(char a)
{
if (a==key[0]) return 3;
else if (a==key[1]) return 2;
else if (a==key[2]) return 1;
else return 4;
}

int main()
{
int i,j,k;

k=0;
i=3;
while (i<=29)
{
k=k+1;
if (text==key[3])
{
k=k+1;
if (text[i-1]==key[2])
{
k=k+1;
if (text[i-2]==key[1])
{
k=k+1;
if (text[i-3]==key[0])
{
printf("The word was found.\n");
i=i+30;
}
else j=shift(text[i-3]);
}
else j=shift(text[i-2]);
}
else j=shift(text[i-1]);
}
else j=shift(text);

i=i+j;
if(j<4)k=k+1;
}

printf(" %d times.\n", k);

return 0;
}

Re: BM法について

Posted: 2013年6月26日(水) 16:24
by hata88bou

コード:

で囲うというのが良く分からず、そのまま投稿してしまいました。申し訳ないです。

Re: BM法について

Posted: 2013年6月26日(水) 16:38
by box
まずは、使っている変数の意味を説明してみてください。
hata88bou さんが書きました:

コード:

static char key[4]="your";
1バイト足りないのではないでしょうか。key[5]ではありませんか?

あと、コード全体を見て感じることは、「そのtext[]とkey[]限定版ですか?」ということです。
本来、BM法というのは任意の長さの探索対象文字列とキー文字列に対して
適用できるはずだと思います。
hata88bou さんが書きました:

コード:

    i=3;
初期値が3である理由は何ですか?上に書いた「限定版ですか?」と関係ありますか?