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