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

Java 给定一个排序数组(按绝对值排序)和一个数字,找到该数字的位置

Java 给定一个排序数组(按绝对值排序)和一个数字,找到该数字的位置,java,arrays,Java,Arrays,假设我们有一个数组 a[] ={1,2,-3,3,-3,-3,4,-4,5} 然后找到3的位置(也就是3) 答案没有多个索引 它必须是有效的,而不是线性的 我想对数组进行二进制搜索,但不是比较原始值,而是比较绝对值;abs(a[i])和abs(n)[n是输入编号]。然后,如果值相等,我再做一次比较,现在是原始值a[I]和n 但是我遇到了一个问题,如果我在上面的情况下,使用相同的数组{1,2,-3,3,-3,4,-4,5},并寻找3,那么有多个-3会妨碍我(因此,我必须检查原始值a[I]和n是否

假设我们有一个数组

a[] ={1,2,-3,3,-3,-3,4,-4,5}
然后找到3的位置(也就是3)

答案没有多个索引

它必须是有效的,而不是线性的

我想对数组进行二进制搜索,但不是比较原始值,而是比较绝对值;abs(a[i])和abs(n)[n是输入编号]。然后,如果值相等,我再做一次比较,现在是原始值a[I]和n

但是我遇到了一个问题,如果我在上面的情况下,使用相同的数组{1,2,-3,3,-3,4,-4,5},并寻找3,那么有多个-3会妨碍我(因此,我必须检查原始值a[I]和n是否不起作用,我必须检查a[I+1]和a[I-1])

好吧,我现在只是漫无目的地闲聊。我是不是想得太多了


帮帮我,谢谢!!!:这是一个改进的二进制搜索问题。这种搜索与常规二进制搜索的区别在于,您需要找到并测试根据排序标准比较为相等的所有元素

我想:

  • 使用经过调整的二进制搜索算法查找匹配的最左侧元素的索引

  • 迭代索引,直到找到要查找的元素,或绝对值不再匹配的元素


第一步应该是O(logN)。如果假设元素值均匀分布,则第二步平均为O(1)。(第二步的最坏情况是O(N);例如,当所有元素都具有相同的绝对值,并且您想要的元素是数组中的最后一个时。)

以下是解决问题的方法:

/**
 * @param a array sorted by absolute value
 * @param key value to find (must be positive)
 * @return position of the first occurence of the key or -1 if key not found
 */
public static int binarySearch(int[] a, int key) {
    int low = 0;
    int high = a.length-1;

    while (low <= high) {
        int mid = (low + high) >>> 1;
        int midVal = Math.abs(a[mid]);

        if (midVal < key)
            low = mid + 1;
        else if (midVal > key || (midVal == key && mid > 0 && Math.abs(a[mid-1]) == key))
            high = mid - 1;
        else
            return mid; // key found
    }
    return -1; // key not found.
}
/**
*@param按绝对值排序的数组
*@param要查找的键值(必须为正)
*@返回第一次出现的键的位置,如果找不到键,则返回-1
*/
公共静态int二进制搜索(int[]a,int键){
int低=0;
int高=a.length-1;
而(低>>1;
int midVal=Math.abs(a[mid]);
中频(中频<键)
低=中+1;
else if(midVal>key | |(midVal==key&&mid>0&&Math.abs(a[mid-1])==key))
高=中-1;
其他的
return mid;//找到密钥
}
return-1;//找不到密钥。
}
这是对JDK中的数组的修改。binarySearch有几个变化。首先,我们比较绝对值。其次,由于您不需要任何键位置,而是第一个键位置,我修改了一个条件:如果我们找到一个键,我们将检查前一个数组项是否具有相同的值。如果是,则继续搜索。这样,算法将电源
O(对数N)
即使是在有太多值等于key的特殊情况下。

是的,二进制搜索会在一个值相等的区域中查找索引。然后,您可以从该索引上下移动,直到找到正确的值或区域的结尾。请注意,在最坏的情况下,它必须是线性的-想象一个值为1000的元素s为-3,其中某个地方有一个值为3。它们的绝对值都相等-你不可能在比线性时间更好的时间里找到3。