Так как нужно найти один конкретный символ, а в строке - n символов, то проверить в худшем случае нужно будет все элементы. Значит, сложность будет равна O(n) - сколько элементов, столько и сравнений.
В строке было 9 букв, цикл сработал 9 раз, и мы нашли нужную букву. Всё сходится, и сложность O(n) подтвердилась, но что, если бы мы выполняли поиск в строке “algorithm”? Тогда бы мы нашли букву а на первой же итерации, цикл бы завершился и, получается, сложность была бы O(1)? Нет. Big O говорит как раз о худшем случае для алгоритма. Когда пишем О(n), мы гарантируем, что, даже если всё будет плохо, мы найдём букву максимум за O(n).
Поиск подстроки в строке
Усложним предыдущую задачу: попробуем найти не один символ в строке, а маленькую строку внутри большой (подстроку в строке).
main_string = ‘Hello world!’ - основная строка. sub_string = ‘ow’ - подстрока, которую алгоритм будет искать в основной строке.
Для решения «в лоб», с перебором всех вариантов, нужно пройти почти по всем символам строки и проверить, не начинается ли с текущего символа искомая нами подстрока. Мы берём символ, а затем начинаем цикл, сравнивая этот символ и следующие с подстрокой.
Этот метод может быть неэффективным для длинных строк, так как его сложность составляет O(main_length * sub_length), где main_length - длина строки, а sub_length - длина подстроки. Однако это простой и понятный способ реализовать поиск подстроки в строке.
Проверка палиндрома
Палиндром - слово, фраза или последовательность символов, которые читаются одинаково ltr и rtl.
Например, слова «довод» и «комок» - палиндромы, потому что они читаются одинаково в обоих направлениях. Также палиндромами могут быть числа, такие как 121 или 12321.
Если есть строка text и нужно проверить, является ли она палиндромом, нужно убедиться, что символы её первой половины равны символам второй. Сделать это можно разными способами - рассмотрим несколько самых простых, которые можно реализовать без изучения дополнительных инструментов (кроме разве что индексов).
Вариант 1 (без использования индексов)
Так как для этого алгоритма нам надо пройти по каждому элементу строки, сложность такого алгоритма будет равна O(n).
Вариант 2 (с использованием индексов)
Здесь мы перебираем не все элементы строки, а половину (длина строки // 2). Потому что за одну итерацию проверяем сразу 2 символа, один - с начала строки (индекс i), другой - с конца (-i - 1), а центральный символ нам вообще проверять нет необходимости.
Получается, что этот алгоритм эффективнее предыдущего - его сложность примерно равна O(n/2). Она не дотягивает до O(log n), но это всё же лучше, чем O(n).