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


84

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




回答:


123

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

ただし、技術的に言えば、連想配列はハッシュテーブルと同一ではありません。部分的には、舞台裏でハッシュテーブルを使用して実装されているだけです。その実装のほとんどはハッシュテーブルであるため、ハッシュテーブルが実行できるすべてのことを実行できますが、それ以上のことも実行できます。

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

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

コード例:

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

$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番目の例では、配列に入力された順序に基づいて、各要素の順序が維持されていることに注意してください(Tyler、Bill Marc)。これは、連想配列とハッシュテーブルの主な違いです。ハッシュテーブルは、保持しているアイテム間の接続を維持しませんが、PHP連想配列は維持します(PHP連想配列を並べ替えることもできます)。


3
うーん、そのような短い説明。それで、それらは完全に同じものですか?
Bakhtiyor 2010年

2
@Bak一般的ではありませんが、PHPであり、パフォーマンスへの懸念が少ないため、データ構造で少し高速で緩い再生を行います
Michael Mrozek 2010年

わかりましたが、この場合、ハッシュ関数=配列の場合、なぜハッシュ関数などのアルゴリズムが非常に多いのでしょうか。
Bakhtiyor 2010年

4
@Michaelあなたはそれを不利なように聞こえさせますか?PHPは違いますが、良い違いだと思います。

1
@Bakhityor:あなたの最後の文は完璧です。ただし、ハッシュテーブルについて「忘れる」必要はありません。実際、ハッシュテーブルをすでに理解しているのは素晴らしいことです。その知識を連想配列に適用できるようになったからです。私はあなたのために物事をさらに明確にするために私の答えにいくつかの例を追加しています。
カム

21

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


編集:ああ-私をそれに打ち負かす:)+ 1。
カム

それが私が探していたものです:)
Faizan 2013年

10
ありえない。ハッシュテーブルには、php配列にはない、ある種の衝突解決が必要になります。彼らの衝突解決戦略は古い値を置き換えるだけであり、それは定義上ハッシュテーブルではありません。
フアン

4
私が覚えている限り、ハッシュテーブルの衝突解決は、元のキーではなく、ハッシュされたキーに対するものです(それでもどのように機能する必要がありますか?)
Emanuel Oster 2017年

18

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

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

Perlは、連想配列を「ハッシュ」と呼ぶことにより、2つの概念をひとまとめにします。Perlの多くの機能のように、それは完全に間違っているわけではありませんが、ずさんです。


7

PHPの配列は、実際には順序付けられたマップであり、ハッシュテーブルではありません。mapとhashtableの主な違いは、要素が追加された順序を思い出せないことです。一方、ハッシュテーブルはマップよりもはるかに高速です。マップから要素をフェッチする複雑さはO(nlogn)であり、ハッシュテーブルからのフェッチはO(1)です。


4
「マップから要素をフェッチする複雑さはO(nlogn)です」-これは単に真実ではありません。LinkedListの場合でも、特定の要素のフェッチはO(n)のみです。さらに、en.wikipedia.org
wiki / Hash_tableで

1
ソースコードを確認し後、ここで説明するように、PHPの連想配列は、「ハッシュに格納された各値が、その前に格納された値と後に格納された値にリンクされる」ハッシュテーブルとして実装されます。そのため、追加のメモリを使用しますが、キーを使用して特定の要素にアクセスするのは、通常のハッシュテーブルO(1)と同じくらい高速で、遅くはありません。
LeopoldoSanczyk19年

2

連想配列は、インデックスではなくキーによって要素にアクセスする配列です。これが内部でどのように機能するかは実装によって異なります(どのように機能する必要があるかについての規則はありません)。連想配列はハッシュテーブルで実装できますが(ほとんどの実装ではそれが行われます)、ある種のツリー構造やスキップリストで実装することもできます。あるいは、アルゴリズムが配列内のすべての要素を繰り返し処理してキーを探すこともできます。それは一致します(これは非常に遅くなりますが、機能します)。

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

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