我有一个执行基本转换的算法。输入是一个字符串以及两个整数b1和b2。该字符串在b1中表示一个整数,并在b2中将其转换为base。
我的代码是:
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
现在,我正在尝试查看是否可以在时间和空间复杂度方面改善这一点。但是我不确定如何分析这段代码的复杂性。
我知道在for digit in num_as_string[::-1]:
之前一切都是不变的。在此循环中,它只是`O(n),其中n是输入的位数。
然后在while base10 > 0
中,它在base10
变为0时运行外观。因此,这类似于O(number of digits in base10)
最后,在for i in converted[::-1]
上,该名称也将是O(number of digits in base10)
。
因此,我假设这段代码的时间复杂度类似于O(n) + 2 * O(number of digits in base10)
,它是线性的。
对于空间,我假设它是O(number of digits in base10)
,因为我将其存储在converted
列表中。
我的观察正确吗?如果没有,我想念什么?而且,可以在时间和空间复杂度方面改进此代码吗?
谢谢