Почему в анализе сложности ++ считается двумя операциями?
-
22-07-2019 - |
Вопрос
На моем курсе информатики II профессор рассматривает ++,--,*= и т. д.будет 2 операции.Однако на уровне Ассамблеи это не две операции.Может кто-нибудь объяснить или это просто для простоты?
Решение
Я бы на самом деле считал, что это 3 операции: чтение, увеличение (или что-то еще), запись. При этом предполагается, что он считывает данные из некоторой разделяемой памяти в некое локальное хранилище (например, регистр или стек), работает в локальном хранилище, а затем записывает обратно.
Сколько операций выполняется на уровне сборки, будет зависеть от того, что вы увеличиваете, платформы, оборудования и т. д.
Другие советы
Потому что ++ (например: b ++) - это упрощение
b = b + 1
Здесь есть две операции: сложение (b + 1) и затем присвоение значения сложения исходной переменной.
Зачем беспокоиться при анализе сложности? Это просто O (1): -)
РЕДАКТИРОВАТЬ: Пожалуйста, дайте мне знать, почему, когда вы проголосуете. Поскольку вопрос помечен тегом сложность , я предполагаю, что понятие большого О является наиболее важным, а не фактическими константами. Кроме того, как уже упоминалось в других ответах, количество операций зависит от множества факторов: от того, как вы считаете операции, от платформы, от компилятора и т. Д.
Я выскажу несколько предположений.
- Ваш профессор имеет в виду интерпретируемые языки?
- ++i отличается от i++, может быть, он имеет в виду это?
Может быть, его выбранному языку ассемблера нужна переменная промежуточного хранения?
add reg_temp, reg_i, 1 mov reg_i, reg_temp
Разве это не дополнение плюс сеттер?
Похоже на i + = 1?
Проф, вероятно, просто ссылается на необходимость взять значение, добавить 1 к нему и затем присвоить его обратно переменной.
На уровне сборки все выполняется в регистрах, поэтому переменная находится в A
ADD AX,1
Однако в скомпилированных языках все должно храниться, поэтому i ++ становится (в псевдосборке)
MOV AX,i
ADD AX, 1
MOV i, AX
Это три операции ... Если я полностью не забыл свою основную архитектуру ...
Вы напомнили мне своего рода " Жюри не вышло " проблема, которую я слышал давно. Р>
" Предварительный инкремент быстрее, чем postincrement "
Я только что сделал быстрый поиск в Google. Р> <Ол>
По моему мнению, оно должно быть больше 2, поскольку оно имеет два значения в зависимости от контекста, и я всегда должен напоминать себе о них, когда вижу это.
a = b ++
совпадает с a = b; b = b + 1
и
a = ++ b
совпадает с b = b + 1; a = b
Этого достаточно, чтобы сбить с толку большинство первокурсников.