forループと2つのlinkedListsに関係する内部の2つの入れ子whileループでアルゴリズムの複雑さを見出そうとすると、私は非常に混乱します。次のコードを考えてみましょう: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;
}
をジャストフィールドmyarrayのよう含まれている(クラス名を言う)が二つのオブジェクトこれと同じクラスのBということを想像してみてください。このオブジェクトから関数funcを呼び出し、bオブジェクトを渡します。 this.myArray [i]リスト内のすべてのノードは、b.myArray [i] list内のすべてのノードと比較されます。 myArrayの各要素のリストはどれくらいの長さかわかりません。時には、b.myArray [i]がnullと等しいか、this.myArray [i]がnullと等しい場合でも、繰り返しと実行時間が短縮されます。私はこの複雑さがO(n^3)になると思った。しかしこれは正しいのですか?複雑なO(n)を持つforループについては確信していますが、whileループでは何が起こっているのか分かりません。 ご協力いただければ幸いです!
「a」と「b」とは何ですか?あなたは最初の 'myArray'を使用することは決してありません。そして、"いくらかの作業 "は複雑さに影響しますので、 –
を示してください。3つの配列に対して繰り返します。私にとっては、O(N x M x K)、1番目の配列のN番目のサイズ、2番目のMサイズ、3番目のKサイズのように見えます。 N == M == KならO(N^3)です。 – RMachnik
@ cricket_007投稿を編集しました。それがより明確になっているかどうかを確認してください。コメントありがとう – Cache