• ベストアンサー

配列や連想配列について

言語一般の配列や連想配列について 最近どういう解釈をしていいのか わからなくなってしまいました。 仮にPerlで話をさせてもらいますと、 連想配列%FORMがあるとき、 個々の要素にアクセスする場合 例えば$FORM{'name'}などと記述しますが、 この$FORM{'name'}を みなさんはどのように解釈しているでしょうか? $FORM{' '}にキー nameを 代入しているようなイメージで、 「連想配列%FORMからキー'name'の値を取得する」 という考え方でしょうか? わたしは最近、 $FORM{'name'}はそれ自体が一つの変数という 考え方が出来るのではないかという気がしているのですが、 連想配列の実装から考えると この考え方は正しいのでしょうか? 以前、配列について同様の質問を したことがあります。 例えばC言語でint a[100]と宣言した場合は、 連続的なアドレスに確保されるため、 a[2]はaという名前のアドレスから a + 2 番目の場所という意味になるが、 言語によっては不連続なアドレスに 確保されるため、a[2]は一つの変数名として 考える必要がある・・ との回答でした。 ならば連想配列の場合も もし不連続なアドレスに確保されるならば、 $FORM{'name'} は一つの変数名と 考えたほうが正しいのではないかと 思ったからです。 連想配列の内部的な処理がどうなっているのか 教えて頂きたいです。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • nightowl
  • ベストアンサー率44% (490/1101)
回答No.2

こんばんは。私も「$FORM{'name'}」は 「連想配列%FORMからキー'name'の値を取得する」意味だと思っています。 現在の Perl では「連想配列(associative array)」は 「ハッシュ(hash)」と呼ばれていますね。 「hash」とは英語で「こま切れにする」という意味で、 「ハッシュド・ビーフ(ハヤシライス)」でおなじみです。 このアルゴリズムは「ハッシュ法(hashing, hash method)」 で検索すれば多数ヒットします。 ボードゲームの駒・ピースの盤上の位置も二次元配列で表せますので、 高速探索を行うためにハッシュ法が重宝されます。 (と、今検索して知りました^^) 簡単に言えば(詳しく説明する能力はありません(^^;)、ハッシュの要素を 一つ一つ単純な計算式に従って数値に置き換えていくという操作です。 この時、数値の分布(ハッシュテーブル)が一様かつ狭い範囲に 収まるような計算式を選ぶのがミソ。 ちなみに、この操作のことは「写像(mapping)」と言います。 なぜハッシュがはじめ「連想配列」と呼ばれていたのかといえば(元は AWK 用語)、 ハッシュでキーと結び付けられた値を、あたかもコンピュータが人間に代わって 「連想」してくれるように見えるからです。 ハッシュの意味を理解するには、「$FORM{'name'}」の場合 「FORM of name」のように英語読みすると腑に落ちやすいと思います。 日本語で考えると「name に対する FORM」とひっくり返す必要があるので 混乱しやすいのですが。以下はハッシュの説明として手垢がついた例です。 %DAYS = ('January'=>31, 'February'=>30,...,'November'=>30,'December'=>31); こう置いたとき、「$DAYS{'September'}」は30ですね。 これも「DAYS of September(9月の日数)」と考えればしっくりきます。 >連想配列の場合も >もし不連続なアドレスに確保されるならば、 >$FORM{'name'} は一つの変数名と >考えたほうが正しいのではないか で、私の結論としては、せっかく高級なスクリプト言語 Perl を使っている以上 メモリアドレスのことなど考えなくていいのではないでしょうか。 もちろん、一つの変数として考えたいならそれはそれで結構だと思いますが、 $var = $FORM{'name'}; などと別の変数に代入して使う方が、私としてはすっきりする感じです。

参考URL:
http://e-words.jp/w/E3838FE38383E382B7E383A5E6B395.html,http://tortoise1.math.ryukoku.ac.jp/~takataka/cpro/doc/hash.html
harisun
質問者

お礼

ご回答ありがとうございます。 なるほど、英語読みすると しっくりするんですね。

その他の回答 (2)

  • nightowl
  • ベストアンサー率44% (490/1101)
回答No.3

すみません、日数を間違えていました。平年だと「'February'=>28」ですね。 恥ずかしい…(^^; 前回では「こま切れにする」ことと Perl の「ハッシュ」との関連が 分かりにくかったかもしれませんので、訂正ついでに追加です。 文字列を構成する文字には文字コードという数字がついています。 文字列はハッシュ関数の中で一度ばらばらな文字の単位に「こま切れにさ」れます。 そして数値に変換するために個々の文字のコードを単純に足し込んでいったり、 2番目以降に係数をかけたものを足したりして、最後にハッシュテーブルの大きさ (素数がいいと言われています)で剰余を取るというふうな計算をしています。 http://aglaia.c.u-tokyo.ac.jp/~yamamoto/Programming/alg_data/node18.html (Java の例ですが、アルゴリズムは言語とは独立して使える概念です) http://www.rs.kagu.tus.ac.jp/~infoserv/j-siken/H8a1/af01.html 文字列に対するこのような下ごしらえは大変に見えても、 料理を作りはじめたら材料を準備してある方が圧倒的に早いでしょう。 それと同じです。 息抜きに、おいしいハッシュドビーフでも召し上がれ^^ http://home.tokyo-gas.co.jp/shoku110/unchiku/283.html

参考URL:
http://www.ced.is.utsunomiya-u.ac.jp/~tsuki/en3-3/ex1-2.php
harisun
質問者

お礼

またのご回答ありがとうございます。 ハッシュ法もなんとなく わかりました。 ハッシュドビーフごちそうさま(^^

  • Ethersky
  • ベストアンサー率71% (168/235)
回答No.1

> 「連想配列%FORMからキー'name'の値を取得する」 私はそう考えています。 > $FORM{'name'}はそれ自体が一つの変数という > 考え方が出来るのではないかという気がしているのですが、 > 連想配列の実装から考えると > この考え方は正しいのでしょうか? 連想配列の内部で順番がバラバラになるということを踏まえればそう考えてもおかしくはないと思います。 > 連想配列の内部的な処理がどうなっているのか 私も昔これを調べたことがあります。 で、調べたところには「Perlの内部で処理しやすい順に並べ替えられる」と書かれていました。 実際にどういう順が処理しやすい順なのかということは書かれてはいませんでしたがそういうことらしいです。 #おーなんて曖昧な回答だ(||゜Д゜)

harisun
質問者

お礼

ご回答ありがとうございます。 連想配列の内部的な処理とかは、 ネットなどでいろいろ調べてみても 詳しく説明してあるものって なかなかないんですよね。