Открыть сервисСервис

Конкатенация — объединение строк

Конкатенация — это операция объединения двух или более последовательностей (строк, массивов, списков) в одну, при которой элементы располагаются друг за другом в порядке следования. Термин происходит от англ. concatenation, восходящего к лат. concatenare — «сцеплять, соединять в цепь». В информатике конкатенация является базовой операцией над строками и одним из способов построения более сложных структур данных из более простых.

Основные свойства

Конкатенация обладает рядом математических свойств, определяющих её поведение в вычислительных системах:

  • Ассоциативность: (a + b) + c = a + (b + c). Порядок группировки при объединении не влияет на результат.
  • Некоммутативность: a + b ≠ b + a в общем случае. Порядок элементов сохраняется, поэтому перестановка операндов меняет результат.
  • Нейтральный элемент: пустая строка ("" или ε) не меняет результат при конкатенации: a + "" = "" + a = a.

Эти свойства делают конкатенацию основой алгебры строк и алгебраических структур, известных как свободные моноиды, где конкатенация выступает в роли бинарной операции.

Реализация в языках программирования

В большинстве языков программирования конкатенация реализована как встроенная операция или метод. Синтаксис и семантика различаются:

ЯзыкСинтаксисПример
Python+, str.join()"a" + "b", "".join(["a", "b"])
JavaScript+, concat()"a" + "b", "a".concat("b")
Java+, StringBuilder.append()"a" + "b"
C#+, String.Concat()"a" + "b"
C/C++strcat, std::string::operator+strcat(a, b)
SQL`\\, CONCAT()`CONCAT(a, b)
Haskell++"a" ++ "b"
Lispconcatenate(concatenate 'string "a" "b")

В Python и Java строки являются неизменяемыми (immutable), поэтому каждая конкатенация создаёт новый объект строки. Это приводит к квадратичной сложности при многократном объединении в цикле, если не использовать оптимизированные методы (например, "".join() в Python или StringBuilder в Java).

Сложность и оптимизация

Наивная реализация конкатенации имеет сложность O(n + m), где n и m — длины объединяемых строк. Однако при многократном наращивании строки в цикле общая стоимость возрастает до O(n²), так как каждая итерация требует копирования всей накопленной строки.

Для решения этой проблемы применяются:

  • Строковые буферы (buffers) — динамические массивы с резервированием памяти, позволяющие выполнять конкатенацию амортизированно за O(1) на элемент.
  • Rope-структуры — деревья, в которых листья хранят фрагменты строк, а внутренние узлы представляют конкатенации. Операции вставки и объединения выполняются за O(log n).
  • Copy-on-write — при конкатенации разделяемые данные копируются только при изменении.

Конкатенация в теории формальных языков

В теории формальных языков конкатенация определяет построение языков из более простых. Если L и M — языки, то их конкатенация LM — это множество всех строк, полученных объединением строки из L и строки из M. Эта операция лежит в основе регулярных выражений, где конструкции вида ab, (a|b)c и подобные описывают сложные шаблоны через конкатенацию и альтернативу.

Конкатенация также используется в определении контекстно-свободных грамматик: правило вида A → αβ описывает замену нетерминала A на последовательность символов αβ, что является конкатенацией подвыражений.

Применение

Конкатенация широко применяется в информатике и смежных областях:

  • Обработка текста — сборка документов, формирование отчётов, генерация SQL-запросов.
  • Компиляция — построение синтаксических деревьев и генерация кода.
  • Сетевые протоколы — формирование пакетов данных из заголовков и полезной нагрузки.
  • Функциональное программирование — конкатенация списков является одним из базовых комбинаторов.
  • Криптография — конкатенация ключей и nonce при построении протоколов.

Конкатенация в реляционных базах данных

В SQL конкатенация строк выполняется функцией CONCAT() или оператором || (в стандарте SQL и в PostgreSQL). В Microsoft SQL Server исторически использовался оператор +, а в MySQL — функция CONCAT() без поддержки || в режиме по умолчанию (оператор || там означает логическое ИЛИ). При конкатенации с NULL результат зависит от конкретной СУБД: в стандартном SQL CONCAT('a', NULL) возвращает NULL, в MySQL — 'a'.

См. также

  • Строка (программирование)
  • Моноид
  • Регулярные выражения
  • Rope (структура данных)

Источники:

  • Кнут Д. «Основы программирования»
  • Страуструп Б. «Язык программирования C++»
  • Гарсиа-Молина Х., Улман Дж., Уидом Дж. «Системы баз данных: полный курс»
  • Райт К., Саддлтон Д. «Функциональное программирование на Haskell»
Заметили ошибку или не согласны с информацией в статье? Напишите нам support@bfometr.ru