Мне сложно понять, почему среднее время выполнения для алгоритма Рабина-Карпа равно O (n + m), где n - длина входной строки, а m - длина строка шаблона. Насколько я понимаю, время выполнения должно быть O (n + m) для всех n и m, даже если n и m очень большие.
Пусть наша функция хеширования возвращает целые числа от 1 до k. Тогда вероятность ложного столкновения в каждой позиции равна 1 / k, поэтому мы ожидаем получить в среднем O (n / k) ложных столкновений в дополнение к одному правильному совпадению хеширования (если совпадение есть). Таким образом, мы ожидаем O (1 + n / k) совпадений хеширования. Каждый раз, когда мы получаем совпадение, мы должны проверять в среднем O (m) символов, поэтому общее среднее время выполнения составляет O ((1 + n / k) * m).
Для малых n (n < > k), это O (n / k m) = O (n m). Таким образом, средняя сложность выполнения составляет O (n m) для больших n, что означает, что среднее время выполнения теоретически составляет O (n m), а не O (n + m). Но, конечно, обычно мы находимся в режиме n <