我在Java中编写了一个函数append()
,我需要通过O(N)和Θ(N)来分析其运行时复杂度。
这是原来的问题:
假设
append()
的运行时复杂度为t = O(N)
,这意味着t
也可以由t = C*N
表示。 (因为C
是常数)因此
(t / N) = C
。例如,如果是
t = O(N^2)
,那么(t / N^2) = C
等等。使用此方法查找
append()
运行时coplexity。
因此我针对3个不同的append()
:N
,1,000
,5,000
运行了10,000
次N次。
long start = System.currentTimeMillis();
for(i = 0; i < N; ++i) {
append();
}
long end = long start = System.currentTimeMillis();
System.out.println(end - start);
我记下了end-start
,这是运行时间,以毫秒为单位。
现在,我如何使用此信息以获得append()
的时间紧密度?
提前致谢!
答案 0 :(得分:1)
你误解了这个方法。 N应该是字符串的长度,而不是函数调用的数量 它应该是
String str(n); // Or whatever how you create a string with n elements
long start = System.currentTimeMillis();
append();
long end = long start = System.currentTimeMillis();
System.out.println(end - start);
然后你运行它几个Ns,并试图找出它的固有时间。尝试除t / N,然后t / N ^ 2,直到你找到一个恒定的答案。
答案 1 :(得分:0)
只有一个数据点,您无法确定函数的时间复杂度。根据经验确定时间复杂度的一种好方法是对多个不同大小的输入进行操作计时,并查看操作运行时的相对增长率。例如,如果运行时大约加倍,因为输入大小加倍,则时间复杂度为O(n)。如果运行时间大约为输入大小翻倍的四倍,则时间复杂度为O(n 2 )。
原因你需要几个数据点类似于为什么你需要几个点来确定一条线。只给出一点,你无法分辨出斜率或截距是多少。在衡量时间的复杂性时,你无法筛选出共生期和增长期的相对贡献。
希望这有帮助!