2013-05-12 23 views
12

ハッシュ(文字列またはオブジェクトを数値に変換する)が文字列などに使用されていると聞きました。これは、文字列よりも数値を比較する方が簡単だからです。本当の場合、これはどうしてですか?数字比較は文字列比較よりも高速ですか?

+0

私は、愚かなjohn = 12、johnny = 5を持っています。バイナリ5 = 0101で12 = 1100です。(バイナリに変換した後の)数値を比較する方がはるかに高速です。 -john-(各charは独自のバイナリコードを持つ)の4文字を比較し、それらが同じではないことを認識します。しかし、名前が異なるアルファベットで始まっていれば、ハッシングは役に立たないでしょう。意味がありますか?私は正しいかどうか分からない。 –

+0

文字列は、通常どのくらいのメモリを占有しているかという点で通常扱う数字よりもはるかに大きい傾向があります。文字列を比較する標準的な方法は、文字サイズが同じかどうかを調べ、それがどこであっても違うならば。単純な「プリミティブ」整数型は、2の補数パックビットとして格納することができます。これは、32ビットの空間に20億〜20億(またはそれ以上)の値しか格納できないという欠点がありますが、はるかに少ないメモリが比較されます。これらの整数比較は、しばしば単一のプロセッササイクルでも行われる。 – Yakk

答えて

25

を必要とするよりも時間がかかります。

は、次のような状況を考えてみましょう:

私は「オレンジ」対文字列「りんご」を比較したいです。私が "りんご" == "オレンジ"だけを決定したいのであれば、各文字列の最初の文字を比較する必要があります: 'a'!= 'o' => "apples"!= "oranges"文字列をハッシュして比較を行うと、結果の整数を比較する前に、両方の文字列を解析してハッシュアルゴリズムに入力する必要があるため、処理速度が大幅に遅くなります。

しかし、私はこの比較を何度もやる必要があり、おそらく私は "オレンジ"を "オランウータン"とたくさん比較しています。そして、すべての文字列を一度ハッシュして、より速く動くでしょう。これは、ハッシュマップが基づいている原則です。

しかし、ストリングをハッシュすることは直接比較比較に役立ちます。文字列が字句的に大きいか小さいかを判断することはできません。したがって、文字列を順序付けることはできません。 (これは、JavaのHashMapが順序付けられていない理由です)。

+1

質問に面白い面をもたらす+1 – SomeWittyUsername

0

はい、それはハッシュとは何の関係もありません。

比較の数字はビットを比較し、単純なハードウェア命令を必要とします。

文字列を比較するには、(固定長でない数字とは異なる)文字と、(b)多くのUnicodeマジック(異なる長さの文字列が実際に等しく、異なる異なるコードブロックの文字は異なって比較されます)。


通常、文字列を配列インデックスに変換するためにハッシュが使用されます。原始的な数字の比較

+0

私は愚かな人= john = 12、johnny = 5を持っています。バイナリ5 = 0101で12 = 1100です。バイナリに変換した後の数字を比較する方がはるかに高速です。 -john-(各charは独自のバイナリコードを持つ)の4文字を比較し、それらが同じではないことを認識します。しかし、名前が異なるアルファベットで始まっていれば、ハッシングは役に立たないでしょう。意味がありますか?私は正しいかどうか分からない。 –

+0

可能な文字列の組み合わせは平均文字列の容量よりも大きいので、同じ数に一致する文字列がたくさんあるので、一致するかどうかを確認しなければならない。また、SLaksが言及したすべてのユニコード問題を解消します。 – SJuan76

+0

@SLaksあなたの数字のほとんどは固定サイズと思われます。 :) Bignumsは反復を必要とし、より魅力的な "数値"(遅延評価、記号計算、実際の実数など)は比較するのにかなり高価になる可能性があります。しかし、もっと真剣に、文字列を配列インデックスに変換するための用語の「ハッシング」はどのような世界にありますか? – Yakk

1

は、Javaで文字列を比較しながら、それは方法であるただ一つのコンピュータ命令だから文字列を比較するよりも間違いなく高速です。しかし、Javaのハッシングは別の理由で使われています。Object.hashCode()は、コレクションのクイック検索のためにハッシュテーブルで使用されます。 2つの数値を比較

8

は(同じ数字を表す)2つの文字列を比較するよりも大き高速です。 2つの文字列を比較するなど、

を2の補数のいずれかのAND、XORを使用して、単純に個々のビットを比較する必要が超高速で行うことができる2つの数値を比較することは非常に遅く、高価です。ほとんどのアルゴリズムでは、文字列全体を反復して各文字に一致させる必要があります。

たとえば我々は12(偽)と9を比較したいとしましょう。数値比較のために、アルゴリズムが個々のビットを比較していると仮定しましょう。ここ 9 = 1001 12 = 1100

、最悪の場合のアルゴリズムは、4ビットを比較します。

文字列として「9」と「12」を表すと、それらはそれぞれ16ビットとしてメモリに格納されます(Recall:JavaはUTF-16を使用してメモリ内の文字列を表します)。比較アルゴリズム。実際には、Javaの実際の文字列比較関数は次のとおりです。

public boolean equals(Object anObject) { 
    if (this == anObject) { 
     return true; 
    } 
    if (anObject instanceof String) { 
     String anotherString = (String)anObject; 
     int n = count; 
     if (n == anotherString.count) { 
      char v1[] = value; 
      char v2[] = anotherString.value; 
      int i = offset; 
      int j = anotherString.offset; 
      while (n-- != 0) { 
       if (v1[i++] != v2[j++]) 
        return false; 
      } 
      return true; 
     } 
    } 
    return false; 
} 

ご覧のとおり、文字列の比較にはさらに多くのことがあります。

+0

私はあなたの答えも好きです。このanotherString.countは何ですか?私はAPIのどこにでも.countが表示されません。String.length()を意味しましたか? –

1

一般に、ほとんどのコンピュータは整数、longなどを比較する単一の命令を持っています と多くの命令サイクルを取るでしょう。文字列は、通常、ユーティリティ関数/メソッドによって比較されます(この規則には奇妙な例外があります)。

文字列は基本的

 /** The value is used for character storage. */ 
    private final char value[]; 

    /** The offset is the first index of the storage that is used. */ 
    private final int offset; 

    /** The count is the number of characters in the String. */ 
    private final int count; 

として表され、equalsメソッドは、ザ・メソッドはこの== anObjectN == anotherString両方を行い等しい

if (this == anObject) { 
    return true; 
} 
if (anObject instanceof String) { 
    String anotherString = (String)anObject; 
    int n = count; 
    if (n == anotherString.count) { 
     char v1[] = value; 
     char v2[] = anotherString.value; 
     int i = offset; 
     int j = anotherString.offset; 
     while (n-- != 0) { 
      if (v1[i++] != v2[j++]) 
       return false; 
     } 
     return true; 
    } 
} 
return false; 

である、例えばJavaで

.countは、文字の比較を開始する前でも本質的に整数比較を行います。整数の比較単一の命令よりも長い時間がかかるだろう


C文字列はが/ Java以外速く同等の単純ですが、それはループと複数の命令のいくつかの並べ替えが含まれています比較取りループを通過するたびに

これは、整数の比較一つの命令これは必ずしもそうではありませんが、時間の、おそらくケースが最も