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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Uz
0 / 0 / 0
Регистрация: 05.07.2012
Сообщений: 22
#1

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

08.07.2012, 11:42. Просмотров 645. Ответов 1
Метки нет (Все метки)

Здравствуйте! Собственно, вопрос находится в заголовке: у меня описано два списка, надо этим алгоритмом найти количество вхождений первого списка во второй. Прошу о помощи, заранее спасибо.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.07.2012, 11:42     Реализация алгоритма Рабина-Карпа для двух однонаправленных линейных списков
Посмотрите здесь:
C++ Сравнение элементов двух однонаправленных линейных списков
Организовать представление множеств в виде линейных однонаправленных списков C++
C++ Как из двух однонаправленных списков создать третий, который состоит из нечетных элементов предыдущих двух?
Алгоритм Рабина-Карпа C++
Алгоритм Рабина-Карпа, нужны комментарии к коду C++
Усовершенствовать алгоритм Рабина-Карпа, чтобы он искал символьную подматрицу в символьной матрице C++
C++ Реализация теста Рабина-Миллера для чисел порядка 2^512
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     Реализация алгоритма Рабина-Карпа для двух однонаправленных линейных списков
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru