Implementácie

Boyer-Mooreov algoritmus

 
 
//Boyer-Mooreov algoritmus vyhladavania zadaneho vzoru "vzor" s poctom znakov "dlzka_v"
//v retazci "retazec" s poctom znakov "dlzka_r"
//funkcia vracia index prveho znaku najdeneho vzoru v retazci 
//(v pripade neuspechu vyhladavania vracia -1)
int najdi_BM(char *vzor, int dlzka_v, char* retazec, int dlzka_r) {
	int postupnost[MAX_DLZKA_VZORU];
	int vyskyt[MAX_VELKOST_ABECEDY];
 
	pre_postupnost(vzor, dlzka_v, postupnost);
	pre_vyskyt(vzor, dlzka_v, vyskyt);
 
	int j = 0;
	while (j <= dlzka_r - dlzka_v) {
		for (int i = dlzka_v - 1; i  >= 0 && vzor[i] == retazec[i + j]; i--);
		if (i < 0) {
			return j;
			//j += postupnost[0];
		}
		else if (postupnost[i] >= vyskyt[retazec[i + j]] - dlzka_v + 1 + i) 
			j+=postupnost[i];
		else j+=vyskyt[retazec[i + j]] - dlzka_v + 1 + i;
	}
	return -1;
}

//funkcia na vytvorenie pomocneho pola pre BM algoritmus 
void pre_postupnost(char *vzor, int dlzka, int postupnost[]) {
    int suff[MAX_DLZKA_VZORU];
    suffixes(vzor, dlzka, suff);

    for (int i = 0; i  <  dlzka; i++) postupnost[i] = dlzka;
    int j = 0;
    for (i = dlzka - 1; i >= -1; i--)
        if (i == -1 || suff[i] == i + 1)
            for (; j < dlzka - 1 - i; j++)
                if (postupnost[j] == dlzka) postupnost[j] = dlzka - 1 - i;
    for (i = 0; i  <= dlzka - 2; i++) 
        postupnost[dlzka - 1 - suff[i]] = dlzka - 1 - i;
}

//funkcia na vytvorenie pomocneho pola pre BM algoritmus 
//(pre funkciu, ktora vytvara pomocne pole pre BM algoritmus)
void suffixes(char *vzor, int dlzka, int *suff) {
    int f;
    suff[dlzka - 1] = dlzka;
    int g = dlzka - 1;
    for (int i=dlzka - 2; i >= 0; --i) {
        if ( i > g && suff[i + dlzka - 1 - f]  < i - g)
            suff[i] = suff[i + dlzka - 1 - f];
        else {
            if (i < g) g = i;
            f = i;
            while (g  >= 0 && vzor[g] == vzor[g + dlzka - 1 - f]) g--;
            suff[i] = f - g;
        }
    }
}

//funkcia na vytvorenie pomocneho pola pre BM algoritmus
void pre_vyskyt(char *vzor, int dlzka, int vyskyt[]) {
    for (int i = 0; i < MAX_VELKOST_ABECEDY; i++)
        vyskyt[i] = dlzka;
    for (i = 0; i < dlzka - 1; i++)
        vyskyt[vzor[i]] = dlzka - i - 1;
}