ページ 1 / 1
簡略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さんの方法を試してみたところ見事解決しました
この度はどうもありがとうございました
またテストが終わったら今度はゲームについてでも質問させてもらおうと思います