主要特徵
1、沒有預處理階段
2、需要常量額外空間
3、通常需要模式串窗口向右移動一個位置
4、可以按照任意順序進行比較
5、搜索的時間複雜度爲O(mn)
6、文本字符期望比較次數:2n
算法描述
暴力搜索算法由文本串中從0到n-m所有位置的比較組成,無論是否從模式串的起始位置開始,每次匹配過後,模式串向右移動一位。暴力搜索算法沒有預處理階段,文本串和模式串需要常量額外空間,在搜索階段的文本串的字符可以按照任意順序進行比較,匹配的時間複雜度爲O(mn),
C代碼實現
int BF(char *x, int m, char *y, int n) {
int i, j;
/* 搜索*/
for (j = 0; j <= n - m; ++j) {
for (i = 0; i < m && x[i] == y[i + j]; ++i);
if (i >= m)
return j;
}
}
上面的算法可以改寫爲下面更加高效的算法:
#define EOS '\0'
int BF(char *x, int m, char *y, int n) {
char *yb;
/* 匹配*/
for (yb = y; *y != EOS; ++y)
if (memcmp(x, y, m) == 0)
return y - yb;
}
舉例
第1次嘗試 |
|||||||||||||||||||||||
G |
C |
A |
T |
C |
G |
C |
A |
G |
A |
G |
A |
G |
T |
A |
T |
A |
C |
A |
G |
T |
A |
C |
G |
1 |
2 |
3 |
4 |
|
|||||||||||||||||||
G |
C |
A |
G |
A |
G |
A |
G |
|
第2次嘗試 |
|||||||||||||||||||||||
G |
C |
A |
T |
C |
G |
C |
A |
G |
A |
G |
A |
G |
T |
A |
T |
A |
C |
A |
G |
T |
A |
C |
G |
|
1 |
|
|||||||||||||||||||||
|
G |
C |
A |
G |
A |
G |
A |
G |
|
第3次嘗試 |
|||||||||||||||||||||||
G |
C |
A |
T |
C |
G |
C |
A |
G |
A |
G |
A |
G |
T |
A |
T |
A |
C |
A |
G |
T |
A |
C |
G |
|
1 |
|
|||||||||||||||||||||
|
G |
C |
A |
G |
A |
G |
A |
G |
|
第4次嘗試 |
|||||||||||||||||||||||
G |
C |
A |
T |
C |
G |
C |
A |
G |
A |
G |
A |
G |
T |
A |
T |
A |
C |
A |
G |
T |
A |
C |
G |
|
1 |
|
|||||||||||||||||||||
|
G |
C |
A |
G |
A |
G |
A |
G |
|
第5次嘗試 |
|||||||||||||||||||||||
G |
C |
A |
T |
C |
G |
C |
A |
G |
A |
G |
A |
G |
T |
A |
T |
A |
C |
A |
G |
T |
A |
C |
G |
|
1 |
|
|||||||||||||||||||||
|
G |
C |
A |
G |
A |
G |
A |
G |
|
第6次嘗試 |
|||||||||||||||||||||||
G |
C |
A |
T |
C |
G |
C |
A |
G |
A |
G |
A |
G |
T |
A |
T |
A |
C |
A |
G |
T |
A |
C |
G |
|
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
|
||||||||||||||
|
G |
C |
A |
G |
A |
G |
A |
G |
|
第7次嘗試 |
|||||||||||||||||||||||
G |
C |
A |
T |
C |
G |
C |
A |
G |
A |
G |
A |
G |
T |
A |
T |
A |
C |
A |
G |
T |
A |
C |
G |
|
1 |
|
|||||||||||||||||||||
|
G |
C |
A |
G |
A |
G |
A |
G |
|
第8次嘗試 |
|||||||||||||||||||||||
G |
C |
A |
T |
C |
G |
C |
A |
G |
A |
G |
A |
G |
T |
A |
T |
A |
C |
A |
G |
T |
A |
C |
G |
|
1 |
|
|||||||||||||||||||||
|
G |
C |
A |
G |
A |
G |
A |
G |
|
第9次嘗試 |
|||||||||||||||||||||||
G |
C |
A |
T |
C |
G |
C |
A |
G |
A |
G |
A |
G |
T |
A |
T |
A |
C |
A |
G |
T |
A |
C |
G |
|
1 |
2 |
|
||||||||||||||||||||
|
G |
C |
A |
G |
A |
G |
A |
G |
|
第10次嘗試 |
|||||||||||||||||||||||
G |
C |
A |
T |
C |
G |
C |
A |
G |
A |
G |
A |
G |
T |
A |
T |
A |
C |
A |
G |
T |
A |
C |
G |
|
1 |
|
|||||||||||||||||||||
|
G |
C |
A |
G |
A |
G |
A |
G |
|
第11次嘗試 |
|||||||||||||||||||||||
G |
C |
A |
T |
C |
G |
C |
A |
G |
A |
G |
A |
G |
T |
A |
T |
A |
C |
A |
G |
T |
A |
C |
G |
|
1 |
2 |
|
||||||||||||||||||||
|
G |
C |
A |
G |
A |
G |
A |
G |
|
第12次嘗試 |
|||||||||||||||||||||||
G |
C |
A |
T |
C |
G |
C |
A |
G |
A |
G |
A |
G |
T |
A |
T |
A |
C |
A |
G |
T |
A |
C |
G |
|
1 |
|
|||||||||||||||||||||
|
G |
C |
A |
G |
A |
G |
A |
G |
|
第13次嘗試 |
|||||||||||||||||||||||
G |
C |
A |
T |
C |
G |
C |
A |
G |
A |
G |
A |
G |
T |
A |
T |
A |
C |
A |
G |
T |
A |
C |
G |
|
1 |
2 |
|
||||||||||||||||||||
|
G |
C |
A |
G |
A |
G |
A |
G |
|
第14次嘗試 |
|||||||||||||||||||||||
G |
C |
A |
T |
C |
G |
C |
A |
G |
A |
G |
A |
G |
T |
A |
T |
A |
C |
A |
G |
T |
A |
C |
G |
|
1 |
|
|||||||||||||||||||||
|
G |
C |
A |
G |
A |
G |
A |
G |
|
第15次嘗試 |
|||||||||||||||||||||||
G |
C |
A |
T |
C |
G |
C |
A |
G |
A |
G |
A |
G |
T |
A |
T |
A |
C |
A |
G |
T |
A |
C |
G |
|
1 |
|
|||||||||||||||||||||
|
G |
C |
A |
G |
A |
G |
A |
G |
|
第16次嘗試 |
|||||||||||||||||||||||
G |
C |
A |
T |
C |
G |
C |
A |
G |
A |
G |
A |
G |
T |
A |
T |
A |
C |
A |
G |
T |
A |
C |
G |
|
1 |
|
|||||||||||||||||||||
|
G |
C |
A |
G |
A |
G |
A |
G |
|
第17次嘗試 |
|||||||||||||||||||||||
G |
C |
A |
T |
C |
G |
C |
A |
G |
A |
G |
A |
G |
T |
A |
T |
A |
C |
A |
G |
T |
A |
C |
G |
|
1 |
|
|||||||||||||||||||||
|
G |
C |
A |
G |
A |
G |
A |
G |