簡略BM法について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
nayo

簡略BM法について

#1

投稿記事 by nayo » 17年前

今日はゲームについてではなく課題について質問させていただきます

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

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

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

box

Re:簡略BM法について

#2

投稿記事 by box » 17年前

当該のソースコードを提示してください。

toyo

Re:簡略BM法について

#3

投稿記事 by toyo » 17年前

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 );

}

nayo

Re:簡略BM法について

#4

投稿記事 by nayo » 17年前

>boxさん
添付していることを明記してませんでした
申し訳ないです
実際必要な部分は少しなのでそのままこちらに書いたほうが良かったですね…

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

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

box

Re:簡略BM法について

#5

投稿記事 by box » 17年前

> 添付していることを明記してませんでした
> 申し訳ないです

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

nayo

Re:簡略BM法について

#6

投稿記事 by nayo » 17年前

toyoさんの方法を試してみたところ見事解決しました
この度はどうもありがとうございました

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

閉鎖

“C言語何でも質問掲示板” へ戻る