Тёмный

Алгоритмы. Префикс-функция 

Oleksandr Tsymbaliuk
Подписаться 6 тыс.
Просмотров 7 тыс.
50% 1

Программу данного курса вы можете посмотреть по ссылке - docs.google.com/document/d/1U...
В этой лекции мы рассмотрим задачу вычисления префикс-функции для строки. Префикс-функция довольно часто используется в алгоритмах поиска для строк. Поэтому знакомство с ней довольно важно. Для этого нужно узнать несколько новых терминов - подстрока, префикс, суффикс и только потом переходить к префикс-функции и алгоритма для ее нахождения. Реализуем один из алгоритмов на Python, Java, Fortran.
Ссылка на конспект этой лекции - drive.google.com/file/d/1pxjy...
Ссылка на примеры кода - drive.google.com/drive/folder...

Опубликовано:

 

13 сен 2021

Поделиться:

Ссылка:

Скачать:

Готовим ссылку...

Добавить в:

Мой плейлист
Посмотреть позже
Комментарии : 25   
@user-marrusia22
@user-marrusia22 2 года назад
Спасибо огромное! Сначала,когда смотрела на эту тему,думала что голова кругом пойдет,но все очень понятно! Спасибо
@user-tk5xm4ox2c
@user-tk5xm4ox2c 2 года назад
Большое Вам спасибо. Обошел множество источников, но только у Вас разобрался.
@mobyfactor
@mobyfactor 2 года назад
Спасибо,очень доступно объясняете,помогли разобраться с непонятной до этого префикс функцией
@luckytima2315
@luckytima2315 2 года назад
гений! Все очень понятно , спасибо большое)
@front-rud
@front-rud Год назад
Я думал Префикс-функция это очень сложно, пока не посмотрел это видео, спасибо!
@annayatsenko-uvarova5921
@annayatsenko-uvarova5921 Год назад
Дуже дякую за детальне пояснення!
@user-zn3ov2mc5b
@user-zn3ov2mc5b Год назад
Супер! спасибо!
@musicits_fun
@musicits_fun Год назад
Честно сказать думал что префикс-функция поможет вычислить все повторения в строке. Самое интересное, что в начале, когда используешь маленькую последовательность, он таки и работает. Но вот если вставить что-то навроде: "'qwertyqwerasdfghjklzxcvbnmcvbnmcvbnm'", то выдает только первые совпадения, а "cvbnm" повторяющийся в конце, уже не видит. Может быть кто-то подскажет алгоритм быстрый для поиска повторений в строке?
@manOfPlanetEarth
@manOfPlanetEarth Год назад
Ну, давайте, посмотрим....
@manOfPlanetEarth
@manOfPlanetEarth Год назад
посмотрел... все эти алгоритмы - нуднейшая штука. даже на примере этого: несложно, но на третий день вылетит из головы только так, если не использовать. в целом для развития как программиста, конечно, полезно ознакомиться с основными морисо-праттами, сортировками и поисками и тд. но когда на собесах тащат вопросы с их детальной реализацией - осуждаю очень сильно. подача материала - на уровне, как и все остальные уроки автора этого канала:))
@dima_kv
@dima_kv 14 дней назад
Скажите пожалуйста зачем в определении префикса и суффикса вводится понятие некой строки Х, ведь нам не надо где-то искать существующую абстрактную строку. У нас точно есть заданная исходная строка и она неизменная и никак не меняется когда мы проверяем на суффиксы или префиксы? К чему такие сложности? Почему не сказать префикс строки если она начинается на нее, суффикс это если заканчивается на нее?
@oleksandrtsymbaliuk
@oleksandrtsymbaliuk 14 дней назад
Потому, что алгоритм должен быть универсальным. Если алгоритм и его определение написаны только для какой то одной явной исходной строки, то толку от такого алгоритма и определений практически нет.
@manOfPlanetEarth
@manOfPlanetEarth Год назад
14:20 Дядь Саша, приветствую вас. Я так и не понял зачем для случая 2.2) такая мутная штука j=pi[j-1]?? Логика же этого подпункта очень проста: если закончилось совпадение префикса с суффиксом, то надо начинать сначала, те с j=0. И приведенная в уроке реализация префикс-функции мне не понравилась: 1) она не отражает текстовое описание алгоритма на том же 14:21 в том смысле, что, идя по текстовому описанию, код не читается. 2)я на бумаге прошел код на нескольких примерах, чтобы понять, что он делает и увидел, что значение j внутри одной итерации по i может меняться по два раза! j: 1->0->1. Это плохо и не имеет смысла, такого нет в текстовом описании. Вот моя реализация: import java.util.*; import java.lang.*; class I { public static void main (String[] args){ System.out.println( Arrays.toString( prefixFunc("aboabcoabcda"))); } static int[] prefixFunc(String t){ int n=t.length(); int[] pi=new int[n]; int j=0; for(int i=1;i
@oleksandrtsymbaliuk
@oleksandrtsymbaliuk Год назад
Вы таким образом существенно замедлите алгоритм (вы по сути придете к линейному перебору суффиксов) что в случае больших строк, даст огромное замедление. А вот откат на предыдущую позицию, даст меньшие объемы переборов. Подробнее например тут - ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%B5%D1%84%D0%B8%D0%BA%D1%81-%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F
@manOfPlanetEarth
@manOfPlanetEarth Год назад
@@oleksandrtsymbaliuk Да уж.. Я прямо сейчас обнаружил, что мой вариант без j=pi[j-1] для строки "abbaabbab" для последнего значения возвращает 0, хотя надо вернуть 2: "ab" будует и префиксом и суффиксом длины два. Вижу, что с j=pi[j-1] работает, но смысл этой мульки пока не уловил, смотрю объяснение ещё в другом месте (закончил смотреть - там тоже не объяснили:(( ), буду кумекать над этой мулькой. И вашу ссылку посмотрю. -----||----------||----------||----- Есть такой вопрос. Как преподаватель и поболее знающий человек можете привести названия 5 алгоритмов (из вашего плейлиста по алгоритмам, видео я глазами найду сам по названию), которые стоит посмотреть в первую очередь, как самые интересные что ли, самые обогащающие. Я в кнутомориса полез, потому что встречал это страшное название и было интересно, что прячется за ним. К тому же я со строками не люблю возиться, а он полностью про строки, так что немного разошью своё узкое место. К тому же всплыло сопутствующее понятие префикс функции. Вот еще бы 5 алгосов для расширения алгоритмического сознания. Только кроме сортировок:)) Их я почти все смотрел раньше и у вас посмотрю для повторения.
@oleksandrtsymbaliuk
@oleksandrtsymbaliuk Год назад
@@manOfPlanetEarth Интересный вопрос. Ну что же попробую указать несколько интересных и полезных алгоритмов 1. Мемоизация (общий подход полезно во многих задачах) - ru-vid.com/video/%D0%B2%D0%B8%D0%B4%D0%B5%D0%BE-VwmJ-Lj1Qsk.html 2. Бинарный поиск и быстрая сортировка как пример подхода разделения задачи на части - ru-vid.com/video/%D0%B2%D0%B8%D0%B4%D0%B5%D0%BE-cqMmVA3ivLY.html, ru-vid.com/video/%D0%B2%D0%B8%D0%B4%D0%B5%D0%BE-6CkfbqzN0N4.html 3. Какой нибудь комбинаторный алгоритм (рекомендую алгоритм Нарайаны) - ru-vid.com/video/%D0%B2%D0%B8%D0%B4%D0%B5%D0%BE-bp5_gvIdLEU.html
@manOfPlanetEarth
@manOfPlanetEarth Год назад
@@oleksandrtsymbaliuk Так-так-так. 1. Знаком с такой штукой. Для факториала могу. Для повтора посмотрю и у вас. Согласен, мемоизация входит в базу. 2. Это тоже классика:) Конечно, я про это читал и смотрел. Помню, начал сортировки с быстрой и подзавис: работа с двумя индексами всегда сначала сложно: никаких в уме, надо рисовать на бумаге. К тому же есть подвиды этого квиксорта и сначала теряешься в них. Но как пример разделения задачи на подзадачи - отл. Тоже посмотрю в вашем исполнении. Согласен, квиксорт входит в базу. 3. Это только раз слышал:) Буду смотреть. Вообще всю эту комбинаторику быстро забываю за неиспользованием. Получается, с чистого листа для меня только третий пункт🤔 Так что можете еще несколько развивающих алгосов накинуть. А пока КМП занимаюсь. Похоже, начинаю понимать, зачем там j=pi[j-1]. Возможно, по итогам осознания напишу длинный комментарий под видео.
@oleksandrtsymbaliuk
@oleksandrtsymbaliuk Год назад
Если интересно, то можете посмотреть алгоритм интерполяционного поиска - ru-vid.com/video/%D0%B2%D0%B8%D0%B4%D0%B5%D0%BE-5fdY8OMI3WM.html его ценность в том, что он показывает как идеи из одной области (геометрия) используются в другой (информатика). Т.е. это хороший пример междисциплинарного обмена.
Далее
Алгоритмы. Хеш-функция
38:37
Просмотров 1,3 тыс.