Оценка алгоритма по времени

есть алгоритм:

Type ScalarProduct(Type v1[], Type v2[], int n)
{
    int i = 0;
    Type sum = 0;
    for (i = 0; i < n; i++)
        sum += v1[i] * v2[i];
    return sum;
}

высчитывающий скалярное произведение двух векторов размерности N,нужно было провести серию экспериментов, в которых будет фиксироваться время работы программы для различных значений n

Серию результатов эксперимента предлагаю:

  • N=1000,t=0.001
  • N=2000,t=0.014
  • N=5000,t=0.046
  • N=10000,t=0.004
  • N=20000,t=0.001
  • N=50000,t=0.064
  • N=100тыс, t=0.002
  • N=200тыс, t=0.002
  • N=500тыс, t=0.005

Вопрос: разве может алгоритм при N=500 тысяч, работать быстрее, чем,например при N=2000?????

Алгоритм, если я правильно разобрался, имеет сложность вида О(n), но на графике, очевидно, никакой линейности не наблюдается.

Способ реализации подсчёта времени работы алгоритма прилагаю:

clock_t start = clock();
    cout << ScalarProduct <int>(vect1, vect2, N) << "\n";
    clock_t end = clock();
    cout << "Completed for " << (double)(end - start) / CLOCKS_PER_SEC << " second" << endl;

Массивы vect1 и vect2 заполняются рандомно.


Ответы (1 шт):

Автор решения: Qwertiy

У алгоритма асимптотика линейная. Даже если ты ни в чём не накосячил при замерах, надо было брать значения гораздо больше потому что у таких мелких результатов погрешность больше самого результата.

Бери 100'000'000, 200'000'000, 400'000'000 и т. д. Ну или хотя бы в 10 раз меньше. Нужно чтобы где-то в замерах фигугрировало время около секунды.


UPDATE: А в замерах ты накосячил. У тебя вывод на консоль участвует в замере времени. Надо сохранять результат в переменную, а вывод делать уже после окончания замера.

→ Ссылка