这里的内存复杂度是O(1)还是O(N)?

时间:2014-03-19 13:26:08

标签: java algorithm search complexity-theory time-complexity

以下方法在未排序的数组中查找最长的连续整数序列。 ({1,3,2,4,6,5}将返回6):

public static int what(int[] vec) {
    int m = 0;
    for (int i = 0; i < vec.length; i++) {
        int c  = 0;
        int n = i;

        do {
            n = find(vec, vec[n]+1);
            c++;
        } while (n != -1);

        if (c > m) {
            m = c;
        }
    }
    return m;
}

public static int find(int[] vec, int value) {
    for (int i = 0; i < vec.length; i++) {
        if (vec[i] == value) {
            return i;
        }
     }
     return -1;
}

我在循环外面看到一个变量,循环内部有两个变量,循环内部的变量是否使得该方法的内存复杂度为O(N)?

时间复杂度O(N ^ 3)也是? (我正在谈论最坏的情况)。

我需要用更复杂的函数编写这个方法。有谁有想法吗? (我只能使用迭代,没有更高级的东西)。

3 个答案:

答案 0 :(得分:1)

该函数不会创建新数组,也不会递归。因此,O(1)在记忆中。

时间复杂度看起来似乎是O(n^3),因为(最坏的情况)它在所提供的数组上使用三重嵌套扫描。

应该可以通过注意一旦您调用find后只需要从find保释的点开始考虑原始列表,就可以使搜索更加优化。

如果列表已经排序,则算法只需要O(n)线性扫描。只需从count = 1max = vec[0]开始,然后从第二个元素进行迭代。如果按顺序,请递增count并更新您的返回值(如果适用)。如果值依次,请再次将count重置为1。重复直到完成。

由于排序通常可以在O(n log n)中进行,第二阶段是O(n),因此整体复杂度将远远低于O(n^3)。排序算法本身不太可能保留O(1)内存使用量。

答案 1 :(得分:1)

其内存复杂度为0(1)。没有存储依赖于n并且没有递归。 同意时间复杂度O(n ^ 3)。根据您的算法,您最好花些时间对数组进行排序。

答案 2 :(得分:0)

您的方法返回可在输入向量中找到的最长序列。例如,

{1,2,4,3} - &gt; 4

{1,2,4,5} - &gt; 2

方法的内存复杂性为O(1),因为没有存储

方法的时间复杂度为O(n ^ 3)

您可以将方法重写为向量的排序(例如使用bubblesort(O(n ^ 2))),然后使用线性扫描(O(n))进行计数。

复杂度为O(n ^ 2)+ O(n)〜&gt; O(n ^ 2)&lt;为O(n ^ 3)