Что вам нужно сделать, так это обратить внимание на циклы, в частности, сколько раз циклы повторяются и сколько времени затрачивается внутри циклов. Вам нужно умножить количество повторений внешнего цикла на количество времени, которое требуется внутри цикла ... если есть внутренний цикл, вы умножаете количество повторений внешнего цикла на количество повторений внутреннего цикла. цикл, например, чтобы получить сложность времени.
В вашей первой программе у вас есть один цикл, который занимает O (n) время, за которым следует цикл, который занимает O (q * (ba)) время ... мне не совсем ясно, что представляют собой b и a ... но если вы можете связать ba (скажем, вы знаете, что ba
Во второй программе у вас есть два цикла, каждый из которых занимает время O (n), а затем цикл, который занимает время O (q). Таким образом, общее время выполнения O (n + q). Обратите внимание, что если один термин доминирует над другим, вы можете отбросить термин, который меньше. Даже не зная значения (b-a), уже очевидно, что это лучше, чем первое.
В третьей программе общее время выполнения равно O (n + m), потому что у вас есть один цикл, который занимает время O (n), а затем цикл, который занимает время O (m). Если вы знаете, что m
Я также должен отметить, что даже если цикл выполняется более одного раза, но он выполняется фиксированное число раз (например, в программе 2 у вас есть два цикла, которые занимают O (n) времени), он не ' t влияет на сложность времени, потому что O (2n) совпадает с O (n); Другими словами, постоянные факторы не имеют значения при анализе сложности. Кроме того, если у вас есть внутренний цикл, который изменяется с точки зрения количества раз его выполнения, если вы выполняете анализ сложности "наихудшего случая", вам нужно знать только худшее возможное значение, которое он может иметь.
Например, рассмотрим следующий цикл:
for (int i = 0; i < n; i++ ){
for (int j = i+1; j < n; j++ ){
// something taking O(1) time
}
}
Вышеприведенный цикл занимает время O (n ^ 2), хотя не все внутренние циклы занимают время O (n).
Я также хотел бы добавить, что вам лучше работать с форматированием вашей программы. Хотя фигурные скобки не являются строго обязательными, если в условии if / for / while есть только один оператор в теле, в любом случае гораздо удобнее использовать фигурные скобки и использовать новую строку. Например, это будет намного более читабельным, если вы напишите:
for (int i=1; i<=n; i++) {
sum[i]=sum[i-1]+data[i];
}
Чем писать это как for (i=1; i<=n; i++) sum[i]=sum[i-1]+data[i];
. Кроме того, я должен отметить, что даже если вы пометили этот вопрос как C ++, вы используете C-подобный код ... в C ++ вы можете объявить переменные при инициализации цикла for (я предлагаю вам сделать это). Кроме того, в C ++ библиотека iostreams ( std :: cin , std :: cout , std :: fstream , std :: ostringstream , std :: istringstream и т. д.) предпочтительнее объектов C FILE *.
Вам также может быть интересен следующий ресурс: