web-dev-qa-db-ja.com

文字列0(n)を比較するのに、数値0(1)を比較するのはなぜですか?

2つの文字列が等しいかどうかを比較するには、インタープリターが両方の文字列を反復処理して各文字を比較する必要があることを理解しています。

これは時間を複雑にする0(n)ここでnは最短の文字列の長さです。

ただし、2つのnumbersを比較して等しいかどうかは0(1)です。

何故ですか?インタプリタは、等しいかどうかを確認するためにすべての数値を反復処理する必要はないでしょうか?

8
Nick Akey

コンピュータの数値は通常、固定サイズの単位で処理されます。 intは、任意の言語やコンパイラ/プラットフォームの組み合わせで32ビットまたは64ビットになる可能性がありますが、可変長になることはありません。

したがって、数値を比較するときに比較するビット数は固定されています。一度に多くのビットを比較するハードウェア回路を構築することは非常に簡単です(つまり、「1つのアクション」として)。

一方、文字列は本質的に可変長であるため、「文字列」と言っても、比較する必要があるビット数はわかりません。

are例外がありますが、通常はBigIntegerまたはBigDecimalのように呼ばれる可変長の数値があるため、String比較と非常によく似た動作をしますO(n)となる可能性があるため、2つのBigDecimalの値が等しいかどうかを比較します(nはBigDecimalsの長さであり、数値)。

10
Joachim Sauer

通常プログラムは、固定サイズのデータ​​構造として数値を表します(バイナリ値です。そのため、サイズがビットで表示されることがあります)。比較は固定サイズであるため、一定の時間がかかり、O(1)になります。これは、そのような表現の利点の1つです。欠点は、表現できる値の範囲が制限されることです。

この制限を取り除き、任意の大きな範囲の数値を可能にする代替表現は、サイズが固定されなくなり、O(1)で比較できなくなります。

4
Scott Hunter

ストリング

文字列比較は通常、文字の線形スキャンであり、文字が一致しない最初のインデックスでfalseを返します。

時間の複雑さはO(N)であり、実際にかかる時間は、統計的に差異が現れる前にスキャンする必要がある文字数によって異なります。単純な答えはありませんが、それでも答えは明白です;-)

数字

2つの整数が等しい場合、すべてのビットを比較せずに知ることは不可能です。したがって、等値の場合、必要な時間はビット数に比例します(Nが比較対象の1つである場合、log(abs(N))に比例します)。

それらが実際に等しくない場合、実装の内部に関連する多くのケースがあります。 long intは、2の累乗の底に「数字」のベクトルとして格納されます。ベクトルの長さが同じでない場合、intは等しくないため、一定の時間がかかります。

しかし、それらが同じ長さである場合は、最初の(存在する場合)不一致のペアが見つかるまで「桁」を比較する必要があります。比較する必要がある桁数に比例して時間がかかります。

0
Mazhar Khan

通常、big-O表記は、nが非常に大きな値に上昇する可能性がある場合にのみ使用します。入力が増加します。たとえば、リストを並べ替える場合、最良のアルゴリズムのほとんどはO(n log n)で並べ替えます。つまり、onlyは、リストは十分に長く、ソートにかかる時間は_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でのみ割り切れることができます)、そして数値が十分大きくなると切り上げられます無限に。逆に、数を何度も除算して無限に小さくすると、最終的にゼロに切り捨てられます。

0
TheHansinator