Форум программистов, компьютерный форум CyberForum.ru

Реализация алгоритма Рабина-Карпа для двух однонаправленных линейных списков - C++

Восстановить пароль Регистрация
 
Uz
0 / 0 / 0
Регистрация: 05.07.2012
Сообщений: 22
08.07.2012, 11:42     Реализация алгоритма Рабина-Карпа для двух однонаправленных линейных списков #1
Здравствуйте! Собственно, вопрос находится в заголовке: у меня описано два списка, надо этим алгоритмом найти количество вхождений первого списка во второй. Прошу о помощи, заранее спасибо.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.07.2012, 11:42     Реализация алгоритма Рабина-Карпа для двух однонаправленных линейных списков
Посмотрите здесь:

C++ реализация алгоритма сортировки для любых типов данных
«Хранение и обработка данных с использованием линейных списков». C++
как работает эта программа(Алгоритм Рабина-Карпа с++)??? C++
Хранение и обработка данных с использованием линейных списков C++
C++ Сравнение элементов двух однонаправленных линейных списков
C++ Сортировка линейных(односвязных) списков
Алгоритм Рабина-Карпа C++
Усовершенствовать алгоритм Рабина-Карпа, чтобы он искал символьную подматрицу в символьной матрице C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Uz
0 / 0 / 0
Регистрация: 05.07.2012
Сообщений: 22
09.07.2012, 17:39  [ТС]     Реализация алгоритма Рабина-Карпа для двух однонаправленных линейных списков #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
string s, t; // входные данные
 
// считаем все степени p
const int p = 31;
vector<long long> p_pow (max (s.length(), t.length()));
p_pow[0] = 1;
for (size_t i=1; i<p_pow.size(); ++i)
    p_pow[i] = p_pow[i-1] * p;
 
// считаем хэши от всех префиксов строки T
vector<long long> h (t.length());
for (size_t i=0; i<t.length(); ++i)
{
    h[i] = (t[i] - 'a' + 1) * p_pow[i];
    if (i)  h[i] += h[i-1];
}
 
// считаем хэш от строки S
long long h_s = 0;
for (size_t i=0; i<s.length(); ++i)
    h_s += (s[i] - 'a' + 1) * p_pow[i];
 
// перебираем все подстроки T длины |S| и сравниваем их
for (size_t i = 0; i + s.length() - 1 < t.length(); ++i)
{
    long long cur_h = h[i+s.length()-1];
    if (i)  cur_h -= h[i-1];
    // приводим хэши к одной степени и сравниваем
    if (cur_h == h_s * p_pow[i])
        cout << i << ' ';
}
Как вот то же самое, только для двух однонаправленных списков реализовать? Помогите, пожалуйста.
Yandex
Объявления
09.07.2012, 17:39     Реализация алгоритма Рабина-Карпа для двух однонаправленных линейных списков
Ответ Создать тему
Опции темы

Текущее время: 19:31. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru