Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.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_Arrays_Algorithm - Fatal编程技术网

Java 检查数组中的值是否与它对应

Java 检查数组中的值是否与它对应,java,arrays,algorithm,Java,Arrays,Algorithm,不久前我遇到了一个算法问题 我需要找出数组中存储的值是否在它的“位置”。 举个例子会更容易理解 让我们看一个数组A={-10,-3,3,5,7}。算法将返回3,因为数字3位于[2](第3位)。 相反,如果我们取一个数组B={5,7,9,10},算法将返回0或false或其他任何值 数组总是被排序的 我没能找到一个复杂度很高的解决方案。(单独查看每个值是不好的!)也许可以通过使用类似于合并排序的方法来解决该问题,方法是对半剪切并在这些对半上进行验证 有人能帮我吗? Java算法将是最好的,但伪代码

不久前我遇到了一个算法问题

我需要找出数组中存储的值是否在它的“位置”。 举个例子会更容易理解

让我们看一个数组A={-10,-3,3,5,7}。算法将返回3,因为数字3位于[2](第3位)。 相反,如果我们取一个数组B={5,7,9,10},算法将返回0或false或其他任何值

数组总是被排序的

我没能找到一个复杂度很高的解决方案。(单独查看每个值是不好的!)也许可以通过使用类似于合并排序的方法来解决该问题,方法是对半剪切并在这些对半上进行验证

有人能帮我吗?
Java算法将是最好的,但伪代码也会帮我很多

如果要在数组中找到位于其自身位置的第一个数字,只需迭代数组:

static int find_in_place(int[] a) {
    for (int i=0; i<a.length; i++) {
        if (a[i] == i+1) {
            return a[i];
        }
    }
    return 0;
}
static int find_in_place(int[]a){
对于(int i=0;i,这里有一个算法(基于二进制搜索),用于查找最佳情况复杂度为O(log(n))和最坏情况复杂度为O(n)的所有匹配索引:

1-检查位置m=array.length/2处的元素

2-如果值数组[m]严格小于m,则可以忽略数组的左半部分(从索引0到索引m-1),然后递归地应用于右半部分

3-如果数组[m]==m,则向计数器添加一个,并递归应用于两半

4-如果数组[m]>m,则忽略数组的右半部分,并递归地应用于左半部分


在这里使用线程可以加快速度。我假设数组中没有重复。

因为没有重复,所以可以使用函数
f(x):A[x]-x
是单调的,并应用二进制搜索来解决
O(logn)
最坏情况下的复杂性问题

您希望找到函数
a[x]-x
取值为零的点。此代码应该工作:

boolean binarySearch(int[] data, int size)
{
    int low = 0;
    int high = size - 1;

    while(high >= low) {
        int middle = (low + high) / 2;
        if(data[middle] - 1 == middle) {
            return true;
        }
        if(data[middle] - 1 < middle) {
            low = middle + 1;
        }
        if(data[middle] - 1 > middle) {
            high = middle - 1;
        }
    }
    return false;
}
布尔二进制搜索(int[]数据,int大小)
{
int低=0;
int高=大小-1;
而(高>=低){
int-middle=(低+高)/2;
如果(数据[中间]-1==中间){
返回true;
}
if(数据[中间]-1<中间){
低=中+1;
}
if(数据[中间]-1>中间){
高=中-1;
}
}
返回false;
}

请注意Java中的数组是0索引的,这就是我从数组中减去
-1
的原因。

如果没有这样的元素,可以通过添加特殊条件跳过迭代

if(a[0]>1 && a[a.length-1]>a.length){
    //then don't iterate through the array and return false
    return false;
} else {
    //make a loop here
}

只需对0使用二进制搜索,并用于比较数组中的值减去数组的索引。O(logn)

使用二进制搜索(或类似算法)可以得到比O(n)更好的结果。由于数组已排序,我们可以做出以下假设:

  • 如果索引
    x
    处的值小于
    x-1
    a[x]x+1
    以下所有值必须大于其索引(同样,不允许重复)

使用该方法,您可以使用二进制方法选择中心值,检查其索引,如果左/右部分符合上述条件之一,则丢弃左/右部分。当然,当
a[x]时,您会停止=x+1

您是否尝试过为自己编写和测试一个算法?您在追求什么?二进制搜索不能直接应用于这里,因为函数
f(x)=>A[x]==x
不是单调的。为了“映射”数组的某些表示形式的值,适用于二进制搜索,您需要一些方法,至少
O(n)
:)数组中是否有重复项?@kfx,不可能有重复项这是我的想法,但我无法清楚地找到条件。谢谢!如果他只需要一个布尔值(即,至少有一个值匹配
a[m]==m
)在最坏的情况下,您会得到O(log(n))。@Thomas True。该算法会找到所有匹配索引,而不仅仅是
True
false
,感谢kfx,它工作得很好,在最佳情况下具有O(log(n))的复杂性。这正是所需要的。非常好的解决方案。:)