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

  Рет қаралды 99,693

selfedu

selfedu

3 жыл бұрын

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

Пікірлер: 114
@user-fd8yb4xw1v
@user-fd8yb4xw1v 3 жыл бұрын
Сергей, спасибо большое. Вы так разорите товарищей с платных курсов
@kadabrochka1252
@kadabrochka1252 Ай бұрын
Не разорит. Практически тот же самый курс и материал есть на канале у Roman Tsarev (и выложен он еще 6 лет назад). Однако, мне нравится манера Сергея излагать материал.
@mrfang5908
@mrfang5908 2 жыл бұрын
Увидел свежее видео, пошел в плейлист, Сергей такое ощущение что вы прям выкладываете что мне надо, спасибо, хорошо объясняете
@sergey6453
@sergey6453 2 жыл бұрын
Спасибо, очень доступно объясняете, прекрасная наглядная презентация, а также большое количество примеров и пояснений. Все в миг стало понятно!
@user-ou7pi2wp8n
@user-ou7pi2wp8n Жыл бұрын
Сергей, спасибо большое! Очень подробное и понятное объяснение! Каждый момент, который бы мог стать сложным, с Вашей подачей абсолютно понятен. Благодаря Вашим курсам и видеороликам получаю зачеты и пятерки на экзаменах в университете =) Спасибо еще раз)
@s979n2
@s979n2 3 жыл бұрын
Спасибо за труд! Отличное объяснение
@nikolaytalkov2525
@nikolaytalkov2525 Жыл бұрын
Класс испытал истинное удовольствие от просмотра видео, четко ясно информативно. Спасибо тебе, так держать, молодец что снимаешь такие познавательные видео
@MarchelloCSKAMoscow
@MarchelloCSKAMoscow 2 жыл бұрын
Сергей , вашей продуктивности можно позавидовать!
@user-he9wc5pq3f
@user-he9wc5pq3f Ай бұрын
Спасибо большое! Наконец-то я поняла этот алгоритм и связь префиксов и суффиксов)
@user-mu8wd3vn8s
@user-mu8wd3vn8s 6 ай бұрын
Благодаря вам понял тонкий момент КМП, спасибо большое!
@alexk.6243
@alexk.6243 11 ай бұрын
Классный урок, интересная и содержательная подача!
@user-jo2ux1tm9y
@user-jo2ux1tm9y Жыл бұрын
Очень круто объясняешь! Спасибо за уроки!
@levinowak
@levinowak Жыл бұрын
Коммент в поддержку! Лучшее объяснение и отличная подача
@logistloglab5243
@logistloglab5243 Жыл бұрын
Надеюсь, что дорос до этого плейлиста. Сергей, спасибо!)
@evgenybratkovsky1486
@evgenybratkovsky1486 5 ай бұрын
Очень толково объясняете. Спасибо!
@luckytima2315
@luckytima2315 3 жыл бұрын
Ой супер вообще ))) Надеюсь будет много видео в данной рубрике :))
@Yornero
@Yornero 2 жыл бұрын
Классный алгоритм, прекрасный в своей простоте. Помню решал схожую задачу, но через хэширование
@justyar5781
@justyar5781 Жыл бұрын
Как раз сейчас алгоритмы смотрю = ) Спасибо за материал!
@dmitrykashlakov3831
@dmitrykashlakov3831 3 жыл бұрын
Очень хорошо объясняете
@Noklee
@Noklee Жыл бұрын
Начал смотреть за пару дней до олимпиады. Круть
@user-ty4nc7fk5q
@user-ty4nc7fk5q Жыл бұрын
Спасибо за такое классное объяснение 🔥
@donfedor007
@donfedor007 3 жыл бұрын
Добрый день! не смотрел пока весь в Flask и Django, но лайк однозначно!!!
@chimchimsterschannel161
@chimchimsterschannel161 Жыл бұрын
Сложно с первого раза понять) сегодня реализовал за O(m*n), надеюсь вскоре получится реализовать за О(m+n)) Сергей, спасибо вам большое, особенно за курс по ООП)
@user-vu7hz8hg1u
@user-vu7hz8hg1u 3 жыл бұрын
На счет знание алгоритмов это в первую очередь я с вами соглашусь уважаемый
@user-ee1lx1pe7n
@user-ee1lx1pe7n 2 жыл бұрын
Вы просто Гений!! Спасибище!!!
@Vlad1998996
@Vlad1998996 3 жыл бұрын
Сложно, но гениально.
@nemo917
@nemo917 2 жыл бұрын
Большое спасибо за видео!
@user-ej3iz3ty9g
@user-ej3iz3ty9g 8 ай бұрын
Красиво) Спасибо Вам большое)
@ryzhakovalexey5037
@ryzhakovalexey5037 3 жыл бұрын
Я до сих пор не понимаю, почему так мало просмотров у тебя на канале
@sainco3036
@sainco3036 3 жыл бұрын
Скоро будет много просмотров, а пока можно поддержать автора спонсорством.
@user-fn9vr6ef4v
@user-fn9vr6ef4v Жыл бұрын
Учеба дело очень энергозатратное)) Мозг обывателя гораздо охотнее поглощает тик-ток))
@Grigoryshaw
@Grigoryshaw Жыл бұрын
Ответ прост: очень мало заинтересованных этой темой
@rpuropu
@rpuropu 3 жыл бұрын
гениальный алгоритм).. сигарета потухла давно) перематывал раз 20..)
@michaelshulga5560
@michaelshulga5560 3 жыл бұрын
за алгоритмы однозначно лайк
@kpacccavchik
@kpacccavchik 3 жыл бұрын
ничего не понял, но так интересно, что поскорее хочется начать изучать )
@study_land_pinsk1004
@study_land_pinsk1004 Жыл бұрын
Сергей, вы вылучший! Пол года уже изучаю Python и ML по разным русскоязычным и англоязычным курсам. Как устроюсь на работу обязательно отблагодарю "$ THANKS" )
@user-wg2tb1hy6g
@user-wg2tb1hy6g 11 ай бұрын
Устроился?
@fyyann5944
@fyyann5944 10 ай бұрын
Тоже интересно Решил изучать питон, ибо тема интересна и привлекает идея работать в айти
@hunya_k
@hunya_k 8 ай бұрын
Спасибо, очень понятно!
@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("образ не найден") ```
@wadahalgabri560
@wadahalgabri560 Жыл бұрын
Спасибо Очень помогло !
@versus666jzx
@versus666jzx 2 жыл бұрын
13:40 не совсем корректно звучит "пи от нуля" и т.д. в данном случае, тут же все таки индексы некоторого списка, а не функция) Огромное спасибо за труд, все очень доходчиво!
@user-wm3sb9gj7q
@user-wm3sb9gj7q Жыл бұрын
спасибо огромное!
@nikitabbrv5947
@nikitabbrv5947 2 жыл бұрын
Хочется весь плейлист сразу в оперативку себе подгрузить)
@greentea2619
@greentea2619 4 ай бұрын
лучше в жесткий будет конечно
@user-pd8te8cu8o
@user-pd8te8cu8o Жыл бұрын
потрясающе
@TheSadmint
@TheSadmint 3 жыл бұрын
спасибо за видео! А регулярные выражения именно этот алгоритм используют?
@plunk6774
@plunk6774 Жыл бұрын
Спасибо за ролик, очень понятно! А как вы учили алгоритмы?
@viktorzherekhin8590
@viktorzherekhin8590 7 ай бұрын
Для целей обучения полезно взять описание алгоритма и пытаться самому реализовать его на Пайтон. И потом проверить, чтобы получился одинаковый результат. Т.к. одно и то же можно реализовать по-разному. Тот же список, к примеру, можно заранее задать с конкретными элементами (нулями, к примеру), а можно формировать в процессе выполнения цикла (pi.append(0)). Можно сделать через цикл for, можно - через while, и т.д.
@silentlyow
@silentlyow 2 жыл бұрын
Еще можно на основе хэшей, посчитать хэш строки и хэш того что нужно найти и уже пройтись по строке и посмотреть есть ли одинаковые, сложность O(n)
@1984Nik1
@1984Nik1 3 жыл бұрын
супер
@user-vu7hz8hg1u
@user-vu7hz8hg1u 3 жыл бұрын
Хотелось бы по-больше инфы по алгоритмам
@pythonofsky4545
@pythonofsky4545 5 ай бұрын
Классно! Жаль, невелик список алгоритмов в плэйлисте.
@slava_zxz
@slava_zxz 3 ай бұрын
Спасибо
@MrIgor989
@MrIgor989 3 жыл бұрын
Ты гений
@DDR4605
@DDR4605 7 ай бұрын
Посмотрел один раз, потом записал конспект, потом решил одну задачку со шпорой, смотрю второй раз. Начал что-то понимать…😮
@andreiviltouski2390
@andreiviltouski2390 3 жыл бұрын
👍
@nullnull557
@nullnull557 Жыл бұрын
Почему-то момент j = p[j-1] никто не обсуждает, хотя именно к нему нужно уделить внимание в первую очередь. Не понятно как к нему пришли
@nullnull557
@nullnull557 Жыл бұрын
Если префикс не подошёл, тогда нужно ее длину уменьшить. Максимально эффективно брать длину максимального префикса для самого префикса.
@ankhmarcius8331
@ankhmarcius8331 3 жыл бұрын
если уже смотрел алгоритм в питоне, то понимаешь что m=len(a), в видео же, не оговаривается о какой m идет разговор, и почему j=m
@ShadowStormlq5mwdasd
@ShadowStormlq5mwdasd 10 ай бұрын
Интересно в чём и как Вы делаете ваши уроки?
@alphonsecapone8218
@alphonsecapone8218 3 жыл бұрын
Доброго времени суток) Прошу прощения и ни на что не претендую, просто учусь и стараюсь разобраться. Из того что я на данный момент понял про концепцию большого О - умножение подразумевает под собой вложенный цикл. А в прямом поиске его нет (по крайней мере в версии, которую я попробовал написать). И получается что его сложность в общем случае зависит только от размера источника поиска - О(n). Это может хоть как-то быть правильно? Просто я попробовал замерить скорости у этих алгоритмов и из кучи прогонов только раз смог добиться того чтобы КМП обогнал прямой и то только когда сделал для него все условия (красивые, для больших пропусков, повторения букв и всё такое).
@ubershh
@ubershh 2 жыл бұрын
Концепция Big O подразумевает не в общем случае, а "в худшем случае", а при прямом поиске для каждой буквы строки в худшем случае придется проходится по каждой букве образца, отсюда и получается O(m*n)
@nitra-hl2fj
@nitra-hl2fj 3 жыл бұрын
Видео хорошее, только непонятно: зачем вынесли последнее условие из цикла while? Образ "лилила" в конце строки "лилилось лилила" одновременно выдаст и "образ найден" и "образ не найден"
@selfedu_rus
@selfedu_rus 3 жыл бұрын
Да, согласен, недосмотрел! Можно поправить вот так: if i == n and j != m: Условие вне цикла, чтобы не выполнять лишние операторы в теле цикла. Исправил программу на github.
@dvd6307
@dvd6307 3 жыл бұрын
Да ты серьезно? Я не успел ещё посмотреть остальные плейлисты, а тут новое. Круто конечно, но... Что мне делать?
@viktorkomlev5804
@viktorkomlev5804 3 жыл бұрын
смотри плейлисты по порядку, но когда появляются видео с алгоритмами, залетай туда, знание алгоритмов в работе программиста, важнее, чем умение набирать код
@sainco3036
@sainco3036 3 жыл бұрын
Жаль, django закончилось, я только вошел во вкус)
@UrTa91
@UrTa91 Жыл бұрын
Ну пожалуйста можно в темном цвете делать презентация смотрю ночью мне пипец как ярко
@bonie3044
@bonie3044 3 жыл бұрын
я смотрел твой плейлист по flask как я тут оказался?
@MrJannes
@MrJannes 3 жыл бұрын
Мы префикс функцию используем только один раз или после каждого при "прикладывания" образца к тексту?
@selfedu_rus
@selfedu_rus 3 жыл бұрын
префиксы формируются на 1-м этапе до поиска образца, затем, на 2-м этапе при несовпадении символов используется сдвиг на вычисленный префикс на 1-м этапе
@RedkeiGost
@RedkeiGost 10 ай бұрын
Только в английской Википедии и нагуглил упомянание, что Кнут в примечаниях работы "Selected Papers on Design of Algorithms" писал про Матиясевича. И больше ничего. Найти бы ещё какой-то материал, подробнее да убедительнее. Если он первый опубликовал, то где он опубликовал? В той же Википедии ссылка на Кнута и работу Матиясевича 1971 года.
@RedkeiGost
@RedkeiGost 9 күн бұрын
@@deniskamal подробнее, это когда больше подробностей.
@RedkeiGost
@RedkeiGost 9 күн бұрын
@@deniskamal которые убеждают. Очевидно же.
@user-wl6mp6nk2m
@user-wl6mp6nk2m Жыл бұрын
Так какой алгоритм лучше: КМП или БМХ ?
@user-pg6mb6il1c
@user-pg6mb6il1c 3 жыл бұрын
Давай джанго , плиз
@user-ny9ux9ss8n
@user-ny9ux9ss8n 5 ай бұрын
Это где применяется ? В каких проектах ?
@begula_chan
@begula_chan Жыл бұрын
Можно регулярным выражением сделать
@ceo-s
@ceo-s Жыл бұрын
Подскажите пожалуйста, зачем всё таки брать п[ j-1 ] при формировании массива п если можно просто поставить 0. Префиксы то всё равно все сначала идут
@DDR4605
@DDR4605 7 ай бұрын
Это условие если j>0
@tenelokis
@tenelokis Жыл бұрын
Полчаса пролетели за минуту 🙂
@RocetDev
@RocetDev 3 жыл бұрын
Привет друг. Я тебе рекомендую сделать свой курс на stepik что бы прибавить аудиторию
@selfedu_rus
@selfedu_rus 3 жыл бұрын
Спасибо, в ближайших планах )
@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, данную разницу вы игнорируете как не значительную? Или я не правильно считаю?
@ShadowStormlq5mwdasd
@ShadowStormlq5mwdasd 10 ай бұрын
Этот алгоритм используется в python? Например в str.find() и всех похожим функциям? Кто знает?
@licantrop609
@licantrop609 10 ай бұрын
Скорее всего в str.__contains__() используется.
@owenearmusic
@owenearmusic 2 жыл бұрын
Мое лицо когда пытаюсь осознать этот алгоритм 6:42
@dazdess
@dazdess 2 жыл бұрын
А можно ли тут обойтись регулярными выражениями? Насколько этот алгоритм будет быстрее работать чем регулярные выражения?
@selfedu_rus
@selfedu_rus 2 жыл бұрын
Если просто найти образец в строке, то подобные алгоритмы будут работать быстрее регулярок. (При условии, что программа делается на С++, а не Python). Если же используете Python, то опять же, лучше брать соответствующие методы строк: count(), index(), find() и т.п. Регулярные - это более изощренный инструмент для тонкой обработки.
@user-hr8vo2jy5c
@user-hr8vo2jy5c Жыл бұрын
Регулярные выражения?
@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
@janibektursynbaev
@janibektursynbaev 2 жыл бұрын
пишет не найдено
@user-rf9nl9bl4j
@user-rf9nl9bl4j 4 ай бұрын
Скажите пожалуйста в какой программе пишите код
@selfedu_rus
@selfedu_rus 4 ай бұрын
PyCharm
@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 7 ай бұрын
а в чем логика здесь вообще? зачем мы каждой отдельной буквой обозначаем номер буквы образца? Зачем здесь инициализация 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-ec5nx5gd2j
@user-ec5nx5gd2j Ай бұрын
А я ничего не поняла
@maiorchiks3107
@maiorchiks3107 2 жыл бұрын
ничего не понял (((
@user-gd4en4ot3u
@user-gd4en4ot3u 7 ай бұрын
так себе понятно... хотя это не удивительно, ведь речь идет об алгоритмах. Самое бесячее, что нельзя задать какой то вопрос в моменте
@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 7 ай бұрын
Опять гонки какой язык лучше🤡Под определенную задачу свой язык
@user-un8ns5uc9j
@user-un8ns5uc9j 7 ай бұрын
А если сравнивать текст с образцом по букве а и в случае совпадения сравнивать всё?
Would you like a delicious big mooncake? #shorts#Mooncake #China #Chinesefood
00:30
Countries Treat the Heart of Palestine #countryballs
00:13
CountryZ
Рет қаралды 28 МЛН
When someone reclines their seat ✈️
00:21
Adam W
Рет қаралды 29 МЛН
Алгоритм Кнута-Морриса-Пратта
25:44
Roman Tsarev
Рет қаралды 74 М.
How To Learn Algorithms? Why? #codonaft
19:22
codonaft
Рет қаралды 561 М.
Рекурсивные алгоритмы на языке С++
15:13
Оксана Еськова. Основы программирования
Рет қаралды 69
Задача из Собеседования на 160,000 Евро в Год
13:27
Саша Лукин
Рет қаралды 1,1 МЛН
Алгоритмы на Python 3. Лекция №1
1:20:50
Тимофей Хирьянов
Рет қаралды 5 МЛН
Лучшие моменты в Истории Minecraft
14:37
dren
Рет қаралды 1,2 МЛН