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


8

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

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

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

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


1
数を繰り返すために何がありますか?数値は単なる値です。2たとえば、ではありません3。それでおしまい。同様に123ありません124。文字列は文字のコレクションと"abc"は異なり"abd"ますが、各文字を確認する必要があります。
VLAZ

2
コンピュータには、整数値をすばやく比較する固有の演算があります。
先のとがった

5
Erlangのような無限精度整数の言語で作業している場合、数値比較は確かにO(n)
Pointy

1
また、「すべての数字を介して」の代わりに、おそらく「すべての数字を介して」を意味する
Pointy

1
@Pointy:nの長さはlog(n)に比例するため、O(log(n))になります。
Nyos

回答:


10

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

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

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

あります可変長番号、などの通常と呼ばれるものがあるような例外は、しかしBigIntegerたりBigDecimalと非常によく似た動作をしますString、それは2つのを比較する(n)はOになってしまうかもしれないとの比較BigDecimal(ここで、n平等の値は、長さBigDecimalsの、どちらの数値でもありません)。


javascriptタグの存在は、この回答に何らかの違いをもたらしますか?javascriptには===and ==演算子があり、==演算子は1 == '1'trueと評価されるようなことを実行できますが、比較が行われる前に各オペランドが何に変換されるかについてドキュメントはあいまいです。したがって、この場合、それらが文字列に変換されると、比較は整数比較ではなく文字列比較になる可能性があります
smac89

@ smac89:JavaScriptは、固定サイズの浮動小数点数である単一の数値型を使用するため、比較に違いはありません。はい、比較する前に、O(n)で実行できる場合とできない場合があるいくつかの変換を行う必要がありますが、IMOは実際には比較の一部ではありません。
Joachim Sauer、

3
@ smac89「が、ドキュメントは、オペランドのそれぞれが、比較が行われる前に変換されているものにのような非常に漠然としているドキュメントが非常に明示されているさまざまな種類の間の比較が行われるべきかインチ
-VLAZ、

@VLAZリンクありがとうございます。したがって、文字列が数値に変換されているように見えますが、これはまだO(n)、JavaScriptが関係している場合は特に重要です。
smac89

JavaScript uses a single numberic type不正解です@JoachimSauer 。
BigInt

4

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

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


0

ストリング

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

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

数字

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

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

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


数字は比較されません。ビットが比較されます。そして、ビットはアトミックグループとして比較されます。どのコンピューターも、ビット1、ビット2、ビット3、ビット4を比較しません。使用する特定の命令とプロセッサの機能に応じて、8ビット、16ビット、32ビット、64ビットなどを比較します。 、単一の操作として。桁レベルの比較や同等の機能はありません。バイト/ワード境界にあります。
ゲディパンク

0

一般に、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で割り切れるだけです)、数値が十分に大きくなると、切り上げられます無限に。逆に、数を何度も除算して無限に小さくすると、最終的にゼロに切り捨てられます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.