Какова временная сложность функции приведения типа в python? - PullRequest
6 голосов
/ 21 марта 2020

Например, int(x) float(x) str(x) Какова их временная сложность?

Ответы [ 2 ]

2 голосов
/ 21 марта 2020

На этот вопрос нет однозначного ответа, потому что это зависит не только от того, в какой тип вы преобразуете, но и от типа, из которого вы преобразуете.

Давайте рассмотрим только числа и строки. Чтобы не писать «log» везде, мы измерим размер int, сказав, что n - это количество бит или цифр, необходимых для его представления. (Асимптотически не имеет значения, считаете ли вы биты или цифры.) Для строк, очевидно, мы должны позволить n быть длиной строки. Нет никакого осмысленного способа измерить «входной размер» объекта float, поскольку все числа с плавающей запятой занимают одинаковое количество места.

  • Преобразование int, float или str для его собственного типа должно занять Θ (1) времени, потому что они являются неизменяемыми объектами, поэтому даже не нужно делать копию.
  • Преобразование int в float должно займет Θ (1) времени, потому что вам нужно только прочитать не более фиксированного постоянного числа битов из объекта int, чтобы найти мантиссу, и длину в битах, чтобы найти показатель степени.
  • Преобразование int до str должно занять Θ (n 2 ) времени, потому что вам нужно выполнить Θ (n) операций деления и остатка, чтобы найти n цифр, и каждая арифметическая операция c занимает Θ ( n) время из-за размера вовлеченных целых чисел.
  • Преобразование str в int должно занять Θ (n 2 ) времени, потому что вам нужно сделать Θ ( n) умножения и сложения на целые числа размера Θ (n).
  • Преобразование str до float должно занять Θ (n) времени. Алгоритм должен только прочитать фиксированное количество символов из строки, чтобы выполнить преобразование, и арифметические операции с плавающей запятой c (или операции над ограниченными значениями int, чтобы избежать промежуточных ошибок округления) для каждого символа принимают Θ (1 время; но алгоритм все равно должен смотреть на остальные символы, чтобы поднять ValueError, если формат неправильный.
  • Преобразование float в любой тип занимает Θ (1), потому что есть только конечное число различных float значений.

Я сказал "должен", потому что я не проверял фактический исходный код; это основано на том, что должны делать алгоритмы преобразования, и на предположении, что фактически используемые алгоритмы не асимптотически хуже, чем они должны быть.

Теоретически могут быть особые случаи для оптимизации str преобразование в int, когда основание имеет степень 2, например int('11001010', 2) или int('AC5F', 16), поскольку это можно сделать без арифметики c. Если эти случаи оптимизированы, то они должны занять Θ (n) времени вместо Θ (n 2 ).

0 голосов
/ 21 марта 2020

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

...