Сколько примитивных операций в простом цикле?

У меня есть куча кода, для которого нужно найти примитивные операции. Дело в том, что в Интернете не так много подробных ресурсов по этому вопросу. В этом цикле:

for i:=0 to n do
  print test
end

Сколько шагов у нас действительно есть? В моем первом предположении я бы сказал n+1, учитывая n для циклов времени и 1 для печати. Тогда я подумал, что, может быть, я недостаточно точен. Разве нет операции даже для прибавления 1 к i в каждом цикле? В этом отношении имеем n+n+1=2n+1. Это правильно?


person Pithikos    schedule 21.02.2011    source источник
comment
посмотри сюда, здесь чаще устанавливают верхнюю границу скорости роста, чем подсчитывают точно: en.wikipedia. org/wiki/Big_O_notation   -  person TimCodes.NET    schedule 21.02.2011
comment
Мне кажется странным, что вы включили не менее пяти тегов и не выбрали ни одного, указывающего на язык, который вы используете. Это какой-то Паскаль?   -  person Jonathan Wood    schedule 21.02.2011
comment
Что такое примитивная операция? В реализации библиотеки C printf — это страницы кода, и даже puts становится очень нетривиальным, когда вы следуете ему в ОС. Если вы не следуете этому в ОС, то вы вычисляете количество элементов, где некоторые элементы увеличиваются на целое число (примерно один цикл ЦП), а другие вещи печатают строку в стандартный вывод (несколько тысяч циклов ЦП). Так что это довольно бессмысленное число, если вы не можете придумать что-то важное и интересное в качестве своего определения примитива, и, вероятно, поэтому о нем не так много ресурсов.   -  person Steve Jessop    schedule 21.02.2011
comment
@ Стив, ты прав. Это было моей ошибкой использовать print для этого примера. Вместо этого я должен был использовать присваивание переменной   -  person Pithikos    schedule 22.02.2011
comment
Имейте в виду, что компилятор может выполнить развертку цикла, что изменит количество примитивных операций.   -  person sdcvvc    schedule 03.08.2012


Ответы (1)


Цикл можно разбить на его «примитивные операции», переделав его как while:

int i = 0;
while (i < n)
{
    print test;
    i = i + 1;
}

Или, более явно:

loop:
    if (i < n) goto done
    print test
    i = i + 1
    goto loop
done:

Затем вы можете увидеть, что для каждой итерации есть сравнение, приращение и goto. Это просто цикл накладных расходов. Вам придется добавить к этому любую работу, выполняемую в цикле. Если print считается "примитивной операцией", то у вас есть:

  • n+1 сравнений
  • n звонки на print
  • n приращений
  • n+1 goto инструкций (одна для выхода из цикла по завершении)

Теперь то, как все это преобразуется в машинный код, сильно зависит от компилятора, библиотеки времени выполнения, операционной системы и целевого оборудования. И, возможно, другие вещи.

person Jim Mischel    schedule 21.02.2011
comment
Спасибо! Думаю, переписав код в цикле while, я проясню ситуацию :) - person Pithikos; 22.02.2011
comment
Например, в определенной архитектуре две из этих примитивных операций могут быть выполнены как одна инструкция ЦП (сравнение и переход) достаточно умным компилятором для любого языка, на котором они написаны. И наоборот, для сравнения i < n может потребоваться 2: вычтите и проверьте бит переноса. Конечно, это зависит от архитектуры, но то, что описано выше, представляет собой одно возможное преобразование, которое компилятор может выполнить для создания внутренней структуры для преобразования в машинный код. Таким образом, определение примитивных операций по-прежнему зависит от языка и компилятора. - person Steve Jessop; 22.02.2011
comment
@Steve Jessop: очень хороший момент, который я должен был сделать более четко. Определение примитивной операции довольно скользкое. - person Jim Mischel; 22.02.2011
comment
Является ли операция присваивания также примитивной операцией? Я прочитал это в книге алгоритмов, что это считается. - person K.K; 03.09.2015
comment
@KK: Есть много разных мыслей о том, что считается примитивной операцией. Как описано в предыдущем комментарии, определение примитивной операции во многом зависит от языка, компилятора и архитектуры. Или на правилах, изложенных в любом тексте, который вы читаете. - person Jim Mischel; 03.09.2015