資料6

問6  abcdabc
bm法のg(c)を求める

               k   m-k 
            a  1    6
            b  2    5
            c  3    4
            d  4    3
            a  5    2
            b  6    1     
      abcdabc       
               m= 7 
                 最後のcは7 (0とはしない)
               各文字、最小値を値とすると

              a  b  c  d  残りの文字        
              2  1  4  3   7       
例題として、以下のものを考えてみよう。文字cに注目。
         
T: abxdaccabcdabc  
P: abcdabc g(c) = 4       2
      abcdabc g(c) = 4    4
       abcdabc g(d) = 3   1   
          abcdabc  一致   7 

解答例

#include <stdio.h>
#include <string.h> /* 文字関係のライブラリ よくわかるC p71 */

/* プロトタイプ宣言 */
void print_text(char []); /* 文字列配列tの表示 */
int naive(char [], char []); /* 引数は文字の配列。別の書き方もある */


int main (void) {
   char t[30]; /* 文字列の最後は \0 ヌル文字なので、最大29文字 */
   char p[10];
   int j; /* 戻り値をうけとる変数 マッチするなら、配列tの添え字 */

   /* テキストは、教科書の例 p98 */
   strcpy(t, "ababdababccbdcabcadb"); /* 文字列の代入 よくわかるC p68 */

   /* テキストも入力させるなら、上をやめて、下のように
   printf("文字列を入力してください :");
   scanf("%s", t);
   */

   /* パターンは入力 p98 */
   printf("探したい文字列を入力してください :");
   scanf("%s", p);

   print_text(t);    /* テキストの出力 */
   j = naive(t,p);   /* 素朴、力づく、力まかせのアルゴリズム実装 */

   /* 戻り値に応じて、出力文 */
   if (j == -1) /* 見つからない */
       printf("Pattern %s is not found \n", p);
   else /* テキスト配列tの添え字jから見つかった */
       printf("Pattern %s is matched at %d \n", p,j);

   return 0;
}

/* この関数を、完成させよう */
int naive (char t[], char p[]){
   int i = 0;
   int j = 0;
   int m = strlen(p); /* 文字列の長さ よくわかるC p71 文字列操作関数 */
   int n = strlen(t);

   /* 疑似コードを参考に 完成させてください。全体を、よく読み、納得すること*/
   /* printf 文を差し込むなどして、変数の状態を出力、確認してみるとよい */
   while (






   if (i == m)
      return (j - i);
   else
      return (-1);

}

/* 文字列の最後には\0 ヌル記号。例題集 5の定番処理です */
/* strlenで文字列のサイズを得て、ループする方法もある */
/* よくわかるC言語 p65 は forループで。以下はwhileループ版 */
void print_text(char t[]) {
   int j = 0;
   while (t[j] != '\0') {  /* 最後のヌル文字ではない */
      printf("t[%d] = %c\n", j, t[j]); /* 1文字をプリント */
      j++;
   }
}

問7
(A) スキップ関数g(c)を求める
        r   1   3
        i   2   2
        n   3   1
     ring       4

           g i n r  残りの文字は
           4 2 1 3   4



(B) bm法で照合する  (cmpは比較回数カウンター)

比較回数を求める
storage for strings          cmp
ring  g(r) = 3         1
   ring g(e)=  4               1
       ring g(r) = 3           1
          ring g(t) = 4        1    
              ring  一致!     4      8回