Новая Школа - онлайн-школа подготовки к ЕГЭ
Задача Задача №3574127
А
Аноним
27 февраля 2026 17:58 · публичный вопрос
А
Аноним

классификация КМП

Ответ нейросети
27 февраля 2026 17:58

КМП обычно расшифровывается как алгоритм Кнута–Морриса–Пратта (КМП). Это классический алгоритм для задачи поиска подстроки (образца) в тексте. Ниже — подробная классификация и пошаговое объяснение.

  1. Что такое КМП (кратко)
  • Задача: найти все вхождения образца P в тексте T.
  • Суть метода: заранее строим структуру префикс-функции для образца, чтобы в ходе прохода по тексту быстро определять, сколько символов образца совпало и на сколько можно сдвинуть образец без пропуска потенциального вхождения.
  • Особенность: работает за линейное время O(n + m) и использует O(m) памяти, где n — длина текста, m — длина образца.
  1. Классификация КМП по разным признакам
  • По задаче

    • Тип задачи: поиск подстроки (pattern matching) в строке.
  • По методу реализации

    • Основной подход: с префикс-функцией (pi) образца.
    • Альтернатива реализована через детерминированный конечный автомат (DFA), который можно построить на основе образца; современная реализации чаще используют префикс-функцию, так как она проще и потребляет меньше памяти.
  • По времени работы

    • Глобальная сложность: O(n + m) в худшем случае.
    • Достоинства: линейная зависимость по размеру текста и образца, без повторного прохода по тексту.
  • По памяти

    • Память: O(m) для хранения префикс-функции образца; иногда доп. память O(1) или константная дополнительная, если вычислять pi на лету.
  • По устойчивости к данным

    • Работает одинаково эффективно независимо от конкретного содержания текста и образца; в отличие от некоторых других алгоритмов, не ухудшается серьезно на «особых» входных данных.
  • По принципу работы

    • Один проход по тексту с «умным» сдвигом образца после несоответствия.
    • Используется префиксная информация, чтобы не возвращаться назад по тексту.
  • По применимости

    • Подходит для любых алфавитов; образец может содержать любые символы.
    • Хорош для длинных текстов и/или частого поиска разных образцов в одном и том же тексте.
  • По сравнению с другими алгоритмами

    • В сравнении с наивным методом: наивный может быть O(nm) в худшем случае, КМП достигает линейной сложности.
    • В сравнении с Boyer–Moore: BM обычно работает быстрее на среднем случае, но в худшем случае BM может быть медленнее; КМП гарантирует линейное время в худшем случае.
  1. Пошаговый разбор работы КМП (пояснение без тонкостей реализации)
  • Шаг A: построение префикс-функции pi для образца P[0..m-1]

    • pi[i] означает длину наибольшего proper-подсстроки, которая является префиксом P[0..i] и суффиксом этого же префикса.
    • Пример идеи: для образца "ABCDABD" вычисляем последовательность pi:
      • pi[0] = 0
      • pi[1] = 0 (A не совпадает с B)
      • pi[2] = 0
      • pi[3] = 0
      • pi[4] = 1 (потому что P[0] = 'A' совпадает с P[4] = 'A')
      • pi[5] = 2 (последовательности "AB" в начале и в конце подстроки "AB" совпадают)
      • pi[6] = 0
    • Итоговый массив pi для "ABCDABD" обычно: [0, 0, 0, 0, 1, 2, 0].
  • Шаг B: проход по тексту T[0..n-1] с помощью образца P[0..m-1]

    • держим текущую длину совпадения q (0 ≤ q ≤ m).
    • Для каждого символа T[i]:
      • пока q > 0 и P[q] != T[i], уменьшаем q до pi[q-1] (перемещаем образец по префиксу).
      • если P[q] == T[i], увеличиваем q на 1.
      • если q достигло m, найдено вхождение образца в текст на позиции i - m + 1; затем устанавливаем q = pi[q-1] для продолжения поиска (что позволяет находить последующие вхождения, включая перекрывающиеся).
  • Шаг C: интерпретация результата

    • Каждое совпадение, найденное на позиции i - m + 1, является началом вхождения образца в тексте.
  1. Пример (упрощённый, чтобы понять идею)
  • Образец P = "ABCDABD" (m = 7)
  • Текст T = "ABC ABCDAB ABCDABCDABCDABD"
    • Вычисляем pi для образца: [0, 0, 0, 0, 1, 2, 0]
    • Проходим по тексту, отслеживая q и используя pi при несовпадениях.
    • В конечном результате обнаруживаем все вхождения образца в текст.

Примечание: в реальной задаче можно привести конкретный текст и получить конкретные позиции вхождений. Если пришлёшь свой текст и образец, могу пройтись по шагам с именно твоими числами.

  1. Когда использовать КМП
  • Когда важна линейная верхняя граница по размеру входа.
  • Когда нужен надёжный и понятный подход с хорошей гарантией времени.
  • Когда образец может повторяться внутри текста и нужна корректная обработка перекрывающихся вхождений.
  1. Что важно запомнить
  • Основной зур вопроса: как строится префикс-функция и как на её основе выполняется поиск.
  • КМП не «перепрыгивает» по тексту назад; он сдвигает образец по префикс-функции, что сохраняет линейную сложность.
  • В реальных задачах можно реализовывать двумя способами: через pi-массив или через автомат; pi-массив чаще проще и экономнее по памяти.

Если хочешь, могу адаптировать объяснение под твой уровень (школа, 9-11 класс) и привести конкретный пример с твоими текстом и образцом. Просто пришли образец и текст, и я дам пошаговый разбор с вычислениями. Также скажи, какой именно предмет/класс у тебя запрошены — если это информатика/программирование, стиль и глубина можно подстроить под соответствующий уровень.