Если я правильно понимаю ваш вопрос, ваше замешательство может быть легко и быстро выяснено.
TC алгоритма определяется в терминах длины кодировки входа .
Пожалуйста, найдите время, чтобы полностью понять каждый выделенный термин.
Лучший способ понять это - всегда представлять входные данные, записанные на ленте машины Тьюринга.
Если у нас есть алгоритм, который принимает число n в качестве входных данных и вычисляет n-ое треугольное число с помощью цикла (то есть он выдает 1 + 2 + 3 + ... + n ) заманчиво сказать, что алгоритм является линейным, так как он принимает n шагов.
Это верно в том смысле, что алгоритм является линейным в n , но это не говорит нам о TC алгоритма, поскольку TC определяется в терминах кодирования число n не n само по себе.
Обычно обозначают кодировку n с .
Например, возможные кодировки 4:
_ _ _
<4> = |1|0|0|
¯ ¯ ¯
_ _
<4> = |1|1|
¯ ¯
_
<4> = |4|
¯
_ _ _ _
<4> = |x|x|x|x|
¯ ¯ ¯ ¯
_
<4> = |A|
¯
Первые три примера - это просто позиционные системы (база 2, 3, 10).
Четвертый пример вырожденного кодирования (это унарный код).
Последний пример представляет собой пользовательскую кодировку, где каждый n имеет определенный символ из алфавита кодирования.
Хотя концепция кодирования может показаться тривиальной, требуется время, чтобы выпить.
Вы можете проверить: цифра .
Если мы возьмем двоичную кодировку, число n будет иметь кодировку длиной около l = log 2 ( N ). * * тысяча шестьдесят-один
TC описанного выше алгоритма был n = 2 l .
Таким образом, его TC является экспоненциальным .
Что если мы выбрали десятичную кодировку?
ТС был бы 10 1 .
Поначалу кажется сложным, что алгоритм не может иметь определенного TC, но на самом деле TC зависит от вычислительной модели, включая кодирование.
Обычно мы предполагаем работать в модели, где арифметические операции занимают только один шаг.
Например, суммирование двух чисел на машине Тьюринга требует O (l), в то время как на старших моделях принято делать это O (1).
К сожалению, эти предположения не всегда изложены.
На самом деле нас это не особо беспокоит, хотя при асимптотической работе с нотацией big-O изменение базы кодирования изменяет только его длину на постоянную.
В общем, если кодировка A может быть превращена в другую кодировку B за полиномиальное время, мы не будем указывать, работаем ли мы с A или B потому что даже в цепочке преобразования кодирования с помощью алгоритма у нас все еще есть полиномиальный алгоритм (если исходный был таким).
Связано: Полиномиальное сокращение времени .
Теперь должно быть легко понять определение Псевдополиномиального времени , данное Википедией.
В теории вычислительной сложности числовой алгоритм выполняется за псевдополиномиальное время, если его время выполнения является полиномом в числовом значении входных данных.