Arrays 半排序数组中最大值的算法,其中不可能进行完整的二进制搜索?

Arrays 半排序数组中最大值的算法,其中不可能进行完整的二进制搜索?,arrays,algorithm,sorting,time-complexity,Arrays,Algorithm,Sorting,Time Complexity,我们得到了一个半排序数组: 1,2,…,n,1,2,…,n-1 我们知道数组中的最大值将是n,为了简单起见,我们知道当我们超出它时,比如说检查该值将打印/写入一条语句,或者沿着这些行进行操作 2种情况: 如果我们超出了n的指数,除了最后一次,我们不允许再次超出,所以我们知道我们处于最大值 如果我们超过了n的指数,我们可以再次超过它,然后我们不能再超过它,除了最后一次,所以我们知道我们处于最大值 我们希望在最坏的情况下使用最少的步骤来完成,最好是计算步骤的数量。我们希望选项2使用比选项1渐进更少的

我们得到了一个半排序数组: 1,2,…,n,1,2,…,n-1 我们知道数组中的最大值将是n,为了简单起见,我们知道当我们超出它时,比如说检查该值将打印/写入一条语句,或者沿着这些行进行操作

2种情况:

如果我们超出了n的指数,除了最后一次,我们不允许再次超出,所以我们知道我们处于最大值

如果我们超过了n的指数,我们可以再次超过它,然后我们不能再超过它,除了最后一次,所以我们知道我们处于最大值

我们希望在最坏的情况下使用最少的步骤来完成,最好是计算步骤的数量。我们希望选项2使用比选项1渐进更少的步骤,最好计算步骤的数量

起初,我想到了以下几点:

从i=1开始

i=2i,直到超调

从1/2i到2i-1的线性搜索,直到我们通过超调1达到最大值

我原以为这是一个Ologn算法,但实际上它似乎是开着的。这是因为它不像二进制搜索,我们可以一直搜索到最后,因为我们必须在超调时停止

现在,我考虑使用指数: 1.从i=1开始 2.i^2,如果没有超调,则i=i+1,继续此步骤直到超调 3.从i-1^2到i^21的线性搜索,直到我们通过超调1达到已知的最大值

这似乎是在^1/2上,但在计算精确的步长时,它似乎实际上仍然是在打开的,因为对于高n,线性搜索可能仍然非常大

对于第二部分,我考虑使用相同的算法,但使用I^3

从i=1开始

i^3,同上

如果超调,则切换到i^2,同上

我以为这会在^1/3时发生

多部分问题:

这些算法是否可以改进,以便在最坏的情况下执行最少的检查

我的算法复杂性在^1/2和^1/3上的说法正确吗?如果正确,那么具体的步骤是什么,因为这一步似乎破坏了这一点


n的最佳答案问题很难回答。但是,用k个测试找到最大数量要容易得多

设fm,k为阵列的最大尺寸,在这里可以找到最大值,最大超调量最多为m,最多测试k个数字。那么下面的陈述是正确的:

fm,0=1,带1选项我知道最大值在哪里 f0,k=k+1从最开始开始,一直走到你找到它。如果你在k次尝试中失败了,那么它就是你最后一次没有看到的 fm+1,k+1=fm,k+1+fm+1,k测试fm,k+1的第1个数字,然后根据是否超调进行适当的操作。
结果是f1,k=k*k+1/2。从那里他们变得混乱。但是对于固定m,你可以显示fm,k=km/m!+Okm-1验证了您对On1/2和On1/3的猜测。

@user2357112谢谢,这看起来很有趣。我认为一个重要的区别是,我不知道最大楼层数,我知道有一个最大楼层数,但它可能是一栋100万层的建筑。这可能会对算法产生一些影响。您是否尝试过使用pivotedBinarySearch@Ser120920我实际上没有读到这个问题,但也许它可以帮助你…也许我很迟钝,因为其他人似乎都理解你的问题,但是。如果您知道数组是1,2,…,n,1,2,…,n-1,那么您还不知道所需的索引是n吗?为什么你需要尝试任何事情,冒着超越任何事情的风险,等等。?