ページ 11

簡略BM法について

Posted: 2008年7月30日(水) 02:18
by nayo
今日はゲームについてではなく課題について質問させていただきます

現在,各文字列探査法の速度を様々な場合について調べ,考察しないといけないのですが
簡略BM法の部分にて発生する文字の種類を4種類程度にした場合
作成したスキップテーブルの値をパターンのカーソルに足すと元の場所に戻り(?)
while文内を無限ループしてしまう状態です

どのようにすれば回避できるでしょうか
分かりにくい説明で申し訳ないです

どなたか助言お願いします

Re:簡略BM法について

Posted: 2008年7月30日(水) 07:34
by box
当該のソースコードを提示してください。

Re:簡略BM法について

Posted: 2008年7月30日(水) 08:45
by toyo
ptの位置をループの外で保存しておいたらいいのでは
int ExecutionBoyerMooreInquiry( const char txt[/url], const char pat[/url] ){

    int pt,pt2;                //txtをなぞるカーソル
    int pp;                //patをなぞるカーソル
    int txt_len = strlen( txt );    //txtの文字数
    int pat_len = strlen( pat );    //patの文字数
    int skip[ UCHAR_MAX + 1 ];    //スキップテーブル

    for( pt = 0; pt <= UCHAR_MAX; pt++ )
        skip[ pt ] = pat_len;

    for( pt = 0; pt < pat_len - 1; pt++ )
        skip[ pat[ pt ] ] = pat_len - pt - 1;

    while( pt < txt_len ) {
        pp = pat_len - 1;
        pt2 = pt;
        while( txt[ pt2 ] == pat[ pp ] ) {
            if( pp == 0 )
                return ( pt2 );
            pp--;
            pt2--;
        }
        pt += skip[ txt[ pt2 ] ];
    }

    return ( -1 );

}

Re:簡略BM法について

Posted: 2008年7月30日(水) 14:25
by nayo
>boxさん
添付していることを明記してませんでした
申し訳ないです
実際必要な部分は少しなのでそのままこちらに書いたほうが良かったですね…

>toyoさん
家の環境だとsys/time.hなどがインクルードできないため実行できないので確認できませんが
明日にでも自分の思いついた方法ともども試してみます

今日からテストも始まりさらにレポートも溜まってるという…w
今年,もといこの夏を乗り切れるかどうか怪しいです

Re:簡略BM法について

Posted: 2008年7月30日(水) 14:47
by box
> 添付していることを明記してませんでした
> 申し訳ないです

いえいえ、こちらこそ失礼いたしました。
気がついておりませんで。

Re:簡略BM法について

Posted: 2008年7月31日(木) 17:05
by nayo
toyoさんの方法を試してみたところ見事解決しました
この度はどうもありがとうございました

またテストが終わったら今度はゲームについてでも質問させてもらおうと思います