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

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

Пікірлер: 112

  • @user-fd8yb4xw1v
    @user-fd8yb4xw1v3 жыл бұрын

    Сергей, спасибо большое. Вы так разорите товарищей с платных курсов

  • @kadabrochka1252

    @kadabrochka1252

    22 күн бұрын

    Не разорит. Практически тот же самый курс и материал есть на канале у Roman Tsarev (и выложен он еще 6 лет назад). Однако, мне нравится манера Сергея излагать материал.

  • @s979n2
    @s979n23 жыл бұрын

    Спасибо за труд! Отличное объяснение

  • @MarchelloCSKAMoscow
    @MarchelloCSKAMoscow2 жыл бұрын

    Сергей , вашей продуктивности можно позавидовать!

  • @mrfang5908
    @mrfang59082 жыл бұрын

    Увидел свежее видео, пошел в плейлист, Сергей такое ощущение что вы прям выкладываете что мне надо, спасибо, хорошо объясняете

  • @sergey6453
    @sergey64532 жыл бұрын

    Спасибо, очень доступно объясняете, прекрасная наглядная презентация, а также большое количество примеров и пояснений. Все в миг стало понятно!

  • @user-ou7pi2wp8n
    @user-ou7pi2wp8n Жыл бұрын

    Сергей, спасибо большое! Очень подробное и понятное объяснение! Каждый момент, который бы мог стать сложным, с Вашей подачей абсолютно понятен. Благодаря Вашим курсам и видеороликам получаю зачеты и пятерки на экзаменах в университете =) Спасибо еще раз)

  • @nikolaytalkov2525
    @nikolaytalkov2525 Жыл бұрын

    Класс испытал истинное удовольствие от просмотра видео, четко ясно информативно. Спасибо тебе, так держать, молодец что снимаешь такие познавательные видео

  • @user-mu8wd3vn8s
    @user-mu8wd3vn8s5 ай бұрын

    Благодаря вам понял тонкий момент КМП, спасибо большое!

  • @user-he9wc5pq3f
    @user-he9wc5pq3f28 күн бұрын

    Спасибо большое! Наконец-то я поняла этот алгоритм и связь префиксов и суффиксов)

  • @evgenybratkovsky1486
    @evgenybratkovsky14864 ай бұрын

    Очень толково объясняете. Спасибо!

  • @user-jo2ux1tm9y
    @user-jo2ux1tm9y Жыл бұрын

    Очень круто объясняешь! Спасибо за уроки!

  • @alexk.6243
    @alexk.624311 ай бұрын

    Классный урок, интересная и содержательная подача!

  • @levinowak
    @levinowak11 ай бұрын

    Коммент в поддержку! Лучшее объяснение и отличная подача

  • @logistloglab5243
    @logistloglab5243 Жыл бұрын

    Надеюсь, что дорос до этого плейлиста. Сергей, спасибо!)

  • @dmitrykashlakov3831
    @dmitrykashlakov38313 жыл бұрын

    Очень хорошо объясняете

  • @user-ee1lx1pe7n
    @user-ee1lx1pe7n2 жыл бұрын

    Этот алгоритм легче понять, если пропустить через дебаггер в пайчарме. Я его перезаписал с более наглядными названиями переменных. Если поставить на 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 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 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("образ не найден") ```

  • @luckytima2315
    @luckytima23153 жыл бұрын

    Ой супер вообще ))) Надеюсь будет много видео в данной рубрике :))

  • @Noklee
    @Noklee Жыл бұрын

    Начал смотреть за пару дней до олимпиады. Круть

  • @Yornero
    @Yornero2 жыл бұрын

    Классный алгоритм, прекрасный в своей простоте. Помню решал схожую задачу, но через хэширование

  • @donfedor007
    @donfedor0073 жыл бұрын

    Добрый день! не смотрел пока весь в Flask и Django, но лайк однозначно!!!

  • @user-ty4nc7fk5q
    @user-ty4nc7fk5q Жыл бұрын

    Спасибо за такое классное объяснение 🔥

  • @justyar5781
    @justyar5781 Жыл бұрын

    Как раз сейчас алгоритмы смотрю = ) Спасибо за материал!

  • @chimchimsterschannel161
    @chimchimsterschannel161 Жыл бұрын

    Сложно с первого раза понять) сегодня реализовал за O(m*n), надеюсь вскоре получится реализовать за О(m+n)) Сергей, спасибо вам большое, особенно за курс по ООП)

  • @user-ee1lx1pe7n
    @user-ee1lx1pe7n2 жыл бұрын

    Вы просто Гений!! Спасибище!!!

  • @user-vu7hz8hg1u
    @user-vu7hz8hg1u3 жыл бұрын

    На счет знание алгоритмов это в первую очередь я с вами соглашусь уважаемый

  • @Vlad1998996
    @Vlad19989963 жыл бұрын

    Сложно, но гениально.

  • @nemo917
    @nemo9172 жыл бұрын

    Большое спасибо за видео!

  • @user-ej3iz3ty9g
    @user-ej3iz3ty9g7 ай бұрын

    Красиво) Спасибо Вам большое)

  • @ryzhakovalexey5037
    @ryzhakovalexey50373 жыл бұрын

    Я до сих пор не понимаю, почему так мало просмотров у тебя на канале

  • @sainco3036

    @sainco3036

    3 жыл бұрын

    Скоро будет много просмотров, а пока можно поддержать автора спонсорством.

  • @user-fn9vr6ef4v

    @user-fn9vr6ef4v

    Жыл бұрын

    Учеба дело очень энергозатратное)) Мозг обывателя гораздо охотнее поглощает тик-ток))

  • @Grigoryshaw

    @Grigoryshaw

    Жыл бұрын

    Ответ прост: очень мало заинтересованных этой темой

  • @michaelshulga5560
    @michaelshulga55603 жыл бұрын

    за алгоритмы однозначно лайк

  • @TheSadmint
    @TheSadmint3 жыл бұрын

    спасибо за видео! А регулярные выражения именно этот алгоритм используют?

  • @hunya_k
    @hunya_k7 ай бұрын

    Спасибо, очень понятно!

  • @study_land_pinsk1004
    @study_land_pinsk1004 Жыл бұрын

    Сергей, вы вылучший! Пол года уже изучаю Python и ML по разным русскоязычным и англоязычным курсам. Как устроюсь на работу обязательно отблагодарю "$ THANKS" )

  • @user-wg2tb1hy6g

    @user-wg2tb1hy6g

    11 ай бұрын

    Устроился?

  • @fyyann5944

    @fyyann5944

    10 ай бұрын

    Тоже интересно Решил изучать питон, ибо тема интересна и привлекает идея работать в айти

  • @rpuropu
    @rpuropu3 жыл бұрын

    гениальный алгоритм).. сигарета потухла давно) перематывал раз 20..)

  • @viktorzherekhin8590
    @viktorzherekhin85907 ай бұрын

    Для целей обучения полезно взять описание алгоритма и пытаться самому реализовать его на Пайтон. И потом проверить, чтобы получился одинаковый результат. Т.к. одно и то же можно реализовать по-разному. Тот же список, к примеру, можно заранее задать с конкретными элементами (нулями, к примеру), а можно формировать в процессе выполнения цикла (pi.append(0)). Можно сделать через цикл for, можно - через while, и т.д.

  • @kpacccavchik
    @kpacccavchik3 жыл бұрын

    ничего не понял, но так интересно, что поскорее хочется начать изучать )

  • @wadahalgabri560
    @wadahalgabri560 Жыл бұрын

    Спасибо Очень помогло !

  • @versus666jzx
    @versus666jzx2 жыл бұрын

    13:40 не совсем корректно звучит "пи от нуля" и т.д. в данном случае, тут же все таки индексы некоторого списка, а не функция) Огромное спасибо за труд, все очень доходчиво!

  • @nullnull557
    @nullnull557 Жыл бұрын

    Почему-то момент j = p[j-1] никто не обсуждает, хотя именно к нему нужно уделить внимание в первую очередь. Не понятно как к нему пришли

  • @nullnull557

    @nullnull557

    Жыл бұрын

    Если префикс не подошёл, тогда нужно ее длину уменьшить. Максимально эффективно брать длину максимального префикса для самого префикса.

  • @plunk6774
    @plunk6774 Жыл бұрын

    Спасибо за ролик, очень понятно! А как вы учили алгоритмы?

  • @user-pd8te8cu8o
    @user-pd8te8cu8o Жыл бұрын

    потрясающе

  • @user-wm3sb9gj7q
    @user-wm3sb9gj7q Жыл бұрын

    спасибо огромное!

  • @nikitabbrv5947
    @nikitabbrv59472 жыл бұрын

    Хочется весь плейлист сразу в оперативку себе подгрузить)

  • @greentea2619

    @greentea2619

    3 ай бұрын

    лучше в жесткий будет конечно

  • @slava_zxz
    @slava_zxz2 ай бұрын

    Спасибо

  • @silentlyow
    @silentlyow2 жыл бұрын

    Еще можно на основе хэшей, посчитать хэш строки и хэш того что нужно найти и уже пройтись по строке и посмотреть есть ли одинаковые, сложность O(n)

  • @1984Nik1
    @1984Nik13 жыл бұрын

    супер

  • @ShadowStormlq5mwdasd
    @ShadowStormlq5mwdasd10 ай бұрын

    Интересно в чём и как Вы делаете ваши уроки?

  • @MrIgor989
    @MrIgor9893 жыл бұрын

    Ты гений

  • @user-vu7hz8hg1u
    @user-vu7hz8hg1u3 жыл бұрын

    Хотелось бы по-больше инфы по алгоритмам

  • @alphonsecapone8218
    @alphonsecapone82183 жыл бұрын

    Доброго времени суток) Прошу прощения и ни на что не претендую, просто учусь и стараюсь разобраться. Из того что я на данный момент понял про концепцию большого О - умножение подразумевает под собой вложенный цикл. А в прямом поиске его нет (по крайней мере в версии, которую я попробовал написать). И получается что его сложность в общем случае зависит только от размера источника поиска - О(n). Это может хоть как-то быть правильно? Просто я попробовал замерить скорости у этих алгоритмов и из кучи прогонов только раз смог добиться того чтобы КМП обогнал прямой и то только когда сделал для него все условия (красивые, для больших пропусков, повторения букв и всё такое).

  • @ubershh

    @ubershh

    2 жыл бұрын

    Концепция Big O подразумевает не в общем случае, а "в худшем случае", а при прямом поиске для каждой буквы строки в худшем случае придется проходится по каждой букве образца, отсюда и получается O(m*n)

  • @pythonofsky4545
    @pythonofsky45455 ай бұрын

    Классно! Жаль, невелик список алгоритмов в плэйлисте.

  • @RedkeiGost
    @RedkeiGost9 ай бұрын

    Только в английской Википедии и нагуглил упомянание, что Кнут в примечаниях работы "Selected Papers on Design of Algorithms" писал про Матиясевича. И больше ничего. Найти бы ещё какой-то материал, подробнее да убедительнее. Если он первый опубликовал, то где он опубликовал? В той же Википедии ссылка на Кнута и работу Матиясевича 1971 года.

  • @nitra-hl2fj
    @nitra-hl2fj3 жыл бұрын

    Видео хорошее, только непонятно: зачем вынесли последнее условие из цикла while? Образ "лилила" в конце строки "лилилось лилила" одновременно выдаст и "образ найден" и "образ не найден"

  • @selfedu_rus

    @selfedu_rus

    3 жыл бұрын

    Да, согласен, недосмотрел! Можно поправить вот так: if i == n and j != m: Условие вне цикла, чтобы не выполнять лишние операторы в теле цикла. Исправил программу на github.

  • @bonie3044
    @bonie30443 жыл бұрын

    я смотрел твой плейлист по flask как я тут оказался?

  • @andreiviltouski2390
    @andreiviltouski23903 жыл бұрын

    👍

  • @MrJannes
    @MrJannes3 жыл бұрын

    Мы префикс функцию используем только один раз или после каждого при "прикладывания" образца к тексту?

  • @selfedu_rus

    @selfedu_rus

    3 жыл бұрын

    префиксы формируются на 1-м этапе до поиска образца, затем, на 2-м этапе при несовпадении символов используется сдвиг на вычисленный префикс на 1-м этапе

  • @ankhmarcius8331
    @ankhmarcius83313 жыл бұрын

    если уже смотрел алгоритм в питоне, то понимаешь что m=len(a), в видео же, не оговаривается о какой m идет разговор, и почему j=m

  • @user-wl6mp6nk2m
    @user-wl6mp6nk2m Жыл бұрын

    Так какой алгоритм лучше: КМП или БМХ ?

  • @user-ny9ux9ss8n
    @user-ny9ux9ss8n5 ай бұрын

    Это где применяется ? В каких проектах ?

  • @DDR4605
    @DDR46056 ай бұрын

    Посмотрел один раз, потом записал конспект, потом решил одну задачку со шпорой, смотрю второй раз. Начал что-то понимать…😮

  • @ceo-s
    @ceo-s11 ай бұрын

    Подскажите пожалуйста, зачем всё таки брать п[ j-1 ] при формировании массива п если можно просто поставить 0. Префиксы то всё равно все сначала идут

  • @DDR4605

    @DDR4605

    6 ай бұрын

    Это условие если j>0

  • @riplock77
    @riplock773 жыл бұрын

    Сдравстуйте, подскажите пожалуйста как сделать чтобы при запуске 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, данную разницу вы игнорируете как не значительную? Или я не правильно считаю?

  • @UrTa91
    @UrTa9111 ай бұрын

    Ну пожалуйста можно в темном цвете делать презентация смотрю ночью мне пипец как ярко

  • @ShadowStormlq5mwdasd
    @ShadowStormlq5mwdasd10 ай бұрын

    Этот алгоритм используется в python? Например в str.find() и всех похожим функциям? Кто знает?

  • @licantrop609

    @licantrop609

    10 ай бұрын

    Скорее всего в str.__contains__() используется.

  • @dvd6307
    @dvd63073 жыл бұрын

    Да ты серьезно? Я не успел ещё посмотреть остальные плейлисты, а тут новое. Круто конечно, но... Что мне делать?

  • @viktorkomlev5804

    @viktorkomlev5804

    3 жыл бұрын

    смотри плейлисты по порядку, но когда появляются видео с алгоритмами, залетай туда, знание алгоритмов в работе программиста, важнее, чем умение набирать код

  • @user-hr8vo2jy5c
    @user-hr8vo2jy5c Жыл бұрын

    Регулярные выражения?

  • @dazdess
    @dazdess2 жыл бұрын

    А можно ли тут обойтись регулярными выражениями? Насколько этот алгоритм будет быстрее работать чем регулярные выражения?

  • @selfedu_rus

    @selfedu_rus

    2 жыл бұрын

    Если просто найти образец в строке, то подобные алгоритмы будут работать быстрее регулярок. (При условии, что программа делается на С++, а не Python). Если же используете Python, то опять же, лучше брать соответствующие методы строк: count(), index(), find() и т.п. Регулярные - это более изощренный инструмент для тонкой обработки.

  • @sainco3036
    @sainco30363 жыл бұрын

    Жаль, django закончилось, я только вошел во вкус)

  • @user-rf9nl9bl4j
    @user-rf9nl9bl4j4 ай бұрын

    Скажите пожалуйста в какой программе пишите код

  • @selfedu_rus

    @selfedu_rus

    4 ай бұрын

    PyCharm

  • @janibektursynbaev
    @janibektursynbaev2 жыл бұрын

    пишет не найдено

  • @begula_chan
    @begula_chan Жыл бұрын

    Можно регулярным выражением сделать

  • @user-pg6mb6il1c
    @user-pg6mb6il1c3 жыл бұрын

    Давай джанго , плиз

  • @tenelokis
    @tenelokis Жыл бұрын

    Полчаса пролетели за минуту 🙂

  • @RocetDev
    @RocetDev3 жыл бұрын

    Привет друг. Я тебе рекомендую сделать свой курс на stepik что бы прибавить аудиторию

  • @selfedu_rus

    @selfedu_rus

    3 жыл бұрын

    Спасибо, в ближайших планах )

  • @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 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 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

  • @owenearmusic
    @owenearmusic2 жыл бұрын

    Мое лицо когда пытаюсь осознать этот алгоритм 6:42

  • @user-ec5nx5gd2j
    @user-ec5nx5gd2j24 күн бұрын

    А я ничего не поняла

  • @maiorchiks3107
    @maiorchiks31072 жыл бұрын

    ничего не понял (((

  • @user-ox7kc4fd1m
    @user-ox7kc4fd1m2 жыл бұрын

    интересно почему этот вариант не работает 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
    @janibektursynbaev2 жыл бұрын

    в чем тут ошибка? #include using namespace std; string find(string s, string a, vector pi){ int i = 0; int j = 0; while(i

  • @user-gd4en4ot3u
    @user-gd4en4ot3u7 ай бұрын

    так себе понятно... хотя это не удивительно, ведь речь идет об алгоритмах. Самое бесячее, что нельзя задать какой то вопрос в моменте

  • @lubovd5335
    @lubovd53353 жыл бұрын

    Матиясевич Советский ученый, а не русский

  • @selfedu_rus

    @selfedu_rus

    3 жыл бұрын

    Русскую национальность никто не отменял, см. в википедии: ru.wikipedia.org/wiki/Матиясевич,_Юрий_Владимирович

  • @user-st7gn4yk8q
    @user-st7gn4yk8q3 жыл бұрын

    Python - это хорошо, но JS ещё лучше)

  • @fghinty7623

    @fghinty7623

    3 жыл бұрын

    а?

  • @nadyamoscow2461

    @nadyamoscow2461

    3 жыл бұрын

    JS тут тоже есть. Правда, не знаю, чем оно лучше, чем Python

  • @fontyfx6843

    @fontyfx6843

    3 жыл бұрын

    Наоборот

  • @whitepepper742

    @whitepepper742

    7 ай бұрын

    Опять гонки какой язык лучше🤡Под определенную задачу свой язык

  • @user-un8ns5uc9j
    @user-un8ns5uc9j7 ай бұрын

    А если сравнивать текст с образцом по букве а и в случае совпадения сравнивать всё?

Келесі