言語一般の配列や連想配列について
最近どういう解釈をしていいのか
わからなくなってしまいました。
仮に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'} は一つの変数名と
考えたほうが正しいのではないかと
思ったからです。
連想配列の内部的な処理がどうなっているのか
教えて頂きたいです。
よろしくお願いします。
No.1
- 回答日時:
> 「連想配列%FORMからキー'name'の値を取得する」
私はそう考えています。
> $FORM{'name'}はそれ自体が一つの変数という
> 考え方が出来るのではないかという気がしているのですが、
> 連想配列の実装から考えると
> この考え方は正しいのでしょうか?
連想配列の内部で順番がバラバラになるということを踏まえればそう考えてもおかしくはないと思います。
> 連想配列の内部的な処理がどうなっているのか
私も昔これを調べたことがあります。
で、調べたところには「Perlの内部で処理しやすい順に並べ替えられる」と書かれていました。
実際にどういう順が処理しやすい順なのかということは書かれてはいませんでしたがそういうことらしいです。
#おーなんて曖昧な回答だ(||゜Д゜)
ご回答ありがとうございます。
連想配列の内部的な処理とかは、
ネットなどでいろいろ調べてみても
詳しく説明してあるものって
なかなかないんですよね。
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/E3838FE38383E382B7E383A5E6B3 …
No.3
- 回答日時:
すみません、日数を間違えていました。
平年だと「'February'=>28」ですね。恥ずかしい…(^^;
前回では「こま切れにする」ことと Perl の「ハッシュ」との関連が
分かりにくかったかもしれませんので、訂正ついでに追加です。
文字列を構成する文字には文字コードという数字がついています。
文字列はハッシュ関数の中で一度ばらばらな文字の単位に「こま切れにさ」れます。
そして数値に変換するために個々の文字のコードを単純に足し込んでいったり、
2番目以降に係数をかけたものを足したりして、最後にハッシュテーブルの大きさ
(素数がいいと言われています)で剰余を取るというふうな計算をしています。
http://aglaia.c.u-tokyo.ac.jp/~yamamoto/Programm …
(Java の例ですが、アルゴリズムは言語とは独立して使える概念です)
http://www.rs.kagu.tus.ac.jp/~infoserv/j-siken/H …
文字列に対するこのような下ごしらえは大変に見えても、
料理を作りはじめたら材料を準備してある方が圧倒的に早いでしょう。
それと同じです。
息抜きに、おいしいハッシュドビーフでも召し上がれ^^
http://home.tokyo-gas.co.jp/shoku110/unchiku/283 …
参考URL:http://www.ced.is.utsunomiya-u.ac.jp/~tsuki/en3- …
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP 配列の値の更新方法について 1 2022/08/05 09:49
- JavaScript sessionStorageを調べています。 1 2023/06/20 12:41
- JavaScript フォームが空欄の時にフォームの外をクリックすると、エラーが出るコードを調べています。 1 2023/06/25 11:51
- HTML・CSS ただいま勉強始めたての初心者です。フォームを縦並べにしたいです。 2 2022/11/20 17:18
- JavaScript Javascript初心者|jQueryの.val()で値を取得し複数の要素を連結させる方法知りたい 2 2022/06/02 12:06
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
- C言語・C++・C# C言語の質問です。 以下の命令を実行するプログラムを作りました ①文字列aとbの長さを表示 ②aとb 1 2022/04/29 15:35
- PHP コメント機能に返信欄を矢印で追加したい 1 2022/05/09 21:17
- PHP PHPでCookieを使った訪問回数について 1 2023/05/28 14:10
- Ruby 初心者プログラミング 3 2022/10/12 11:31
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
文字列を変数名として扱う方法
-
チェックデジットについて
-
python の素朴な疑問
-
perlで配列名を動的に作り出したい
-
列挙型と連想配列の違いを教え...
-
ハッシュマーク以降のアドレス取得
-
ハッシュ検索はなぜ速い
-
英語でのシャープとコメの呼び...
-
プログラミングについて。 1つ...
-
エクセルの当番表を作っていま...
-
ネットワークループとルーティ...
-
どなたかこのプログラミングを...
-
VBA for i=1 to lastrow
-
画面を強制的に再描画させる方法
-
Perlで<select multiple>の複数...
-
QNo.3258883データベースから取...
-
【VBA】指定の範囲から特定の文...
-
リストボックスに縦スクロール...
-
while(*s++=*t++)の判定は?
-
イベントの発生を待つ
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ハッシュ検索はなぜ速い
-
文字列を変数名として扱う方法
-
チェックデジットについて
-
列挙型と連想配列の違いを教え...
-
まったく同じファイルのハッシ...
-
ハッシュ値が一致したデータは...
-
英語でのシャープとコメの呼び...
-
ハッシュのハッシュを実現したい。
-
データベースでユーザーのパス...
-
UTF-8で書かれたJSPの日本語文...
-
Perlは戻り値で、ハッシュや配...
-
perlで配列名を動的に作り出したい
-
ハッシュリストって単にハッシ...
-
短いハッシュの作り方
-
重複ファイルを削除したいので...
-
*(アスタリスク)の意味
-
連想配列のサイズ制限
-
python の素朴な疑問
-
多次元配列から重複を削除
-
一意(ユニーク)かつ、ソート...
おすすめ情報