Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 方法复杂度大_Java_Search_If Statement_Big O_Time Complexity - Fatal编程技术网

Java 方法复杂度大

Java 方法复杂度大,java,search,if-statement,big-o,time-complexity,Java,Search,If Statement,Big O,Time Complexity,我在分析这个方法时遇到了一些问题,因为它太复杂了。事实上,由于其混乱的性质,我也不确定该方法是如何工作的。现在,我只知道数组中的“逐渐缩小的范围”将搜索给定的数字。有人能解释一下下面的代码,并指导我如何分析它的复杂性吗 static int foo(int a[], int u, int l, int x) { while(l <= u) { int s = (u-l+1)/3, f = l+s, b = f+s; if(a[f] == x)

我在分析这个方法时遇到了一些问题,因为它太复杂了。事实上,由于其混乱的性质,我也不确定该方法是如何工作的。现在,我只知道数组中的“逐渐缩小的范围”将搜索给定的数字。有人能解释一下下面的代码,并指导我如何分析它的复杂性吗

static int foo(int a[], int u, int l, int x) {
    while(l <= u) {
        int s = (u-l+1)/3, f = l+s, b = f+s;
        if(a[f] == x)
            return f;
        else if(a[b] == x)
            return b;
        else if(a[f] > x)
            u = f-1;
        else if(a[b] > x)
            l = b+1;
        else {
            l = b-1;
            u = f+1;
        }
    }
    return -1;
} 
静态intfoo(inta[],intu,intl,intx){
while(lx)
u=f-1;
否则如果(a[b]>x)
l=b+1;
否则{
l=b-1;
u=f+1;
}
}
返回-1;
} 

似乎l=低,u=高,所以u-l是范围。S则是范围的三分之一。这种方法做了一些奇怪的事情,但在每次迭代中,范围缩小了三分之一


如果范围缩小了一半(如二进制搜索),那显然是logn。但这样一来,每次减少三分之一。。你觉得怎么样?

似乎l=低,u=高,所以u-l是范围。S则是范围的三分之一。这种方法做了一些奇怪的事情,但在每次迭代中,范围缩小了三分之一


如果范围缩小了一半(如二进制搜索),那显然是logn。但这样一来,每次减少三分之一。。你怎么看?

这段代码似乎在搜索排序数组
a
,在较低索引
k
和较高索引
u
之间搜索值
x
。它通过调整搜索间隔的两端来实现这一点,并使用一系列子句来调整搜索中包含的下限或上限。搜索
s
的步长是范围
(u-l+1)
的三分之一,“暂定新边界”是
f
b
。根据解决方案是在新范围内还是现在,该算法将搜索范围缩小到旧区域的三分之一

为了更好地了解它的工作原理,我建议您为循环的每个迭代打印出数字
l
u
;然后增加
x
(例如,每次增加一倍)并重复

当您绘制循环数vs x时,您将很快看到,对于大x,您是得到一条直线、一条抛物线还是其他东西。你可以从中获得一些见解;如果运气好的话,这种关系会很快变得清晰


要认识到,大多数情况下,您将调整到1/3的大小,因此迭代次数只会随着时间间隔的大小缓慢增加-事实上,3倍大的时间间隔只需要再进行一次迭代。这是一个O(log(n))过程的标志。

这段代码似乎正在搜索排序数组
a
,以查找较低索引
k
和较高索引
u
之间的值
x
。它通过调整搜索间隔的两端来实现这一点,并使用一系列子句来调整搜索中包含的下限或上限。搜索
s
的步长是范围
(u-l+1)
的三分之一,“暂定新边界”是
f
b
。根据解决方案是在新范围内还是现在,该算法将搜索范围缩小到旧区域的三分之一

为了更好地了解它的工作原理,我建议您为循环的每个迭代打印出数字
l
u
;然后增加
x
(例如,每次增加一倍)并重复

当您绘制循环数vs x时,您将很快看到,对于大x,您是得到一条直线、一条抛物线还是其他东西。你可以从中获得一些见解;如果运气好的话,这种关系会很快变得清晰


要认识到,大多数情况下,您将调整到1/3的大小,因此迭代次数只会随着时间间隔的大小缓慢增加-事实上,3倍大的时间间隔只需要再进行一次迭代。这是一个O(log(n))过程的标志。

它是一个,其复杂性仍然是
O(lgn)
它是一个,其复杂性仍然是
O(lgn)

请浏览本教程日志n。二进制搜索。。。有点。请浏览这个教程日志。二进制搜索。。。有点。事实上,不管射程是以一半还是三分之一的速度缩小。复杂性仍然是log n。但我也担心这种方法所做的“奇怪的事情”。这些不会影响复杂性吗?这些“奇怪的事情”会在每次迭代中添加一些指令,但“复杂性”完全是关于一个问题:“如果我将输入的大小增加一倍,需要多长时间”。在这种情况下,三倍的输入间隔意味着更多的迭代(通常)。剩下的是“处理结束案例行为”,因为间隔是整数值的。看看这个方法,它要么缩小范围,要么立即返回。事实上,不管范围是以一半还是三分之一的速度缩小。复杂性仍然是log n。但我也担心这种方法所做的“奇怪的事情”。这些不会影响复杂性吗?这些“奇怪的事情”会在每次迭代中添加一些指令,但“复杂性”完全是关于一个问题:“如果我将输入的大小增加一倍,需要多长时间”。在这种情况下,三倍的输入间隔意味着更多的迭代(通常)。剩下的是“处理结束案例行为”,因为间隔是整数值的。看看这个方法,它要么缩小范围,要么立即返回。是的。