第k次的时间复杂度最大

时间:2015-11-13 01:19:57

标签: java time-complexity

所以我被要求在数组中找到第k个最大值。标签建议的代码在java中。我不完全理解时间复杂性,并且听说这可以在n中完成。我想知道我的程序的时间复杂程度是多少。

注意,此方法确实找到(k + 1)最大元素,这是故意的。

public static int kthLargest(int[] a, int k){
    int max = Integer.MAX_VALUE, curMax;

    for (int i = 0; i <= k; i++){ //Recurs k+1 times. 
        curMax = 0;

        //This loop just finds the max of the input array.
        //It also makes sure that the max it is finding is less 
        //than the previous max found.
        for (int j = 0; j < a.length; j++){ 
            int num = a[j];
            if (num > curMax && num < max){
                curMax = num;
            }
        }

        max = curMax;
    }
    return max;
}

只是一个注释,我的猜测是它将是k * n的O,这将是n ^ 2次迭代的最坏情况,但有人告诉我k无关紧要。

3 个答案:

答案 0 :(得分:1)

是的,您确定您的算法是O(k * n),并且有一个O(n)算法不是您的算法。

(听起来你的问题是作业,所以我不清楚我应该给你最好的答案,但一个简单的解决方案可能是对数组进行排序并从最后获取第k个元素。)

答案 1 :(得分:1)

时间复杂度可能是一个棘手的主题,因此,为了您的问题,我们只需将O定义为给定算法将采用的最大时间量,以所需的操作数(通常是比较数)表示。

因此,遍历一个大小为N的数组并找到最大的元素需要O(N),因为我们必须将数组中的每个元素与我们到目前为止看到的最大元素进行比较。我们只需要在存储器中存储当前最大元素时遍历数组一次,因此O(N)。

假设我们想再次遍历同一个数组,但是这种类型我们想要找到&gt;的元素数量。当前元素,用于数组中的每个元素。在这种情况下,您将遍历数组中每个元素的完整数组一次,有效地访问每个元素N次。访问N次的数组中的N个元素是N * N,因此该算法将是O(N ^ 2)。

您的算法在数组中找到K次的最大数,其中K是数组中的第K个最大值(我假设您知道给定代码的工作原理)。 K或C通常用于定义O表示法中的常量。在某些情况下,比如在乘法或加法多项式时,在为给定算法定义O时会丢弃常数,但在这种情况下,由于其不可忽略的影响,保留常量是有意义的。

执行简单的Google搜索以解决在O(N)时间内运行的此问题。

答案 2 :(得分:0)

如果您使用渐近符号来表示时间复杂度,则可以忽略 常数,默认情况下,O(n)的含义是g(n)&lt; = c f(n)其中g(n)是你的函数。

你的程序的时间复杂度是O(k
n),是的,它可以在O(n)或O(k * log n)中完成。

试试这个:https://en.wikipedia.org/wiki/Search_algorithm

相关问题