繁体   English   中英

第 k 个最大的时间复杂度

[英]Time Complexity of kth largest

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

注意,这个方法确实找到了 (k+1)Largest Element,这是故意的。

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 无关紧要。

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

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

时间复杂度可能是一个繁重的话题,所以为了您的问题,让我们将 O 定义为给定算法将花费的最长时间,以所需的操作数(通常是比较)表示。

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

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

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

做一个简单的谷歌搜索,寻找在 O(N) 时间内运行的这个问题的解决方案。

如果您使用渐近符号来表示时间复杂度,则可以忽略常量,因为默认情况下 O(n) 的含义是 g(n) <= c f(n) 那里 g(n) 是您的函数。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM