Алгоритмы. Поиск подстроки. Алгоритм Рабина-Карпа

  Рет қаралды 2,815

Oleksandr Tsymbaliuk

Oleksandr Tsymbaliuk

Күн бұрын

Пікірлер: 18
@radmitr
@radmitr Жыл бұрын
Благодарю за шикарные лекции!
@alextula3280
@alextula3280 Жыл бұрын
Большое спасибо за ваш труд
@ДмитрийВикторович-р7ц
@ДмитрийВикторович-р7ц 6 ай бұрын
19:05 25 строка. Справа от операции присваивания происходят арифметические манипуляции с current_hash, а затем от итогового результата вычисляется остаток от деления. Но current_hash - это уже результат остатка от деления gorner_schem на q (10 строка). Т.е. в данном алгоритме на каждой итерации происходит вычисление остатка от деления от остатка от деления и т.д.. Т.е. это не то же самое, что описано в предыдущих слайдах.
@oleksandrtsymbaliuk
@oleksandrtsymbaliuk 6 ай бұрын
Так на каждой итерации вы должны пересчитать хеш той части подстроки с которой работаете (подробнее 15 страница конспекта лекции) и именно это и происходит в 25. А 10 строка отвечает только за вычисление хеша и начальной части подстроки.
@ДмитрийВикторович-р7ц
@ДмитрийВикторович-р7ц 6 ай бұрын
@@oleksandrtsymbaliuk в лекции Вы ничего не говорили про остаток от деления (на каждой итерации(!)), а тут вдруг он появился. И кроме того, если на каждой итерации происходит вычисление остатка от деления, то current_hash с пред. итерации ограничен q и есть вероятность уйти в отрицательные значения в первых фиолетовых скобках (после знака присваивания в выражении, в 25 строке). Стоит Вам уменьшить q до небольших значений, то вероятность этого сильно возрастет.
@oleksandrtsymbaliuk
@oleksandrtsymbaliuk 6 ай бұрын
@@ДмитрийВикторович-р7ц Начиная со kzbin.info/www/bejne/Y5qxk2eVbs55hNU идет объяснение вычитание идет на каждой итерации именно с остатком от деления (как и указанно на слайде и в видео) и добавление нового значения (не зря же я на видео даже значки плюс и минус рисовал). А если вспомнить арифметику для деления по модулю, то станет понятно почему при вычитании и добавлении нужно вычислять остаток от деления. По поводу гипотетического ухода в отрицательные числа, а это то как получиться? Даже если получиться отрицательное число, то остаток от его деления на положительное а q положительное, даст обычное положительное число и ничего страшного не произойдет.
@radmitr
@radmitr Жыл бұрын
Функция `findSomeHash()` немного некорректно работает. Может быть так надо в конце? ```java public static int[] findSomeHash(int hash, int[] subHashs) { //... int[] result = new int[n]; for (int i = 0; i < n; i++) { for (int j = 0; j < subHashs.length; j++) { if (subHashs[j] == hash) { result[i++] = j; } } } return result; } ```
@oleksandrtsymbaliuk
@oleksandrtsymbaliuk Жыл бұрын
Тут как раз все верно. Это же задача одновременного поиска множества подстрок, значит нужно определить не просто факт совпадения одного хеша (который из за коллизии может к тому же дать ложно положительный результат), а всех совпавших хешей (по сути всех подстрок хеши которых совпали с частью базовой строки). Значит нужно занести индексы всех нужных подстрок, и потом их всех проверить.
@radmitr
@radmitr Жыл бұрын
​@@oleksandrtsymbaliukАлександр, хотел всё-таки уточнить. Есть ли у вас группа в телеграмме? Или здесь лучше писать?
@oleksandrtsymbaliuk
@oleksandrtsymbaliuk Жыл бұрын
Группа ? Нет, зачем она мне? Если есть вопросы, или замечания, то пишите в комментариях к видео. Я их периодически просматриваю, и когда есть возможность отвечаю.
@radmitr
@radmitr Жыл бұрын
@@oleksandrtsymbaliuk Допустим на входе функции: findSomeHash(111, [222, 222, 111]); Она должна вернуть [2] ? Возвращает [0] . Может так? Или я опять туплю ``` int[] result = new int[n]; int insertIndex = 0; for (int i = 0; i < subHashs.length; i++) { if (subHashs[i] == hash) { result[insertIndex++] = i; } } ```
@oleksandrtsymbaliuk
@oleksandrtsymbaliuk Жыл бұрын
Да точно, тут вы правы. Спасибо за указанную неточность. Исправил.
@radmitr
@radmitr Жыл бұрын
2^64 - 1 или 2^63 - 1 ? "Awersome apple" => "Awesome apple"
@oleksandrtsymbaliuk
@oleksandrtsymbaliuk Жыл бұрын
Добрый день. Тут опечатка на самом деле тут 2^61 - 1. Исправил.
@radmitr
@radmitr Жыл бұрын
Понял, спасибо! 2^31 - 1 = 2 147 483 647, следующее простое число Мерсенна: 2^61 - 1 = 2 305 843 009 213 693 951 @@oleksandrtsymbaliuk
ЛУЧШИЙ ФОКУС + секрет! #shorts
00:12
Роман Magic
Рет қаралды 15 МЛН
Человек паук уже не тот
00:32
Miracle
Рет қаралды 2,9 МЛН
Алгоритмы. Хеш-функция
38:37
Oleksandr Tsymbaliuk
Рет қаралды 1,6 М.
LeetCode - 706. Design HashMap | Design | Python | Java
16:41
Orkhan Gasanov
Рет қаралды 192
React JS фундаментальный курс от А до Я
3:01:08
Алгоритмы. Динамическое программирование
35:42
Corso di Programmazione: Impara a programmare da zero | Alberto Olla
2:18:57
Идея алгоритма Дейкстры
9:56
Олимпиадное программирование в УлГТУ
Рет қаралды 11 М.
Алгоритмы. Турнирная сортировка
26:49
Oleksandr Tsymbaliuk
Рет қаралды 349