I have an algorithm that performs the base conversion. The input is a string and two ints b1
and b2
. The string represents an int in base b1
and converts it into base in b2
.
My code is:
def convert_base(num_as_string, b1, b2):
if num_as_string == '0' or num_as_string == '-0':
return num_as_string
base10, degree = 0, 0
is_neg = False
if num_as_string[0] == '-':
is_neg, num_as_string = True, num_as_string[1:]
if b1 == 10:
base10 = int(num_as_string)
else:
for digit in num_as_string[::-1]:
base10 += string.hexdigits.index(digit.lower()) * (b1 ** degree)
degree += 1
if b2 == 10:
return '-' + str(base10) if is_neg else str(base10)
converted = []
while base10 > 0:
digit = base10 % b2
converted.append(digit)
base10 //= b2
res = ''
for i in converted[::-1]:
res += string.hexdigits[i].upper()
return '-' + res if is_neg else res
Now I am trying to see if this can be improved in terms of time and space complexity. But I am not sure how to analyze the complexity of this code.
I know everything is constant before for digit in num_as_string[::-1]:
. In this loop, it's just \$O(n)\$ where \$n\$ is just number of digits of the input.
Then in while base10 > 0
, it runs the look while base10
becomes 0. So, this would be something like O(number of digits in base10)
Finally, on for i in converted[::-1]
, this would also be O(number of digits in base10)
.
So, I am assuming the time complexity of this code is something like O(n) + 2 * O(number of digits in base10)
which is linear.
For space, I am assuming it's O(number of digits in base10)
because I store it in converted
list.
Are my observations correct? If not, what am I missing? Also, can this code be improved in terms of time and space complexity?
b2
is, say, 20? \$\endgroup\$b1
andb2
is between 2 and 16 \$\endgroup\$