我们获得了一个半分类数组: (1,2,...,n,1,2,...,n-1) 我们知道数组中的最大值将是n,并且为了简单起见,我们知道何时超过它(假设检查该值将打印/写入语句,或者沿着这些行的某些内容)。
2个场景:
如果我们超过n的索引,我们不允许再次超调(除了最后一次,所以我们知道我们处于最大值)。
如果我们超过n的索引,我们可以再次超过它,然后我们不再允许超调(除了最后一次因此我们知道我们处于最大值)
我们希望在最坏的情况下使用最少量的步骤完成此操作(最好计算步数#)。我们希望选项2渐近使用比选项1更少的步骤(最好计算步数)。
最初,我想到了以下内容:
从i = 1开始
i = 2i直到超调
从1 / 2i到2i-1的线性搜索,直到我们达到最大值(我们知道超过1)。
我认为这将是一个O(logn)算法,但它实际上似乎是O(n)。这是因为它不像二进制搜索,我们能够一直持续到最后,因为我们必须在我们超调时停止。
现在,我已经考虑过使用指数: 1.从i = 1开始 2. i ^ 2,如果没有超调然后i = i + 1,则继续此步骤直到超调 3.从(i-1)^ 2到(i ^ 2)1的线性搜索,直到我们达到最大值(我们知道超过1)。
这似乎是O(n ^ 1/2),但是在计算确切的步数时,看起来它实际上仍然是O(n),因为线性搜索对于高可能仍然非常大ñ
对于第二部分,我考虑使用相同的算法但使用i ^ 3.
从i = 1开始
i ^ 3,与上述相同
如果超调,则切换到i ^ 2,与上面相同
...
我认为这会给O(n ^ 1/3)。
多部分问题:
可以改进这些算法,以便在最坏的情况下执行最少的检查次数吗?
我是否正确算法复杂度为O(n ^ 1/2)和O(n ^ 1/3)如果是这样,那么步骤的确切步骤是什么,因为它似乎就是那个步骤废墟此
答案 0 :(得分:0)
n
的最佳答案问题很难。但是找到k
测试可以完成的最大数量要容易得多。
让f(m, k)
成为数组的最大大小,您可以在其中找到最多m
次超调和最多k
次测试的最大值。然后是以下陈述:
f(m, 0) = 1
(有1个选项,我知道最大值在哪里)f(0, k) = k+1
(从头开始直到找到它为止......如果你在k
尝试失败,那么它是你没看过的最后一个)f(m+1, k+1) = f(m, k) + 1 + f(m+1, k)
(测试f(m, k) + 1
'号码,然后根据您是否过冲来做适当的事情。)事实证明f(1, k) = k*(k+1)/2
。从那里他们变得凌乱。但对于固定的m
,您可以显示f(m, k) = km/m! + O(km-1)
哪个验证您对O(n1/2)
和O(n1/3)
的猜测。