数组函数的时间复杂度

时间:2017-04-23 19:11:03

标签: java arrays time-complexity

我编写了一个函数来查找应该在给定数组中插入目标值的位置。我们假设数组具有不同的值,并按升序排序。我的解决方案必须是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)的复杂性?

2 个答案:

答案 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)。