作为我最近看到的编程作业的一部分,学生被要求找到他们的功能的大O值来解决难题。我很无聊,并决定自己编写程序。但是,我的解决方案使用我在问题中看到的模式来跳过大部分计算。
Big O显示时间如何根据缩放n
而增加,但随着n
缩放,一旦达到模式的重置,它所花费的时间也会重置为低值。我的想法是当O(nlogn % k)
重置时k+1
为O(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}}。
答案 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)
答案 2 :(得分:-2)
如果此问题有几个不同的实例,每个实例都有自己的 k 值,那么该方法的复杂性不是O(1),而是O(k·ln k)
。