В Анализе сложности почему ++ считается 2 операциями? - PullRequest
4 голосов
/ 14 января 2009

В моем классе Computer Science II профессор считает ++, -, * = и т. Д. Двумя операциями. Однако на уровне Ассамблеи это не совсем две операции. Может кто-нибудь объяснить или это просто ради простоты?

Ответы [ 9 ]

9 голосов
/ 14 января 2009

Я бы на самом деле считал, что это 3 операции: чтение, увеличение (или что-то еще), запись. Предполагается, что он считывает данные из некоторой разделяемой памяти в некое локальное хранилище (например, регистр или стек), работает в локальном хранилище и затем записывает обратно.

Сколько операций выполняется на уровне сборки, зависит от того, что вы увеличиваете, платформы, аппаратного обеспечения и т. Д.

8 голосов
/ 14 января 2009

Потому что ++ (например: b ++) является упрощением

b = b + 1 

Здесь есть две операции: сложение (b + 1) и затем присвоение значения сложения исходной переменной.

2 голосов
/ 14 января 2009

Зачем беспокоиться при проведении анализа сложности? Это просто O (1): -)

РЕДАКТИРОВАТЬ: Пожалуйста, дайте мне знать, почему, когда вы проголосуете. Поскольку вопрос помечен как сложность , я предполагаю, что понятие большого О является наиболее важным, а не фактическими константами. Кроме того, как уже упоминалось в других ответах, количество операций зависит от множества факторов: от того, как вы считаете операции, от платформы, компилятора и т. Д.

1 голос
/ 14 января 2009

Я собираюсь бросить несколько догадок.

  • Ваш профессор имеет в виду интерпретируемые языки?
  • ++ я не такой, как я ++, может быть, он имеет в виду это?
  • Может быть, его языку сборки нужна промежуточная переменная памяти?

    add reg_temp, reg_i, 1
    mov reg_i, reg_temp
    
0 голосов
/ 14 января 2009

По моему мнению, это должно быть больше 2, поскольку оно имеет два значения в зависимости от контекста, и я всегда должен напоминать себе о них, когда вижу это.

a = b++ совпадает с a = b; b = b + 1

и

a = ++b совпадает с b = b + 1; a = b

Этого достаточно, чтобы запутать большинство первокурсников со скалы.

0 голосов
/ 14 января 2009

Вы напомнили мне что-то вроде " Юрий не вышел ", о котором я слышал давно.

«Преинкремент быстрее, чем постинкремент»

Я только что сделал быстрый поиск в Google.

  1. Многие люди все еще считают это истиной.
  2. Другие утверждают, что компиляторы настолько оптимизированы, что сравнительный код высокого уровня не может быть сравнен.
  3. Все же другие люди утверждают, что нет никакой разницы.
0 голосов
/ 14 января 2009

На уровне сборки все выполняется в регистрах, поэтому переменная в A

ADD AX,1

Однако в скомпилированных языках все должно храниться, поэтому i ++ становится (в псевдосборке)

MOV AX,i
ADD AX, 1
MOV i, AX

Это три операции ... Если я полностью не забыл свою основную архитектуру ...

0 голосов
/ 14 января 2009

Проф, вероятно, просто ссылается на необходимость взять значение, добавить к нему 1, а затем присвоить его обратно переменной.

0 голосов
/ 14 января 2009

Разве это не дополнение плюс сеттер?

Похоже на i + = 1?

...