Java 在O(1)中查找大于x的数组值中的第一个索引

Java 在O(1)中查找大于x的数组值中的第一个索引,java,arrays,Java,Arrays,我有一个int类型的排序数组,我想得到第一个索引,它的值大于java中O(1)中的目标值 例如:int-arr[]={1,4,7,9,15,30} 目标=10 我的函数应该返回4,索引为15。为了能够通过数组找到具有特定属性(例如:大于目标)的值的索引,必须遍历实现搜索算法的数组 因此O(1)不可能实现。 如果数组已排序(如示例中所示),则可以通过实现二进制搜索算法在O(log(n))中实现所需的内容。您也可以在中使用实现 如果数组未排序,则必须使用O(n)复杂度的线性搜索算法在最坏情况下遍历

我有一个int类型的排序数组,我想得到第一个索引,它的值大于java中O(1)中的目标值

例如:int-arr[]={1,4,7,9,15,30} 目标=10
我的函数应该返回4,索引为15。

为了能够通过数组找到具有特定属性(例如:大于目标)的值的索引,必须遍历实现搜索算法的数组

因此O(1)不可能实现。

  • 如果数组已排序(如示例中所示),则可以通过实现二进制搜索算法在O(log(n))中实现所需的内容。您也可以在中使用实现
  • 如果数组未排序,则必须使用O(n)复杂度的线性搜索算法在最坏情况下遍历数组的所有元素

为了能够通过数组找到具有特定属性(例如:大于目标)的值的索引,必须遍历实现搜索算法的数组

因此O(1)不可能实现。

  • 如果数组已排序(如示例中所示),则可以通过实现二进制搜索算法在O(log(n))中实现所需的内容。您也可以在中使用实现
  • 如果数组未排序,则必须使用O(n)复杂度的线性搜索算法在最坏情况下遍历数组的所有元素

如果您准备这样的索引数组(或映射)

    int[] a = {1,4,7,9,15,30};
    // prepare indices array
    int[] indices = new int[a[a.length - 1] + 1];
    for (int i = 0, j = 0, aLength = a.length; i < aLength; ++i)
        while (j <= a[i])
            indices[j++] = i;
    System.out.println(Arrays.toString(indices));
    // -> [0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5]
    // get the first index whose value is greater than a target in O(1)
    System.out.println(indices[10]); // -> 4 (index of 15)
int[]a={1,4,7,9,15,30};
//准备索引数组
int[]索引=新的int[a[a.length-1]+1];
对于(int i=0,j=0,aLength=a.length;i4(索引15)

您可以通过O(1)中的
索引[target]
来获取索引值。

如果您准备这样的索引数组(或映射)

    int[] a = {1,4,7,9,15,30};
    // prepare indices array
    int[] indices = new int[a[a.length - 1] + 1];
    for (int i = 0, j = 0, aLength = a.length; i < aLength; ++i)
        while (j <= a[i])
            indices[j++] = i;
    System.out.println(Arrays.toString(indices));
    // -> [0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5]
    // get the first index whose value is greater than a target in O(1)
    System.out.println(indices[10]); // -> 4 (index of 15)
int[]a={1,4,7,9,15,30};
//准备索引数组
int[]索引=新的int[a[a.length-1]+1];
对于(int i=0,j=0,aLength=a.length;i4(索引15)

你可以通过O(1)中的
索引[target]
来获得索引值。

“O(1)”祝你好运。因为你不知道你想要的值在哪里,你必须搜索它,因此“n”在这里很重要。我不认为这可能在O(1)中。为什么你需要在O(1)中完成它?在O(n)中很容易虽然它是经过排序的,所以你应该能够比O(n)做得更好。@Tom如果你有一个足够大的查找表,所有的问题都是O(1):-p这实际上很有趣,而且可能是很有可能的。但是,我认为您必须放弃一些东西才能进行这样的查询。我的意思是,您必须编写一个函数,在该函数中,将值插入数组可能需要O(n),并且可能会使用额外的空间,然后得到一个以O(1)运行的查询如果你不知道你想要的值在哪里,你必须搜索它,因此“n”在这里是很重要的。我不认为这可能在O(1)中。为什么你需要在O(1)中完成它?在O(n)中它会很容易,虽然它是排序的,所以你应该能够做得比O(n)更好.@Tom如果你有一个足够大的查找表,所有的问题都是O(1):-p这实际上很有趣,可能是很有可能的。但是,我认为你必须放弃一些东西才能进行这样的查询。我的意思是,你必须编写一个函数,在其中向数组中插入值可能需要O(n),并可能使用额外的空间,然后得到一个在O(1)中运行的查询。我将看看是否能想出一些东西