【发布时间】:2018-11-07 09:25:53
【问题描述】:
我正在尝试设计一种具有 O(1) 时间复杂度的算法,它从数组中返回一个 不是 最小值的值。我知道搜索数组并比较它的元素以找到最小的将使算法 O(n),所以这不起作用。
如果我编写一个单独的方法,使用排序算法先对数组进行排序,然后返回最小的,这会影响算法的时间复杂度吗?
这是我的代码:
private static int nonSmallestElement(int[] array) {
int smallest = smallestElement(array);
int index = (int) (array.length * Math.random());
System.out.println("Index = " + index);
for (int i = index; i < array.length; i++) {
if (array[i] != smallest) {
return array[i];
}
}
return array[1];
}
private static int smallestElement(int[] array) {
Arrays.sort(array);
return array[0];
}
这里Arrays.sort() 方法使用的是双轴快速排序算法,即 O(n log(n))。现在这是否意味着 nonSmallestElement() 方法也具有该时间复杂度,或者它是 O(1),因为它不必处理排序?
【问题讨论】:
-
你必须算排序,否则你作弊。但是为什么还要对数组进行排序呢?我以为你想返回一个 NOT 最小的元素。
-
嗨。为了确保我没有返回最小值,我必须知道最小值是什么,不是吗?然后进行比较以返回任何其他值!= minimum
-
这里有一个提示:如果你手头有两个不同的值,那么较大的不能是数组中的最小值。对于“典型”数组,您希望在任意两个元素中找到两个不同的值。
-
@JamesKPolk 我相信我和你在一起。这样我就可以比较任何两个元素并返回更大的那个。干杯
-
@PumpkinBreath - 如果你可以有不明确(相等)的值,那么你可能需要查看超过 2 个。