Алгоритм Бойера-Мура-Хорспула
Сортировка:
1. Быстрая сортировка (англ. quicksort)
2. Сортировка Шелла (англ. Shell sort)
Поиск:
1. Прямой поиск (он же Простой, он же Алгоритм грубой силы)
И новенькое:
Алгоритм Бойера-Мура-Хорспула
Алгоритм основан на двух идеях :
1. Сравнение искомого слова с текстом начинается с последнего символа.
2. В случае несовпадения символа слово смещается на число знаков, получаемое из таблицы стоп-символов:
2.1. Таблица стоп-символов строится по принципу – каждому символу назначается номер позиции его последнего вхождения в искомое слово. Т.е., например, для слова “asdfsdfd” символу “s” будет соответствовать номер 4 (если считать с 0). Обратите внимание, что для символа “d” номер будет не “7”, а “5”, т.к. последний символ не учитывается.
Длина таблицы соответствует длине алфавита. В случае с таблицей cp866 (стандартный алфавит для DOSа) длина алфавита равна 256.
И боевой пример:
int boyermooreFind (int _start, arr &src_str, int src_len, arr &find_str, int find_len) { arr occ; /* Таблица стоп-символов */ /* ПОСТРОЕНИЕ ТАБЛИЦЫ СТОП-СИМВОЛОВ */ for(int a = 0; a < 2048; a++) occ.push_back(-1); for(int a = 0; a <= find_len - 1; a++) occ.at(find_str.at(a)) = a; /* ПОИСК! */ for(int hpos = _start; hpos <= src_len - find_len; ) { int npos = find_len - 1; while(find_str.at(npos) == src_str.at(npos + hpos)) { if(npos == 0) return hpos; npos--; } /* Не совпало! */ if (occ.at(src_str.at(npos+hpos)) == -1) { hpos = hpos + npos + 1 /*find_len*/; } else { hpos = hpos + (npos - occ.at(src_str.at(npos + hpos))); } } return -1; }
int _start - номер начальной позиции для поиска (используется для поиска всех вхождений искомого слова в строку)
arr &src_str - адрес целочисленного массива типа vector - исходный текст
int src_len - длина исходного текста
arr &find_str - адрес целочисленного массива типа vector - искомое слово
int find_len - длина искомого слова
Декабрь 9th, 2011 - 12:48
Пояснения пяти параметров это, конечно, замечательно, но их смысл гораздо очевиднее скрытого от нас класса arr с его загадочными функциями push_back() и at(). А также, что значит return -1 в конце?
Декабрь 9th, 2011 - 22:32
Так в списке параметров написано же.
arr — контейнер типа vector. http://www.cplusplus.com/reference/stl/vector/vector/
А про -1:
Функция возвращает позицию первого символа искомого слова. Это всегда положительное число.
-1 возвращается, если словно не найдено.
А вообще, надо бы функцию слегка переписать. Ибо то, что здесь, написано давно, когда с++ был еще слабо знаком.