以下方法在未排序的数组中查找最长的连续整数序列。 ({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)也是? (我正在谈论最坏的情况)。
我需要用更复杂的函数编写这个方法。有谁有想法吗? (我只能使用迭代,没有更高级的东西)。
答案 0 :(得分:1)
该函数不会创建新数组,也不会递归。因此,O(1)
在记忆中。
时间复杂度看起来似乎是O(n^3)
,因为(最坏的情况)它在所提供的数组上使用三重嵌套扫描。
应该可以通过注意一旦您调用find
后只需要从find
保释的点开始考虑原始列表,就可以使搜索更加优化。
如果列表已经排序,则算法只需要O(n)
线性扫描。只需从count = 1
,max = 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)