Ordo - 计算 c 和 n₀

Ordo - Calculating c & n₀

我在这个作业中遇到了一些问题。我很难知道如何处理我收集的数据。

我的任务是计算 ordo 和 n₀ 中的常数 c。

我们有一个通过终端执行的未知代码。我们可以选择要处理多少元素。元素越多,程序运行时间越长运行.

在程序结束时,我们会得到一个关于程序完成所用时间的数字。

这是收集到的数据:

Input   |  time (s)
--------+----------
1000    |   0.0015
1000    |   0.0016
1000    |   0.0015
2000    |   0.0063
2000    |   0.0063
3000    |   0.0063
4000    |   0.0281
4500    |   0.0344
5000    |   0.0453
6000    |   0.0672
7000    |   0.0953
8000    |   0.1265
9000    |   0.1656
10000   |   0.2078
11000   |   0.2547
12000   |   0.3062
15000   |   0.4875
20000   |   0.8953
25000   |   1.4125
30000   |   2.0390
35000   |   2.8750
40000   |   3.6641
50000   |   5.7641
50000   |   5.7438
70000   |   11.4781
75000   |   13.7312
80000   |   15.0828
85000   |   17.1156
90000   |   19.8610
100000  |   23.2328
110000  |   28.8032
130000  |   40.6344

问题是:我该如何继续前进?我猜看图表告诉我复杂度是 O(n²)。

有什么提示可以告诉我如何进行下一步计算 c & n₀ 吗?

一般来说,通过测量在不同输入上 运行 所花费的时间来 "compute" 函数的复杂性并不是一个好主意。

例如假设该函数使用大整数和大字符串各占 50%。现在你有了一个特殊的编译器扩展,可以极大地加速大整数运算。现在可能会错过 运行 时间与整数输入的关系。

如果您必须在没有函数源代码的情况下了解复杂性,您可以使用 运行 时间 t 作为 "complexity function" f(t ).要证明该函数在 O(n²) 中,您只需给出 g(t)cn₀,使得 f(t) ≤ c⋅g(t) 成立所有 t ≥ n₀, 不一定是精确的。

在您的情况下,可以选择 g(t) = t² + 1c = 1n₀ = 0
您还可以将 g(t) = 1/4⋅10⁻⁸⋅t²+1c = 1n₀ = 0(红色)
一起使用 或 g(t) = 1/4⋅10⁻⁸⋅t²c = 1n₀ = 40000(蓝色)。

但请注意:您不能完全做到这一点。如果您测试 10¹⁰ 作为输入,这个结果也有可能是错误的。如果您想获得确切的复杂性,则必须查看代码。