如何计算具有硬限制的函数的大O?

时间:2013-10-23 23:07:20

标签: algorithm limit big-o

作为我最近看到的编程作业的一部分,学生被要求找到他们的功能的大O值来解决难题。我很无聊,并决定自己编写程序。但是,我的解决方案使用我在问题中看到的模式来跳过大部分计算。

Big O显示时间如何根据缩放n而增加,但随着n缩放,一旦达到模式的重置,它所花费的时间也会重置为低值。我的想法是当O(nlogn % k)重置时k+1O(1)。另一个想法是,由于它有一个硬限制,因此值为k,因为这是任何常数的大O.其中一个是正确的,如果没有,那么限制应该如何表示?

作为重置的示例,def Entry(a1, q): F = [a1] lastnum = a1 q1 = q % 31336 rows = (q / 31336) for i in range(1, q1): lastnum = (lastnum * 31334) % 31337 F.append(lastnum) F = MergeSort(F) print lastnum * rows + F.index(lastnum) + 1 值为31336。 在n = 31336处,需要31336步,但是在n = 31337处,需要1步。

代码是:

MergeSort

O(nlogn)是一种标准合并排序,其复杂度为{{1}}。

3 个答案:

答案 0 :(得分:2)

嗯,我用来考虑大O问题的简单方法是将n视为如此大,以及无限。如果你没有特别关注非常大的数字上的字节级操作(因为q%31336会随着q变为无穷大并且实际上不是常数而缩放),那么你的直觉就是O(1)。< / p>

想象q接近无穷大,你可以看到q%31336明显在0到31335之间,正如你所指出的那样。这个事实限制了数组元素的数量,这将排序时间限制为某些常数(n * log(n)==> 31335 * log(31335)* C,对于某些常数C)。所以这是整个算法的恒定时间。

但是,在现实世界中,乘法,除法和模数都根据输入大小进行缩放。如果你有兴趣搞清楚,你可以查找Karatsuba算法。我会把它留作练习。

答案 1 :(得分:2)

它是O(1),您可以从大O definition推导出来。如果f(x)是解决方案的复杂性,那么:

Equation 2

Equation 2

以及任何M > 470040nlogn n = 31336)和x > 0。这从定义中暗示:

Equation 1

答案 2 :(得分:-2)

如果此问题有几个不同的实例,每个实例都有自己的 k 值,那么该方法的复杂性不是O(1),而是O(k·ln k)