我正在测试我制作的一些功能,而我正试图找出时间复杂度。 我的问题是,即使在阅读了有关Big O的一些文章后,我也无法弄清楚以下内容应该是什么:
1000个循环:15000个对象:时间6
1000个循环:30000个对象:时间9
1000个循环:60000个对象:时间15
1000个循环:120000个对象:时间75
前2的差异是3 ms,然后是6 ms,然后是60,所以每次迭代时间加倍。我知道这不是O(n),我认为它不是O(log n)。
当我尝试不同的数据集时,时间并不总是上升。例如,采用此序列(ms):11-17-26-90-78-173-300
78毫秒看起来不合适。这甚至可能吗?
编辑: NVM,我只需要和我的大学导师讨论这个问题。 不同变量的时间输出差别太大。 感谢那些试图提供帮助的人!
答案 0 :(得分:3)
Big O表示法并不是指完成一项操作需要多长时间。这是(非常粗略的)估计各种算法如何相对于改变输入大小渐近地比较,以通用“步骤”表示。那就是“我的算法为N个元素的输入做了多少步骤?”。
说完这个,请注意在Big O表示法中常量被忽略。因此,在每次迭代中进行100次计算的N个元素的循环将是100 * N但仍然等于O(N)。类似地,执行10000次计算的循环仍然是O(N)。
因此,在您的示例中,如果您有类似的内容:
for(int i = 0; i < 1000; i++)
for(int j = 0; j < N; j++)
// computations
它将是1000 * N = O(N)。
Big O只是一个简化的算法运行时间估计,基本上说如果一个算法有运行时间O(N)而另一个算法有O(N ^ 2)那么第一个算法最终会 对于N的某个值,要快于第二个。当然,这个估计并未考虑与底层平台相关的任何内容,如CPU速度,缓存,I / O瓶颈等。
答案 1 :(得分:0)
假设你不能仅从理论上得到 O(n),那么我认为你需要在 O(n)中查看更多的数量级 - 至少三个,最好六个或更多(你只需要试验一下,看看 n 的变化是多少)。如果必须的话,让事情一夜之间运行。然后以对数方式绘制结果。
基本上我怀疑你现在正在看噪音。
答案 2 :(得分:0)
没有看到你的实际算法,我只能猜测: 如果允许3ms的恒定初始化开销,则最终得到
1000x15,000 = (OH:3) + 3
1000x30,000 = (OH:3) + 6
1000x60,000 = (OH:3) + 12
对我来说,这似乎是O(n)
不同数据集的时间戳差异可能是由于多种因素造成的。