【问题标题】:run time of two nested while loops inside a for loopfor 循环内两个嵌套 while 循环的运行时间
【发布时间】:2017-01-15 12:05:22
【问题描述】:

当我试图找到一个算法的复杂性时,我很困惑,其中包含一个 for 循环和 2 个嵌套的 while 循环,涉及两个链接列表。考虑以下代码:

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),其中包含字段 myArray。假设我们从这个对象调用函数 func 并传递 b 对象。 this.myArray[i] 列表中的每个节点都将与 b.myArray[i] 列表中的每个节点进行比较。我们不知道 myArray 的每个元素中的列表有多长。有时 b.myArray[i] 可能等于 null 甚至 this.myArray[i] 等于 null 这将减少我认为的迭代和运行时间。我认为这种复杂性将是 O(n^3)。但这是正确的吗?我确信 for 循环的复杂度为 O(n),但我不确定 while 循环发生了什么。 任何帮助将不胜感激!

【问题讨论】:

  • ab 是什么?你永远不会使用第一个myArray,并且“一些工作”会影响复杂性,所以表明
  • 您肯定是在迭代 3 个数组。对我来说,它看起来像 O(N x M x K),N - 第一个数组的大小,第二个数组的 M 个大小,第三个数组的 K 个大小如果 N==M==K,那么它是 O(N^3)。跨度>
  • @cricket_007 我编辑了帖子。看看现在是否更清楚了。感谢您的评论
  • myArray 是列表节点的数组吗?列表是独立的吗?

标签: java arrays algorithm linked-list


【解决方案1】:

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

对于从0n-1 的每个i,令Ai 为列表this.myArray[i] 的长度,Bi 为列表b.myArray[i] 的长度。

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

A0×B0 + A1×B1 + ... + An-1×Bn-1

为了确定时间复杂度,您需要对AiBi 的值进行一些限制。

几个例子:

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

    Ai ≤ M0n-1 的每个i

    Bi ≤ M0n-1 的每个i

    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 次。

【讨论】:

    【解决方案2】:

    所以澄清一下,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).

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-02
      相关资源
      最近更新 更多