タイトルが述べたように、の実行時間は何equals()
ですかjava.util.Arrays
?
たとえば、2つint[]
を比較している場合、配列内のすべての要素をループするので、O(n)ですか?そして、Javaequals()
の個々のクラスのすべてequals()
について、ランタイムが常にO(n)であると想定できますか?
ありがとう。
ソースコードから取得(ソースコードは100ワードの価値があります:P):
/**
* Returns <tt>true</tt> if the two specified arrays of ints are
* <i>equal</i> to one another. Two arrays are considered equal if both
* arrays contain the same number of elements, and all corresponding pairs
* of elements in the two arrays are equal. In other words, two arrays
* are equal if they contain the same elements in the same order. Also,
* two array references are considered equal if both are <tt>null</tt>.<p>
*
* @param a one array to be tested for equality
* @param a2 the other array to be tested for equality
* @return <tt>true</tt> if the two arrays are equal
*/
public static boolean equals(int[] a, int[] a2) {
if (a==a2)
return true;
if (a==null || a2==null)
return false;
int length = a.length;
if (a2.length != length)
return false;
for (int i=0; i<length; i++)
if (a[i] != a2[i])
return false;
return true;
}
タイトルにあるように、java.util.Arraysのデフォルトのequals()の実行時間はどれくらいですか?
デフォルトのequalsは、Object.equalsを意味する場合があります。Arrays.equals()は通常、本当に必要なものです。
たとえば、2つのint []を比較している場合、配列内のすべての要素をループするので、O(n)ですか?
はい、それはソースが示唆していることです。
そして、Javaのすべてのデフォルトのequals()について、ランタイムが常にO(n)であると想定できますか?
一部のコレクションではこれが当てはまりますが、ツリーコレクションではO(n log n)になる可能性があります。HashMapの最悪のケースはO(N ^ 2)です。非コレクションの場合n
は意味がありません。
最初に長さをチェックし、等しい場合はすべての要素をループして、それらに対してequalsを呼び出します。
したがって、個人のコストが等しいことを無視したい場合は、そうです、それはO(n)になります。ただし、たとえば、エントリが文字列の場合、文字列が長くなるだけでなく、文字列が長くなるにつれて長くなります(比較自体もO(m)であるため)。
javadocの状態:2つの配列が同じ順序で同じ要素を含んでいる場合、それらは等しい。したがって、すべてのアイテムをループする必要があるため、これがO(n)操作になることは明らかです(少なくともそれらがすべて等しい場合)。
デフォルトequals
(つまり、Object#equals)はO(1)操作であり、単純な参照比較です。
null以外の参照値xおよびyの場合、このメソッドは、xとyが同じオブジェクトを参照している場合にのみtrueを返します(x == yの値はtrueです)。