Java 校验数组中的数字

Java 校验数组中的数字,java,performance,Java,Performance,快速检查数组中整数的方法。数组中没有连续整数,而是有空间数,例如[1,4,11,120,2,3] 如何以高效的方式检查[21231219,1,12,4]中的3?结果为假答案取决于您需要检查给定整数的频率 如果您必须反复检查同一数组,则可以更快地对其进行排序,并使用二进制搜索算法查找您的数字(如果您的数字不在数组中,则可以不查找) 在Java中,您不必重新发明轮子。您可以使用数组中的静态方法执行这些任务(数组的N个大小): 数组。排序(…)将按升序对数组排序。这将按O(N*log(N))步骤对数组

快速检查数组中整数的方法。数组中没有连续整数,而是有空间数,例如[1,4,11,120,2,3]


如何以高效的方式检查[21231219,1,12,4]中的
3?结果为假

答案取决于您需要检查给定整数的频率

  • 如果您必须反复检查同一数组,则可以更快地对其进行排序,并使用二进制搜索算法查找您的数字(如果您的数字不在数组中,则可以不查找)

    在Java中,您不必重新发明轮子。您可以使用
    数组中的静态方法执行这些任务(数组的N个大小):

    数组。排序(…)
    将按升序对数组排序。这将按
    O(N*log(N))
    步骤对数组进行排序

    array.binarySearch(…)
    之后将在已排序的数组中找到您的号码。在
    O(log(N))
    步骤中查找元素

  • 如果每隔一段时间只检查一次给定值,则可以简单地在数组上迭代。在
    O(N)
    步骤中查找元素


  • 有两种方法

    考虑大小为N和T的数组搜索

    线性搜索法 复杂性:
    O(T*N)

    示例代码:

    class Main {
        public static void main(String[] args) {
            int[] arr = { 212, 31219, 1, 12, 4 };
            // perform searches from here
            // for eg.
            // boolean exists = contains(arr, 4);
    
        }
    
        public static boolean contains(int[] arr, int x) {
            for (int i = 0; i < arr.length; i++) {
                if (arr[i] == x) {
                    return true;
                }
            }
            return false;
        }
    }
    
    import java.util.Arrays;
    
    class Main {
        public static void main(String[] args) {
            int[] arr = { 212, 31219, 1, 12, 4 };
    
            // sort array first => complexity O(N * log(N))
            Arrays.sort(arr);
    
            // perform searches from here
            // for eg.
            // boolean exists = contains(arr, 2);       
        }
    
        public static boolean contains(int[] arr, int key) {
            return Arrays.binarySearch(arr, key) >= 0 ? true : false;
        }
    }
    

    所以,如果您的搜索数量非常高,请使用二进制搜索方法,否则请使用线性搜索方法。

    我有一个实现,在数组上迭代。对我来说很慢。其他建议“检查数组中的整数”是什么意思?什么是“空间数”?如果数组未排序,则必须迭代。您也可以使用
    数组。asList(…)。contains(…)
    如果不单独检查每个项目,显然不可能做到这一点。为什么O(n)(n是数组的大小)不够好?我认为没有更快的方法了。第一次搜索仍然是O(n+log(n)),我相信这会简化为O(n),因为你必须首先对数组进行排序,然后运行二进制搜索。@RickyMutschlechner排序是
    O(n*log(n))
    是的,第一次运行将是
    O(n*log(n)+log(n))
    用于一次排序和一次二进制搜索。但是正在进行的搜索只会添加一个
    O(log(n))
    二进制搜索步骤。这样,最终复杂度是
    O(n*log(n)+m*(log(n))
    ,其中m是检查的总数。对于固定的
    n
    和可能较大的
    m
    ,这比迭代方法的步骤要少。