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

Я сейчас изучаю алгоритмы, и разница во времени между этими двумя кодами более чем в 100 раз.

input

  • Длина строки находится в диапазоне 1<= Length <= 1000000

Эти два кода являются частью кода, используемого для решения задачи алгоритма.

string cutstring(string str, int i, int j) {
    string cup = "";
    for (int p = i; p <= j; p++) {
        cup += str[p];
    }
    return cup;
}

bool strComp(string str,int i,int j) {
    if (cutstring(str, i, j) == "IOI")
        return 1;
    else
        return 0;
}

Этот код быстрее, чем первый код.

bool strComp(string str,int i,int j) {
    if (str[i] == 'I' && str[i+1]=='O' && str[i+2] == 'I')
        return 1;
    else
        return 0;
}

Мне интересно, почему такая значительная разница во времени между этими двумя кодами Любое объяснение будет полезно и высоко оценено.

Ну, вызов функции имеет некоторое влияние на производительность? Также проверьте, включены ли все флаги оптимизации.

πάντα ῥεῖ 04.04.2023 12:35

Всегда ли ji+2? Потому что иначе эти функции не делают одно и то же. Также i лучше быть меньше, чем str.size()-2.

bitmask 04.04.2023 12:40

j всегда i+2

cppNewbie 04.04.2023 12:42

Потому что первая реализация использует безумно дорогие операции, такие как '+=', без видимой причины (и, вероятно, скомпилирована без оптимизаций, что гарантирует, что безумно дорогие операции никуда не денутся и останутся безумно дорогими).

n. m. 04.04.2023 12:47

Если j всегда i+2, в чем причина его существования?

molbdnilo 04.04.2023 12:53

В 1000 раз больше времени равно O(x). Даже в 10000000000 раз медленнее будет тот же O (x)

463035818_is_not_a_number 04.04.2023 12:57

Не используйте 1 и 0 для логических значений, используйте true и false. И if (boolean_expression) return true; else return false; --> return boolean_expression;

molbdnilo 04.04.2023 13:23
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
7
68
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Есть вещи, которые происходят в первом примере кода, но не происходят во втором, в частности:

  • строка str копируется в аргумент cutstring, поскольку она передается по значению (и, следовательно, должна быть скопирована). Для больших строк (длиной до 1000000) это может занять очень много времени, так как необходимо выделить новую память и скопировать всю строку.
  • строка cup в cutstring создается и расширяется несколько раз. На платформах, которые не используют оптимизацию небольших строк, это может привести к нескольким перераспределениям памяти.

Я думаю, что первый пункт является наиболее впечатляющим. Вы можете попробовать передать строку по ссылке (string const& str вместо string str) и посмотреть, изменит ли это время.

Второй момент трудно диагностировать удаленно, потому что вы не предоставили никакой информации о том, как вы компилируете свой код (какой компилятор и какие флаги компиляции) и как вы измеряете время. Как правило, эта информация жизненно важна для вопросов, связанных с производительностью / эталонными показателями.

И последнее замечание, если позволите: временная сложность не имеет ко всему этому никакого отношения. Как было указано в комментариях к вашему вопросу, постоянный фактор между временем выполнения означает, что два алгоритма имеют одинаковую сложность. Это прекрасный пример того, почему сложность времени выполнения представляет больше теоретический интерес, потому что для оценки фактической производительности вашего кода вы всегда должны измерять.

Другие вопросы по теме