我编写了一个函数来查找应该在给定数组中插入目标值的位置。我们假设数组具有不同的值,并按升序排序。我的解决方案必须是O(log N)时间复杂度
public static int FindPosition(int[] A, int target) {
int a = A.length / 2;
System.out.println(a);
int count = a;
for (int i = a; i < A.length && A[i] < target; i++) {
count++;
}
for (int i = a; i > A.length && A[i] > target; i--) {
count++;
}
return count;
}
此代码是否具有O(log N)的复杂性?
答案 0 :(得分:1)
没有
在您的索引中增加1
,您不能指望有比O(n)
更好的解决方案。
如果您的算法完全有效(我认为不行),看起来需要O(n)
步。
另外,您说您假设数组已排序,但无论如何您都要对其进行排序。所以你的代码是O(n*log(n))
。
更重要的是,尝试对已排序的数组进行排序是某些排序算法的最坏情况:它甚至可能是O(n**2)
。
您正在寻找binary search。
答案 1 :(得分:1)
不,不是nlogn
public static int FindPosition(int[] A, int target){
/*
Time taken to sort these elements would depend on how
sort function is implemented in java. Arrays.sort has average
time complexity of Ω(n log n), and worst case of O(n^2)
*/
Arrays.sort(A);
/*Time taken to run this loop = O(length of A) or O(N)
where N = arraylength
*/
for(int i=a;i<A.length&&A[i]<target;i++){
count++;
}
/*Time taken to run this loop = O(length of A) or O(N)
where N = arraylength
*/
for(int i=a;i>A.length&&A[i]>target;i--){
count++;
}
return count;
}
现在时间复杂度将由最长的三个来表示,因为任务和所有都是在恒定时间内完成的。
因此在最坏的情况下使你的复杂度为O(n ^ 2)。