在for循环中运行两个嵌套while循环的时间

时间:2017-01-15 12:05:23

标签: java arrays algorithm linked-list

我试图找到一个带有for循环和2个嵌套while循环的算法的复杂性时,我很困惑,它涉及两个linkedLists。请考虑以下代码:

public int func(ClassName b){
// int[] myArray = new Node[n]; 
Node curA;
Node curB;
int sum = 0;
 for(int i =0; i<n ; i++){
    curA = this.myArray[i];
    while(curA != null){
        curB = b.myArray[i]
        while(curB != null){
            if(curA.data.equals(curB.data) sum++;
            curB = curB.next;
        }
        curA = curA.next;
    }

  }
  return sum;
}

想象一下,有两个对象this和同一个类的b(比如ClassName)包含asArray字段。让我们说我们从这个对象调用函数func并传递b对象。 this.myArray [i]列表中的每个节点都将与b.myArray [i]列表中的每个节点进行比较。我们不知道myArray的每个元素中的列表有多长。有时候b.myArray [i]可能等于null或甚至this.myArray [i]等于null,这将减少我认为的迭代和运行时间。我认为这种复杂性将是O(n ^ 3)。但这是对的吗?我确信具有复杂度O(n)的for循环但我不确定while循环是怎么回事。 任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:1)

似乎您混淆的根源是试图用n的函数来表达算法的时间复杂度。如果列表的长度与n无关,则不可能。

对于从i0的每个n-1Ai为列表this.myArray[i]的长度,Bib.myArray[i]的长度列出A0×B0 + A1×B1 + ... + An-1×Bn-1

执行最内层循环的确切次数为:

Ai

为了确定时间复杂度,您需要对BiM的值设置一些限制。

一些例子:

  • 假设每个列表的长度都以Ai ≤ M为界。

    i0的每个n-1

    Bi ≤ M

    i0的每个n-1

    A0×B0 + A1×B1 + ... + An-1×Bn-1 ≤ n×M²

    (n×M²)

    所以时间复杂度为K

  • 假设每个对象列表中的元素总数受A0 + A1 + ... + An-1 ≤ K限制。

    B0 + B1 + ... + Bn-1 ≤ K

    A0×B0 + A1×B1 + ... + An-1×Bn-1 ≤ (A0 + A1 + ... + An-1)×(B0 + B1 + ... + Bn-1) ≤ K²

    (K²)

    所以时间复杂度为Ω(n)

  • 假设您不知道列表可以使用多长时间。然后执行时间的上限也不知道。你能说的最多的是下限是n,因为最外面的循环总是会执行SELECT case Col1 when 3 then Col2 else Col1 end, count(*) FROM scores WHERE Col1 = 3 OR Col2 = 3 Group by case Col1 when 3 then Col2 else Col1 end; 次。

答案 1 :(得分:0)

因此,为了澄清,myArray字段是链接列表的数组。如果以伪代码表示,这就是您的代码实际执行的操作:

for each index i in this.myArray
  iterate over all elements of this.myArray[i]
    iterate over all elements of b.myArray[i]
      do O(1) work

如果this.myArray的长度为N,则this.myArray中列表的最大长度为M,b.myArray中列表的最大长度为K,则运行时复杂度为是 O(M x N x K)