C # и C / C ++ не содержат никакой специальной информации в строках, которая представляет (возможное) числовое значение.Поэтому при преобразовании им нужно анализировать строку цифра за цифрой.
Однако количество цифр ограничено, поэтому у нас есть только O (1): время преобразования ограничено (обычно путем преобразованиясамое большое количество).Для 32-разрядного типа int преобразование должно учитывать максимум 10 десятичных цифр (и, возможно, знак).
Преобразование из строки на самом деле также равно O (1), потому что во время синтаксического анализа этого достаточнорассматривать только ограниченное количество символов (10 + 1 в случае 32-разрядного типа int).
Строго говоря, мы не можем использовать O
-обозначение для случая преобразования строки в строку, посколькумаксимальное значение int ограничено.В любом случае, время, необходимое для преобразования (в обоих направлениях), ограничено константой.
Как предполагает @Charles, другие языки (Python) фактически могут использовать числа произвольной точности.Для разбора таких чисел время равно O(number of digits)
, что O(string length)
и O(log(number))
для обоих преобразований соответственно.С числами произвольной точности нельзя сделать это быстрее, поскольку для обоих преобразований должна учитываться каждая цифра.Для преобразования в / из чисел с ограниченной точностью применяется та же логика O(1)
.Однако я не профилировал синтаксический анализ в Python, поэтому, возможно, там используется менее эффективный алгоритм.
РЕДАКТИРОВАТЬ: следуя предложению @Steve, я проверил, что синтаксический анализ в C / C ++ и C # пропускаетначальный пробел, поэтому время для преобразования string-> int на самом деле O(input length)
.Если известно, что строка обрезана, преобразование снова O(1)
.