Я сталкивался с вопросом в книге Взломать интервью с программистами (стр. 201), но его решение не имеет достаточного смысла. Итак, у нас есть следующий алгоритм сжатия строк:

String compressBad(String str)
{ 
  String compressedString = "";
  int countConsecutive = 0;
  for (int i = 0; i< str.length(); i++)
  {
    countConsecutive++;

    if (i + 1 >= str.length() || str.charAt(i) != str.charAt(i + 1))
    {
      compressedString += "" + str.charAt(i) +  countConsecutive;
      countConsecutive = 0;
    }
  }
    return compressedString.length() < str.length() ? compressedString : str;
}

Время выполнения этих алгоритмов определяется как O (p + k²) (p - размер строки, k - количество последовательностей символов). Почему у него "+ k²"?

1
netrox 23 Ноя 2019 в 21:34
2
Объединение строк (с использованием + или +=) является линейным, поэтому выполнение этого в линейном цикле делает его квадратичным.
 – 
Andy Turner
23 Ноя 2019 в 21:45
1
Обратите внимание, что перед возвратом вам не хватает }.
 – 
Andy Turner
23 Ноя 2019 в 21:48
Да, вы можете использовать StringBuilder, чтобы сделать его более эффективным. += является квадратичным, потому что он создает совершенно новую строку и добавляет ее в пул строк.
 – 
nice_dev
23 Ноя 2019 в 21:52
1
Объединенная строка не добавляется в пул строк. Единственный раз, когда строки, созданные во время выполнения, добавляются в пул, - это если вы вызываете intern().
 – 
Andy Turner
23 Ноя 2019 в 22:02
1
Использование интерна в принципе бесполезно.
 – 
Andy Turner
23 Ноя 2019 в 23:49

1 ответ

Операторы + и += для строк реализуются путем выделения нового фрагмента памяти, а затем копирования обеих строк в этот новый фрагмент.

Например что-то вроде

String s3 = s1 + s2; // s1, s2 are Strings

Реализуется скрытно, выделяя новую память размером s1 + размер s2, затем копируя в нее s1, затем s2.

По сложности это линейно по размеру строк.

И, как вы видите, может быть расточительным и медленным, и по этой причине его обычно следует избегать при объединении нескольких строк (например, в цикле).

1
hazirovich 23 Ноя 2019 в 22:02