2つの文字列が等しいかどうかを比較するには、インタープリターが両方の文字列を反復処理して各文字を比較する必要があることを理解しています。
これは時間を複雑0(n)
にしn
ます。ここで、は最短の文字列の長さです。
ただし、2つの数値を比較して等しいかどうかは0(1)
です。
何故ですか?インタプリタは、等しいかどうかを確認するためにすべての数値を反復処理する必要はないでしょうか?
2つの文字列が等しいかどうかを比較するには、インタープリターが両方の文字列を反復処理して各文字を比較する必要があることを理解しています。
これは時間を複雑0(n)
にしn
ます。ここで、は最短の文字列の長さです。
ただし、2つの数値を比較して等しいかどうかは0(1)
です。
何故ですか?インタプリタは、等しいかどうかを確認するためにすべての数値を反復処理する必要はないでしょうか?
回答:
コンピュータの数値は通常、固定サイズの単位で処理されます。A int
は、特定の言語やコンパイラ/プラットフォームの組み合わせで32ビットまたは64ビットになる可能性がありますが、可変長になることはありません。
したがって、数値を比較するときに比較するビット数は固定されています。一度に多くのビットを比較するハードウェア回路を作成するのは非常に簡単です(つまり、「1つのアクション」として)。
一方、文字列は本質的に可変長であるため、「文字列」と言っても、比較する必要があるビット数はわかりません。
あります可変長番号、などの通常と呼ばれるものがあるような例外は、しかしBigInteger
たりBigDecimal
と非常によく似た動作をしますString
、それは2つのを比較する(n)はOになってしまうかもしれないとの比較BigDecimal
(ここで、n平等の値は、長さBigDecimal
sの、どちらの数値でもありません)。
===
and ==
演算子があり、==
演算子は1 == '1'
trueと評価されるようなことを実行できますが、比較が行われる前に各オペランドが何に変換されるかについてドキュメントはあいまいです。したがって、この場合、それらが文字列に変換されると、比較は整数比較ではなく文字列比較になる可能性があります
O(n)
、JavaScriptが関係している場合は特に重要です。
文字列比較は通常、文字の線形スキャンであり、文字が一致しない最初のインデックスでfalseを返します。
時間の複雑さはO(N)であり、実際にかかる時間は、統計的に差異が現れる前にスキャンする必要がある文字数によって異なります。簡単な答えはありませんが、それでも答えは明白です;-)
2つの整数が等しい場合、それらのすべてのビットを比較せずに知ることは不可能です。したがって、等しい場合、必要な時間はビット数に比例します(Nが被比較数の1つである場合、log(abs(N))に比例します)。
それらが実際に等しくない場合、実装の内部に関連する多くのケースがあります。long intは、2の累乗の底に「数字」のベクトルとして格納されます。ベクトルの長さが同じでない場合、intは等しくなく、一定の時間がかかります。
しかし、それらが同じ長さである場合、最初の(存在する場合)不一致のペアが見つかるまで「桁」を比較する必要があります。比較する必要がある桁数に比例して時間がかかります。
一般に、big-O表記は、nが非常に大きな値に上昇する可能性がある場合にのみ使用します。big-O表記は、入力の増加に応じて実行時間が増加するためです。リストをソートするときにたとえば、最高のアルゴリズムソート中の最もO(n log n)
-手段、そして唯一の手段は、リストには、十分な長さであるときにかかる時間は、それがに比例してソートすることをことをn log n
。リストが十分に長くない場合、他の要因(たとえば、アルゴリズムが追加のスペースを割り当てるのにかかる時間)が重要になり、実行時間を引き継ぐ可能性さえあります。
JavaScript文字列を使用すると、n
実際に任意に大きくなる可能性がある*ため、比較にはO(n)
時間がかかります。ただし、JavaScript番号(IEEE 754倍精度浮動小数点数)ではn
、符号ビットの最大キャップは64-1、指数は11、有効数字は53です**。このため、数値比較が発生するまでにかかる時間を正確に把握しており、その正確なサイズの数値を比較するための最良のシステムは、各数値が実際に64桁の数に関係なく同じように実行されます持っている-したがって、JavaScriptでこれらの数値を比較することが考慮されO(1)
ます。
*技術的には、RAMが不足する可能性があるため、上限があります。ただし、言語は文字列の最大サイズを指定しておらずO(n)
、文字列比較の一部が実行時間のかなり前を占めています。
**ちなみに、これはJavaScriptの数値が無限に増えることはないということを意味します。特定のポイントを過ぎると、それらは小さな数字を捨て始めます(たとえば、2 ^ 53を超える数値は偶数のみであり、2 ^ 54を超える数値は4で割り切れるだけです)、数値が十分に大きくなると、切り上げられます無限に。逆に、数を何度も除算して無限に小さくすると、最終的にゼロに切り捨てられます。
2
たとえば、ではありません3
。それでおしまい。同様に123
ありません124
。文字列は文字のコレクションと"abc"
は異なり"abd"
ますが、各文字を確認する必要があります。