我试图找到一个带有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循环是怎么回事。 任何帮助将不胜感激!
答案 0 :(得分:1)
似乎您混淆的根源是试图用n
的函数来表达算法的时间复杂度。如果列表的长度与n
无关,则不可能。
对于从i
到0
的每个n-1
,Ai
为列表this.myArray[i]
的长度,Bi
为b.myArray[i]
的长度列出A0×B0 + A1×B1 + ... + An-1×Bn-1
。
执行最内层循环的确切次数为:
Ai
为了确定时间复杂度,您需要对Bi
和M
的值设置一些限制。
一些例子:
假设每个列表的长度都以Ai ≤ M
为界。
i
到0
的每个n-1
Bi ≤ M
i
到0
的每个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)。