web-dev-qa-db-ja.com

ハッシュテーブルと連想配列

最近、非常に有名な本「 Introduction to Algorithms 」でhash-tablesについて読みました。実際のアプリケーションではまだ使用していませんが、使用したいです。しかし、私は開始する方法がわかりません。
ハッシュテーブルを使用して辞書アプリケーション(ABBYY Lingvoなど)を実現する方法など)の使用例を教えてください。
そして最後に、PHPのハッシュテーブルと連想配列の違いを知りたいと思います。どのテクノロジーをどの状況で使用する必要があるのでしょうか。
間違っている場合はご容赦ください。実際にはハッシュテーブルから始めており、基本的な(理論的な)知識しかありません。
どうもありがとう。

79
Bakhtiyor

PHPでは、連想配列はハッシュテーブルとして実装され、機能が少し追加されています。

しかし、技術的に言えば、連想配列はハッシュテーブルと同一ではありません-それは単純にimplementedであり、一部は背後にハッシュテーブルがあります。その実装の大部分はハッシュテーブルであるため、ハッシュテーブルでできることはすべて実行できますが、さらに実行することもできます。

たとえば、ハッシュテーブルでは実行できないforループを使用して、連想配列をループできます。

したがって、それらは似ていますが、連想配列は実際にハッシュテーブルができることのsupersetを行うことができるため、まったく同じものではありません。ハッシュテーブルと追加機能と考えてください。

コード例:

連想配列をハッシュテーブルとして使用

$favoriteColor = array();
$favoriteColor['bob']='blue';
$favoriteColor['Peter']='red';
$favoriteColor['Sally']='pink';
echo 'bob likes: '.$favoriteColor['bob']."\n";
echo 'Sally likes: '.$favoriteColor['Sally']."\n";
//output: bob likes blue
//        Sally likes pink

連想配列によるループ

$idTable=array();
$idTable['Tyler']=1;
$idTable['Bill']=20;
$idTable['Marc']=4;
//up until here, we're using the array as a hashtable.

//now we loop through the array - you can't do this with a hashtable:
foreach($idTable as $person=>$id)
    echo 'id: '.$id.' | person: '.$person."\n";

//output: id: 1 | person: Tyler
//        id: 20 | person: Bill
//        id: 4 | person: Marc

特に2番目の例では、配列に入力された順序に基づいて各要素の順序(タイラー、ビルマーク)がどのように維持されるかに注意してください。これは、連想配列とハッシュテーブルの大きな違いです。ハッシュテーブルは、保持するアイテム間の接続を維持しませんが、PHP連想配列は(PHP連想配列を並べ替えることもできます)。

118
Cam

pHP配列は基本的にハッシュテーブルです

21
Sergey Eremin

連想配列とハッシュテーブルの違いは、連想配列はデータ型であるのに対して、ハッシュテーブルはデータ実装であるということです。連想配列型は、Perl、Python、PHPなど、現在の多くのプログラミング言語で非常に重要です。ハッシュテーブルは連想配列を実装する主な方法ですが、唯一の方法ではありません。連想配列はハッシュテーブルの主な用途ですが、唯一の用途ではありません。したがって、それらが同じであるというわけではありませんが、連想配列がすでにある場合は、通常、違いを心配する必要はありません。

パフォーマンス上の理由から、お気に入りの言語の連想配列はハッシュとして実装されていることを知っておくことが重要です。そして、その実装のオーバーヘッドコストをある程度把握しておくことが重要です。ハッシュテーブルは、Cで見られるように、線形配列よりも遅く、より多くのメモリを使用します。

Perlは、連想配列を「ハッシュ」と呼ぶことで、2つの概念をまとめています。 Perlの多くの機能と同様に、それはまったく間違っていませんが、ずさんです。

17
Greg Kuperberg

PHPの配列は、実際にはハッシュテーブルではなく順序付けられたマップです。マップとハッシュテーブルの主な違いは、追加された要素の順序を記憶できないことです。マップから要素を取得する複雑さはO(nlogn)であり、ハッシュテーブルからはO(1)です。

8
WoZ

連想配列とは、インデックスではなくキーで要素にアクセスする配列です。これが内部的にどのように機能するかは、実装に固有です(どのように機能する必要があるかというルールはありません)。連想配列はハッシュテーブルで実装できますが(ほとんどの実装ではそれが可能です)、何らかのツリー構造またはスキップリストで実装することも、アルゴリズムが配列内のすべての要素を反復してキーを探すこともできます一致します(これは非常に遅くなりますが、動作します)。

ハッシュテーブルは、値がキーに関連付けられているデータを保存する方法であり、(通常はほぼ)一定の時間内にキーの値を検索する場所です。これは連想配列に期待するものとまったく同じように聞こえます。そのため、ほとんどの場合、これらの配列の実装にハッシュテーブルが使用されますが、これは必須ではありません。

2
Mecki