C言語アルゴリズム-力まかせ探索
力まかせの探索 (brute force search)
力まかせの探索とは、文字列(テキスト)と探索文字列(パターン)を一文字ずつ比較する探索アルゴリズムです。テキストとパターンの文字を先頭から順番に比較し、パターンの末尾文字まで一致すれば探索は成功です。途中で文字が違っていれば探索は失敗です。
力まかせ探索の探索過程
テキストとパターンを順に比較していきます。
テキスト | a | c | a | b | c | c | b |
パターン比較1 | a | b | c | - | - | - | - |
パターン比較2 | - | a | b | c | - | - | - |
パターン比較3 | - | - | a | b | c | - | - |
力まかせ探索の性能
力まかせの探索アルゴリズムの計算量はO(mn)となります。
テキストの長さをn文字、パターンの長さをm文字とすると、パターンをテキストに合わせる位置は全部で「n - m + 1」通りあります。つまり、文字の比較は合計で「m(n - m + 1)」 回行われることになります。
C言語による力まかせの探索 (brute force search)のプログラム
ランダムに生成した文字列(a,b,cのみに限定)の中に「abc」のパターンが存在するかどうか探索します。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define DATA_SIZE 16
/*!
* @brief 配列にランダムな文字列を格納する。
* @param[out] array 格納先の配列
* @param[in] size 配列のサイズ
*/
static void
array_random_char(char *array, unsigned int size)
{
int i;
/* 起動毎に異なる乱数を発生させる */
srand((unsigned int)time(NULL));
for(i = 0; i < size; i++){
array[i]= 'a' + (rand() % 3); /* 生成される文字はabcのいずれか */
}
array[size] = '\0';
}
/*!
* @brief 文字列を探索する
* @param[in] text 検索対象文字列
* @param[in] pattern 検索文字列
* @return 発見位置のポインタを返す。失敗したらNULLを返す。
*/
char *
brute_force_search(const char *text, const char *pattern)
{
const char *p1 = text;
const char *p2 = pattern;
while(*p1 && *p2){
if(*p1 == *p2){
p1++; /* テキストの位置を1文字進める */
p2++; /* パターンの位置を1文字進める */
}else{
p1 -= p2 - pattern - 1; /* 比較点から1つのみ進める */
p2 = pattern; /* パターンの位置を先頭にする */
}
printf("[compare]:(text=%s)(pat=%s)\n", p1, p2);
}
if(*p2 != '\0') return(NULL);
return((char *)(p1 - (p2 -pattern)));
}
int
main(void)
{
char text[DATA_SIZE + 1];
char *pattern = "abc";
/* ランダムな文字列で埋める */
array_random_char(text, DATA_SIZE);
printf("[text] :%s\n", text);
printf("[pattern]:%s\n", pattern);
if(brute_force_search(text, pattern) == NULL){
printf("[result] : not found\n");
}else{
printf("[result] : found\n");
}
return(EXIT_SUCCESS);
}
関連ページ
- C言語
- C言語アルゴリズム-スタック
- C言語アルゴリズム-待ち行列(キュー)
- C言語アルゴリズム-連結リスト
- C言語アルゴリズム-線形探索法
- C言語アルゴリズム-二分探索法
- C言語アルゴリズム-力まかせ探索
- C言語アルゴリズム-KMP法
- C言語アルゴリズム-BM法
- C言語アルゴリズム-ハッシュチェイン法
- C言語アルゴリズム-オープンアドレス法
- C言語アルゴリズム-二分探索木