【发布时间】:2017-08-01 16:49:32
【问题描述】:
向所有程序员问好!
我想介绍我的方法来搜索时间复杂度较低的未排序数组(整数/字符串)。线性搜索方法通常用于最坏情况时间复杂度为 O(n) 的未排序数组。
我已经修改了线性搜索条件以检查数组的最后一个元素,从而减少了迭代。请查看此代码并提供您宝贵的反馈。这里在 O(n/2) 中搜索循环的最坏情况时间复杂度。 [编辑 - 通过答案,知道它仍然是 O(n)]
for(int i=0, len=arr.length; i<len; i++){
if(arr[i].equals(somethingToFind) || arr[--len].equals(somethingToFind)){
System.out.println("Found");
break;
}
}
此外,我们可以修改 if 语句以包含更多条件,例如检查 arr[i+1] 和 arr[len-1] 并将 i 增加 2 以减少迭代。举个例子!
我想知道上述代码与线性搜索相比是否有任何性能改进。你有什么想法?感谢您的回复!
编辑 - 非常感谢您的精彩回复!是的,我认为额外的条件会降低性能,但只是想澄清一下。 BigONotation 和时间复杂度给出了很好的回应。谢谢! :-)
【问题讨论】:
-
不,仍然是 O(n)。您无法在小于 O(n) 的时间内搜索未排序的数组。
-
@Kayaman 不正确,用量子计算,你可以
-
@DamianLattenero 是的,但直到 Java 13 才可用。
-
这样想——你怎么能保证元素存在于未排序的数组中,而不查看数组中的每个元素?无论您如何遍历它,查看数组中的每个元素都是 O(n)。
-
@Thuvi,另一种看待它的方式。给定您的解决方案,如果集合的大小增加 10 倍,则处理时间仍然是 10 倍。线性增长。
标签: java arrays algorithm search time-complexity