当前位置: 首页 > 知识库问答 >
问题:

数组函数的时间复杂度

江渊
2023-03-14

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

施弘壮
2023-03-14

不,不是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)。

宰父嘉胜
2023-03-14

号码

在索引中以1为增量,您不能期望有比O(n)更好的解决方案。

如果您的算法有效(我不认为它有效),它看起来需要O(n)步骤。

另外,你说你假设数组是排序的,但你还是对它进行了排序。所以你的代码是O(n*log(n))。

更重要的是,尝试对已经排序的数组进行排序是某些排序算法的最坏情况:它甚至可能是O(n**2)

你在找一个二分搜索法。

 类似资料:
  • 下面给出了问题陈述和解决方案。我无法理解解决方案背后的逻辑。 问题陈述: 给定一个数组包含n+1个整数,其中每个整数介于1和n之间,证明至少存在一个重复的数字。假设只有一个重复的数字,找到重复的一个。 首先,搜索空间是1到n之间的数字。每次我选择一个数字mid(它是中间的那个),并计算所有等于或小于mid的数字。如果计数大于mid,则搜索空间为[1 mid],否则为[mid+1n]。我这样做,直到

  • 我在考虑如何正确计算这个函数的时间复杂度: 我假设它是 O(n),其中 n 是列表的长度。我们的 while 循环是 O(n),for 循环也是 O(n), 这意味着我们得到了 2*O(n),等于 O(n)。 我说的对吗?

  • 我最近了解了杂耍算法如何在线性时间内旋转数组 时间复杂度如何线性???

  • 如何计算以下函数的时间复杂度? 现在,我知道循环具有O(n)时间复杂度,但在这种情况下,I以更快的速度增长。一次又一次地迭代,我发现,对于每一个第m次迭代,I=m^2。但我仍然不知道如何计算大O。

  • 顺便说一句,我试图解决时间复杂性,我找到了O(2^n)。正确吗?

  • 函数可以处理传递给它的参数,并且能返回它的退出状态码给脚本,以便后续处理。 function_name $arg1 $arg2 函数通过位置来引用传递过来的参数(就好像它们是位置参数),例如,$1, $2,等等。 例子 24-2. 带参数的函数 #!/bin/bash # 函数和参数 DEFAULT=default # 默认参数值。D func2 () {