Тёмный

#1. Алгоритм Кнута-Морриса-Пратта (КМП-алгоритм) | Алгоритмы на Python 

selfedu
Подписаться 150 тыс.
Просмотров 96 тыс.
50% 1

Рассматривается работа алгоритма Кнута-Морриса-Пратта с подробным объяснением принципов его функционирования для поиска образа в строке. Приводится реализация этого алгоритма на языке Python.
algorithm-kmp.py: github.com/selfedu-rus/python...

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

 

18 фев 2021

Поделиться:

Ссылка:

Скачать:

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

Добавить в:

Мой плейлист
Посмотреть позже
Комментарии : 112   
@user-fd8yb4xw1v
@user-fd8yb4xw1v 3 года назад
Сергей, спасибо большое. Вы так разорите товарищей с платных курсов
@kadabrochka1252
@kadabrochka1252 2 дня назад
Не разорит. Практически тот же самый курс и материал есть на канале у Roman Tsarev (и выложен он еще 6 лет назад). Однако, мне нравится манера Сергея излагать материал.
@user-he9wc5pq3f
@user-he9wc5pq3f 8 дней назад
Спасибо большое! Наконец-то я поняла этот алгоритм и связь префиксов и суффиксов)
@mrfang5908
@mrfang5908 2 года назад
Увидел свежее видео, пошел в плейлист, Сергей такое ощущение что вы прям выкладываете что мне надо, спасибо, хорошо объясняете
@s979n2
@s979n2 3 года назад
Спасибо за труд! Отличное объяснение
@MarchelloCSKAMoscow
@MarchelloCSKAMoscow 2 года назад
Сергей , вашей продуктивности можно позавидовать!
@sergey6453
@sergey6453 2 года назад
Спасибо, очень доступно объясняете, прекрасная наглядная презентация, а также большое количество примеров и пояснений. Все в миг стало понятно!
@user-ou7pi2wp8n
@user-ou7pi2wp8n Год назад
Сергей, спасибо большое! Очень подробное и понятное объяснение! Каждый момент, который бы мог стать сложным, с Вашей подачей абсолютно понятен. Благодаря Вашим курсам и видеороликам получаю зачеты и пятерки на экзаменах в университете =) Спасибо еще раз)
@nikolaytalkov2525
@nikolaytalkov2525 Год назад
Класс испытал истинное удовольствие от просмотра видео, четко ясно информативно. Спасибо тебе, так держать, молодец что снимаешь такие познавательные видео
@user-mu8wd3vn8s
@user-mu8wd3vn8s 5 месяцев назад
Благодаря вам понял тонкий момент КМП, спасибо большое!
@user-jo2ux1tm9y
@user-jo2ux1tm9y Год назад
Очень круто объясняешь! Спасибо за уроки!
@evgenybratkovsky1486
@evgenybratkovsky1486 4 месяца назад
Очень толково объясняете. Спасибо!
@levinowak
@levinowak 11 месяцев назад
Коммент в поддержку! Лучшее объяснение и отличная подача
@logistloglab5243
@logistloglab5243 Год назад
Надеюсь, что дорос до этого плейлиста. Сергей, спасибо!)
@alexk.6243
@alexk.6243 10 месяцев назад
Классный урок, интересная и содержательная подача!
@luckytima2315
@luckytima2315 3 года назад
Ой супер вообще ))) Надеюсь будет много видео в данной рубрике :))
@justyar5781
@justyar5781 Год назад
Как раз сейчас алгоритмы смотрю = ) Спасибо за материал!
@user-ty4nc7fk5q
@user-ty4nc7fk5q Год назад
Спасибо за такое классное объяснение 🔥
@dmitrykashlakov3831
@dmitrykashlakov3831 3 года назад
Очень хорошо объясняете
@Noklee
@Noklee Год назад
Начал смотреть за пару дней до олимпиады. Круть
@Yornero
@Yornero 2 года назад
Классный алгоритм, прекрасный в своей простоте. Помню решал схожую задачу, но через хэширование
@user-vu7hz8hg1u
@user-vu7hz8hg1u 3 года назад
На счет знание алгоритмов это в первую очередь я с вами соглашусь уважаемый
@user-ej3iz3ty9g
@user-ej3iz3ty9g 6 месяцев назад
Красиво) Спасибо Вам большое)
@chimchimsterschannel161
@chimchimsterschannel161 Год назад
Сложно с первого раза понять) сегодня реализовал за O(m*n), надеюсь вскоре получится реализовать за О(m+n)) Сергей, спасибо вам большое, особенно за курс по ООП)
@nemo917
@nemo917 2 года назад
Большое спасибо за видео!
@user-ee1lx1pe7n
@user-ee1lx1pe7n 2 года назад
Вы просто Гений!! Спасибище!!!
@donfedor007
@donfedor007 3 года назад
Добрый день! не смотрел пока весь в Flask и Django, но лайк однозначно!!!
@kpacccavchik
@kpacccavchik 3 года назад
ничего не понял, но так интересно, что поскорее хочется начать изучать )
@hunya_k
@hunya_k 6 месяцев назад
Спасибо, очень понятно!
@Vlad1998996
@Vlad1998996 3 года назад
Сложно, но гениально.
@michaelshulga5560
@michaelshulga5560 3 года назад
за алгоритмы однозначно лайк
@ryzhakovalexey5037
@ryzhakovalexey5037 3 года назад
Я до сих пор не понимаю, почему так мало просмотров у тебя на канале
@sainco3036
@sainco3036 3 года назад
Скоро будет много просмотров, а пока можно поддержать автора спонсорством.
@user-fn9vr6ef4v
@user-fn9vr6ef4v Год назад
Учеба дело очень энергозатратное)) Мозг обывателя гораздо охотнее поглощает тик-ток))
@Grigoryshaw
@Grigoryshaw Год назад
Ответ прост: очень мало заинтересованных этой темой
@rpuropu
@rpuropu 3 года назад
гениальный алгоритм).. сигарета потухла давно) перематывал раз 20..)
@wadahalgabri560
@wadahalgabri560 Год назад
Спасибо Очень помогло !
@user-ee1lx1pe7n
@user-ee1lx1pe7n 2 года назад
Этот алгоритм легче понять, если пропустить через дебаггер в пайчарме. Я его перезаписал с более наглядными названиями переменных. Если поставить на 28й строчке точку дебага и пошагово пройтись через Step Over (fn + F8 на маке) то все будет четко понятненько: ``` entry = "лилила" text = "лилилось лилилась" len_entry = len(entry) len_text = len(text) def get_pi(): pi = [0] * len_entry j, i = 0, 1 while i < len_entry: if entry[j] == entry[i]: pi[i] = j + 1 i += 1 j += 1 else: if j == 0: pi[i] = 0 i += 1 else: j = pi[j - 1] return pi text_pointer = 0 entry_pointer = 0 while text_pointer < len_text: if text[text_pointer] == entry[entry_pointer]: text_pointer += 1 entry_pointer += 1 if entry_pointer == len_entry: print("образ найден") break else: if entry_pointer > 0: pi = get_pi() entry_pointer = pi[entry_pointer - 1] else: text_pointer += 1 if text_pointer == len_text and entry_pointer != len_entry: print("образ не найден") ```
@study_land_pinsk1004
@study_land_pinsk1004 Год назад
Сергей, вы вылучший! Пол года уже изучаю Python и ML по разным русскоязычным и англоязычным курсам. Как устроюсь на работу обязательно отблагодарю "$ THANKS" )
@user-wg2tb1hy6g
@user-wg2tb1hy6g 10 месяцев назад
Устроился?
@fyyann5944
@fyyann5944 9 месяцев назад
Тоже интересно Решил изучать питон, ибо тема интересна и привлекает идея работать в айти
@user-wm3sb9gj7q
@user-wm3sb9gj7q Год назад
спасибо огромное!
@versus666jzx
@versus666jzx 2 года назад
13:40 не совсем корректно звучит "пи от нуля" и т.д. в данном случае, тут же все таки индексы некоторого списка, а не функция) Огромное спасибо за труд, все очень доходчиво!
@user-pd8te8cu8o
@user-pd8te8cu8o Год назад
потрясающе
@TheSadmint
@TheSadmint 3 года назад
спасибо за видео! А регулярные выражения именно этот алгоритм используют?
@nikitabbrv5947
@nikitabbrv5947 2 года назад
Хочется весь плейлист сразу в оперативку себе подгрузить)
@greentea2619
@greentea2619 3 месяца назад
лучше в жесткий будет конечно
@viktorzherekhin8590
@viktorzherekhin8590 6 месяцев назад
Для целей обучения полезно взять описание алгоритма и пытаться самому реализовать его на Пайтон. И потом проверить, чтобы получился одинаковый результат. Т.к. одно и то же можно реализовать по-разному. Тот же список, к примеру, можно заранее задать с конкретными элементами (нулями, к примеру), а можно формировать в процессе выполнения цикла (pi.append(0)). Можно сделать через цикл for, можно - через while, и т.д.
@slava_zxz
@slava_zxz 2 месяца назад
Спасибо
@silentlyow
@silentlyow 2 года назад
Еще можно на основе хэшей, посчитать хэш строки и хэш того что нужно найти и уже пройтись по строке и посмотреть есть ли одинаковые, сложность O(n)
@plunk6774
@plunk6774 Год назад
Спасибо за ролик, очень понятно! А как вы учили алгоритмы?
@RedkeiGost
@RedkeiGost 9 месяцев назад
Только в английской Википедии и нагуглил упомянание, что Кнут в примечаниях работы "Selected Papers on Design of Algorithms" писал про Матиясевича. И больше ничего. Найти бы ещё какой-то материал, подробнее да убедительнее. Если он первый опубликовал, то где он опубликовал? В той же Википедии ссылка на Кнута и работу Матиясевича 1971 года.
@ShadowStormlq5mwdasd
@ShadowStormlq5mwdasd 9 месяцев назад
Интересно в чём и как Вы делаете ваши уроки?
@user-vu7hz8hg1u
@user-vu7hz8hg1u 3 года назад
Хотелось бы по-больше инфы по алгоритмам
@1984Nik1
@1984Nik1 3 года назад
супер
@MrIgor989
@MrIgor989 3 года назад
Ты гений
@pythonofsky4545
@pythonofsky4545 4 месяца назад
Классно! Жаль, невелик список алгоритмов в плэйлисте.
@DDR4605
@DDR4605 6 месяцев назад
Посмотрел один раз, потом записал конспект, потом решил одну задачку со шпорой, смотрю второй раз. Начал что-то понимать…😮
@nullnull557
@nullnull557 Год назад
Почему-то момент j = p[j-1] никто не обсуждает, хотя именно к нему нужно уделить внимание в первую очередь. Не понятно как к нему пришли
@nullnull557
@nullnull557 Год назад
Если префикс не подошёл, тогда нужно ее длину уменьшить. Максимально эффективно брать длину максимального префикса для самого префикса.
@andreiviltouski2390
@andreiviltouski2390 3 года назад
👍
@ankhmarcius8331
@ankhmarcius8331 3 года назад
если уже смотрел алгоритм в питоне, то понимаешь что m=len(a), в видео же, не оговаривается о какой m идет разговор, и почему j=m
@bonie3044
@bonie3044 3 года назад
я смотрел твой плейлист по flask как я тут оказался?
@alphonsecapone8218
@alphonsecapone8218 3 года назад
Доброго времени суток) Прошу прощения и ни на что не претендую, просто учусь и стараюсь разобраться. Из того что я на данный момент понял про концепцию большого О - умножение подразумевает под собой вложенный цикл. А в прямом поиске его нет (по крайней мере в версии, которую я попробовал написать). И получается что его сложность в общем случае зависит только от размера источника поиска - О(n). Это может хоть как-то быть правильно? Просто я попробовал замерить скорости у этих алгоритмов и из кучи прогонов только раз смог добиться того чтобы КМП обогнал прямой и то только когда сделал для него все условия (красивые, для больших пропусков, повторения букв и всё такое).
@ubershh
@ubershh 2 года назад
Концепция Big O подразумевает не в общем случае, а "в худшем случае", а при прямом поиске для каждой буквы строки в худшем случае придется проходится по каждой букве образца, отсюда и получается O(m*n)
@user-ny9ux9ss8n
@user-ny9ux9ss8n 4 месяца назад
Это где применяется ? В каких проектах ?
@user-wl6mp6nk2m
@user-wl6mp6nk2m 11 месяцев назад
Так какой алгоритм лучше: КМП или БМХ ?
@UrTa91
@UrTa91 11 месяцев назад
Ну пожалуйста можно в темном цвете делать презентация смотрю ночью мне пипец как ярко
@ShadowStormlq5mwdasd
@ShadowStormlq5mwdasd 9 месяцев назад
Этот алгоритм используется в python? Например в str.find() и всех похожим функциям? Кто знает?
@licantrop609
@licantrop609 9 месяцев назад
Скорее всего в str.__contains__() используется.
@nitra-hl2fj
@nitra-hl2fj 3 года назад
Видео хорошее, только непонятно: зачем вынесли последнее условие из цикла while? Образ "лилила" в конце строки "лилилось лилила" одновременно выдаст и "образ найден" и "образ не найден"
@selfedu_rus
@selfedu_rus 3 года назад
Да, согласен, недосмотрел! Можно поправить вот так: if i == n and j != m: Условие вне цикла, чтобы не выполнять лишние операторы в теле цикла. Исправил программу на github.
@MrJannes
@MrJannes 3 года назад
Мы префикс функцию используем только один раз или после каждого при "прикладывания" образца к тексту?
@selfedu_rus
@selfedu_rus 3 года назад
префиксы формируются на 1-м этапе до поиска образца, затем, на 2-м этапе при несовпадении символов используется сдвиг на вычисленный префикс на 1-м этапе
@begula_chan
@begula_chan Год назад
Можно регулярным выражением сделать
@ceo-s
@ceo-s 11 месяцев назад
Подскажите пожалуйста, зачем всё таки брать п[ j-1 ] при формировании массива п если можно просто поставить 0. Префиксы то всё равно все сначала идут
@DDR4605
@DDR4605 6 месяцев назад
Это условие если j>0
@sainco3036
@sainco3036 3 года назад
Жаль, django закончилось, я только вошел во вкус)
@riplock77
@riplock77 3 года назад
Сдравстуйте, подскажите пожалуйста как сделать чтобы при запуске PyCharm запускалось главное меню с проектами а не запускался последний проект 🙏
@doloidiktatorov
@doloidiktatorov 3 года назад
File Settings Appearance & Behavior System Settings Startup/Shoutdown Reopen last project
@user-ji3et9wq1y
@user-ji3et9wq1y Год назад
не могу понять логику подсчета количества операций при пошаговом сравнении. если длина массива исходного массива n , а длина образа m , как мы получаем сложность n*m. При каждом сдвиге количеcтво операций равно m(длина образа), число сдвигов образа получим вычитанием длины образа из длины исходной строки, плюс один (n-m+1)*m. При данном примере получается 72+15=87. Максимальная сложность по видео равна 17*6=102, данную разницу вы игнорируете как не значительную? Или я не правильно считаю?
@user-pg6mb6il1c
@user-pg6mb6il1c 3 года назад
Давай джанго , плиз
@user-hr8vo2jy5c
@user-hr8vo2jy5c Год назад
Регулярные выражения?
@dvd6307
@dvd6307 3 года назад
Да ты серьезно? Я не успел ещё посмотреть остальные плейлисты, а тут новое. Круто конечно, но... Что мне делать?
@viktorkomlev5804
@viktorkomlev5804 3 года назад
смотри плейлисты по порядку, но когда появляются видео с алгоритмами, залетай туда, знание алгоритмов в работе программиста, важнее, чем умение набирать код
@janibektursynbaev
@janibektursynbaev 2 года назад
пишет не найдено
@dazdess
@dazdess 2 года назад
А можно ли тут обойтись регулярными выражениями? Насколько этот алгоритм будет быстрее работать чем регулярные выражения?
@selfedu_rus
@selfedu_rus 2 года назад
Если просто найти образец в строке, то подобные алгоритмы будут работать быстрее регулярок. (При условии, что программа делается на С++, а не Python). Если же используете Python, то опять же, лучше брать соответствующие методы строк: count(), index(), find() и т.п. Регулярные - это более изощренный инструмент для тонкой обработки.
@owenearmusic
@owenearmusic 2 года назад
Мое лицо когда пытаюсь осознать этот алгоритм 6:42
@user-rf9nl9bl4j
@user-rf9nl9bl4j 3 месяца назад
Скажите пожалуйста в какой программе пишите код
@selfedu_rus
@selfedu_rus 3 месяца назад
PyCharm
@tenelokis
@tenelokis Год назад
Полчаса пролетели за минуту 🙂
@user-ec5nx5gd2j
@user-ec5nx5gd2j 4 дня назад
А я ничего не поняла
@RocetDev
@RocetDev 2 года назад
Привет друг. Я тебе рекомендую сделать свой курс на stepik что бы прибавить аудиторию
@selfedu_rus
@selfedu_rus 2 года назад
Спасибо, в ближайших планах )
@stas-web
@stas-web Год назад
Реализация на JS: function kmp(text, str) { const N = text.length, M = str.length; let p = new Uint16Array(str.length); for (i = 1, j = 0; i < M; i++) { while (j > 0 && str[j] != str[i]) j = p[j-1]; if(str[j] == str[i]) j++; p[i] = j; } for (i = 0, j = 0; i < N; i++) { while (j > 0 && str[j] != text[i]) j = p[j - 1]; if (str[j] == text[i]) j++; if (j == M) return i - j + 1; } return -1; } console.log(kmp('лилилось лилилась', 'лилила')); // 9
@maiorchiks3107
@maiorchiks3107 2 года назад
ничего не понял (((
@user-ox7kc4fd1m
@user-ox7kc4fd1m 2 года назад
интересно почему этот вариант не работает h1 = "ллилилась лилилось" h2 = "лилилась" a=0 b=1 c=2 d=3 e=4 f=5 g=6 k=7 l=8 for i in range(len(h1)-len(h2)-1): uo = h1[a]+h1[b]+h1[c]+h1[d]+h1[e]+h1[f]+h1[g]+h1[k]+h1[l] if h2 == uo: print('gotovo') a = a + 1 b = b + 1 c = c + 1 d = d + 1 e = e + 1 f = f + 1 g = g + 1 k = k + 1 l = l + 1
@whitepepper742
@whitepepper742 6 месяцев назад
а в чем логика здесь вообще? зачем мы каждой отдельной буквой обозначаем номер буквы образца? Зачем здесь инициализация uo, если оно используется один раз? Ну и главный вопрос, если образец будет из, допустим, 99 букв, вы будете каждый номер буквы образца инициализировать отдельно? зачем нам 99 переменных? Ничего не понятно. И читаемость кода ужасная
@janibektursynbaev
@janibektursynbaev 2 года назад
в чем тут ошибка? #include using namespace std; string find(string s, string a, vector pi){ int i = 0; int j = 0; while(i
@user-gd4en4ot3u
@user-gd4en4ot3u 6 месяцев назад
так себе понятно... хотя это не удивительно, ведь речь идет об алгоритмах. Самое бесячее, что нельзя задать какой то вопрос в моменте
@lubovd5335
@lubovd5335 3 года назад
Матиясевич Советский ученый, а не русский
@selfedu_rus
@selfedu_rus 3 года назад
Русскую национальность никто не отменял, см. в википедии: ru.wikipedia.org/wiki/Матиясевич,_Юрий_Владимирович
@user-st7gn4yk8q
@user-st7gn4yk8q 3 года назад
Python - это хорошо, но JS ещё лучше)
@fghinty7623
@fghinty7623 3 года назад
а?
@nadyamoscow2461
@nadyamoscow2461 3 года назад
JS тут тоже есть. Правда, не знаю, чем оно лучше, чем Python
@fontyfx6843
@fontyfx6843 3 года назад
Наоборот
@whitepepper742
@whitepepper742 6 месяцев назад
Опять гонки какой язык лучше🤡Под определенную задачу свой язык
@user-un8ns5uc9j
@user-un8ns5uc9j 6 месяцев назад
А если сравнивать текст с образцом по букве а и в случае совпадения сравнивать всё?
Далее
Алгоритмы на Python 3. Лекция №1
1:20:50
Циклы в Python, ЕНТ Информатика
1:00:33
How To Learn Algorithms? Why? #codonaft
19:22
Просмотров 556 тыс.
Алгоритмы. Префикс-функция
31:51