У меня была эта проблема в кодировании интервью:
# AAABB should return A3B2
Это классический вопрос об интервью с алгоритмом. Я сказал, что могу решить это в O(n)
времени и O(1)
пространстве.
def compress(s):
output = ''
count = 1
for i in range(len(s)-1):
if s[i] == s[i+1]:
count+=1
else:
output = output + s[i] + str(count)
count=1
output = output +s[i+1] + str(count)
return output
compress('AAABB') #returns A3B2
Я понимаю, что O(n)
пространство означает, что он растет пропорционально размеру ввода. Поэтому я думал, что O(n)
пространство будет выглядеть как [(A,3),(B,2)]
.
У меня A3B2
впечатление, что A3B2
находится в O(1)
пространстве, так как он не разбивается на несколько строк.
Теперь я понял, что n == len(s)
и мой вывод растут пропорционально (меньше) с моим размером ввода, поэтому правильно ли говорить, что пространство O(log n)
?
Длина счетной строки, которую вы храните, должна учитываться. В худшем случае (ни один из последовательных символов не совпадает), он фактически в два раза длиннее ввода. Так ясно, что O (n) в целом: это было бы асимптотически лучше, если бы вы знали, что длинные входы всегда содержат очень длинные прогоны. (В лучшем случае все символы одинаковы, а длина одного номера равна O (log n).)
Тем не менее, иногда полезно рассматривать ваш вывод как поток (например, print
), а затем ваша пространственная сложность (для count
и, возможно, текущего входного символа) является постоянной. Конечно, даже тогда его технически логарифмический, поскольку количество бит, необходимое для хранения count
есть, но часто не учитывается в практических анализах.