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