Beispiel #1
0
static void pre_bm_gs(const char* pattern, int pattern_length, int* table_gs) {
	int last_prefix_pos = pattern_length;
	for(int i=pattern_length-1; i>=0; i--) {
		if(is_prefix(pattern,pattern_length,i+1))
			last_prefix_pos=i+1;
		table_gs[pattern_length-i-1]=last_prefix_pos + pattern_length - i - 1;
	
	}
	for(int i=0; i<pattern_length-1; i++) {
		int suff_len = suffix_length(pattern,pattern_length,i);
		table_gs[suff_len] = pattern_length + suff_len - i - 1;
	}
}
Beispiel #2
0
void make_delta2(int *delta2, char *pat, int patlen) {
        int p;
        int last_prefix_index = patlen-1;

        // first loop
        for (p=patlen-1; p>=0; p--) {
                if (is_prefix(pat, patlen, p+1)) {
                        last_prefix_index = p+1;
                }
                delta2[p] = last_prefix_index + (patlen-1 - p);
        }

        // second loop
        for (p=0; p < patlen-1; p++) {
                int slen = suffix_length(pat, patlen, p);
                if (pat[p - slen] != pat[patlen-1 - slen]) {
                        delta2[patlen-1 - slen] = patlen-1 - p + slen;
                }
        }
}
Beispiel #3
0
void make_delta2(int *delta2, uint8_t *pat, int32_t patlen) {
    int p;

    int last_prefix_index = patlen-1;
 

    /*first loop:Gs规则case 2*/

    for (p=patlen-1; p>=0; p--) {

        if (is_prefix(pat, patlen, p+1)) { //从p+1开始的后缀是否存在前缀(p失配)

            last_prefix_index = p+1;      //last_prefix_index记录从右至左最后一个匹配字符的index(即p的右边)
        }

        //若存在前缀,保存最后一个匹配字符的index;否则,保存上次已匹配字符的index

        delta2[p] = last_prefix_index;                                       //@bug 1: + (patlen-1 - p);
    }
 

    /*second loop:Gs规则case 1,因为case 2是前缀,而中间的子串(可以看做[0,p]的suffix)也可能=P的suffix,

       且有可能不止一个中间子串,故p从左向后进行处理,保存最靠近P的suffix的对应子串前一个字符的shift长度
     */

    for (p=0; p < patlen-1; p++) {

        int slen = suffix_length(pat, patlen, p);         //末尾向左对应的从p向左的最长后缀的长度

        /*若已匹配suffix-suffix对的前导字符不匹配,保存向左的第一个失配字符的shift长度(即suffix-suffix对的起始位置之差)

           若匹配,则为前缀即case 2,无需改变shift值
         */

        if (slen > 0 && pat[p - slen] != pat[patlen-1 - slen]) {   //slen=0, 即case 3:delta2[patlen-1-slen]=delta2[patlen-1]=patlen

            delta2[patlen-1 - slen] = patlen-1 - p ;                    //@bug 2: + slen;
        }
    }
}