Разница между concat строк s = s + "0" и s + = "0" в c ++ - PullRequest
0 голосов
/ 17 января 2019

Я хочу знать, какой из них лучше по «временной сложности» из этих двух:

for(int i=0;i<n;i++){
s=s+"0";
}

и

for(int i=0;i<n;i++){
s+="0";
}

Я решал вопрос и нашел «TLE (Time Limit Exceed)» при использовании первого подхода, но он работал для второго.

1 Ответ

0 голосов
/ 17 января 2019

Первый создает промежуточную строку (которая будет назначена на s после операции +), а вторая - нет (зависит от емкости строки).

Сложность в худшем случае одинакова в обоих случаях, в лучшем случае это просто копирование новой строки для второго случая с полной копией обеих строк для первого случая (+ выделение памяти и освобождение).

Тот факт, что ваш get TLE (Time Limit Exceeded), вероятно, из-за этого наихудшего случая все время копирует огромные строки, а не просто добавляет что-то к существующей (без перераспределения). Как и вектор, в string должна быть некоторая эвристика, чтобы заранее получить достаточную пропускную способность.

Как сказал @Slava, этот пример должен быть написан по-другому, я полагаю, что реальный код отличается.

...