Попытка понять сложность пространства вывода каскадных строк

1

У меня была эта проблема в кодировании интервью:

# 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)?

Теги:
algorithm
time-complexity
space-complexity
asymptotic-complexity

1 ответ

4
Лучший ответ

Длина счетной строки, которую вы храните, должна учитываться. В худшем случае (ни один из последовательных символов не совпадает), он фактически в два раза длиннее ввода. Так ясно, что O (n) в целом: это было бы асимптотически лучше, если бы вы знали, что длинные входы всегда содержат очень длинные прогоны. (В лучшем случае все символы одинаковы, а длина одного номера равна O (log n).)

Тем не менее, иногда полезно рассматривать ваш вывод как поток (например, print), а затем ваша пространственная сложность (для count и, возможно, текущего входного символа) является постоянной. Конечно, даже тогда его технически логарифмический, поскольку количество бит, необходимое для хранения count есть, но часто не учитывается в практических анализах.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню