Javaの.equals演算子の時間計算量(big O)は、2つの文字列に対してどのようなものであるのか疑問に思いました。
基本的に、stringOne.equals(stringTwo)を実行した場合、これはどの程度うまく機能しますか?
ありがとう。
ここでの他の答えは単純すぎます。
一般に、2 つの異なる文字列が等しいことを証明するには、各文字を比較するO(n)
必要がある場合があります。
ただし、これは最悪のケースにすぎません。equals()
平均的/典型的なケースでは、メソッドがこれよりもはるかに優れたパフォーマンスを発揮できることを意味する多くのショートカットがあります。
O(1)
ある場合です。それらは同じオブジェクトであるため、定義上等しいため、結果はtrueですO(1)
ことを証明できる、事前に計算されたハッシュコードをチェックできるかどうかです(明らかに、多くの文字列が同じハッシュコードにハッシュされるため、2 つの文字列が等しいことを証明することはできません)。O(1)
は、文字列の長さが異なる場合です (文字列が等しくなることはあり得ないため、結果は false です)。O(1)
2 つの文字列を比較するのにかかる時間は平均です。文字列が完全にランダムでない場合、結果はデータ分布に応じて、その中間のどこかにある可能性がありO(1)
ますO(n)
。ご覧のとおり、正確なパフォーマンスはデータの分布によって異なります。
それとは別に、これは実装に依存するため、正確なパフォーマンス特性は使用する Java のバージョンに依存します。ただし、私の知る限り、現在の主要な Java 実装はすべて上記の最適化を行っているため、文字列のequals()
パフォーマンスはかなり高速であると期待できます。
最後のトリック: String のインターンを使用すると、等しいすべての String が同じオブジェクト インスタンスにマップされます。次に、 であることが保証されている の代わりに、オブジェクト IDの非常に高速な==
チェックを使用できます。このアプローチには欠点があります (多くの文字列をインターンする必要があり、メモリの問題が発生する可能性があり、このスキームで使用する予定の文字列をインターンすることを厳密に覚えておく必要があります) が、状況によっては非常に便利です。equals()
O(1)
最悪のケースは O(n) ですが、2 つの文字列が同じオブジェクトの場合は O(1) です。
(ただし、この場合、n は、文字列の合計の長さではなく、最初の文字から始まる 2 つの文字列内の一致する文字の数を指します)。