作为我最近看到的一项编程作业的一部分,学生们被要求找出解决难题的函数的大 O 值。我很无聊,决定自己写程序。但是,我的解决方案使用我在问题中看到的模式来跳过大部分计算。
大 O 显示时间如何根据缩放增加n
,但随着n
缩放,一旦达到模式的重置,它所花费的时间也会重置回低值。我的想法是它是O(nlogn % k)
什么时候k+1
重置的。另一个想法是,因为它有一个硬限制,所以值是O(1)
,因为这是任何常数的大 O。其中之一是对的,如果不是,应该如何表示限制?
作为复位示例,k
值为 31336。在 n=31336 时,需要 31336 步,但在 n=31337 时,需要 1。
代码是:
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
MergeSort
是具有O(nlogn)
复杂性的标准归并排序。