10

重複
の可能性: 配列、ポイントは何ですか?

以前、配列とリストの違いは何ですか? でこの質問をしようとしました。しかし、私の質問は最終的な答えに到達する前に閉じられました(それについての詳細)。

コンピュータ サイエンスにおける「配列」という言葉の本当の意味を理解しようとしています。私は、このウェブサイトの精神に従って議論するのではなく、答えに到達しようとしています. 私が求めているのは言語にとらわれませんが、使用したさまざまな言語での配列の知識を利用できます。

この質問に対する考え方:

  • 新しいプログラミング言語を設計していて、それに配列を実装することにしたと想像してください。それは彼らが何を意味するのですか?それらのものの特性と能力はどうなるでしょうか。言語の種類によるとしたら、どうしてですか?
  • 配列を配列にするものは何ですか?
  • 配列が配列でないのはいつですか? たとえば、リスト、ベクター、テーブル、マップ、またはコレクションの場合は?

配列が何であるかについての正確な定義が1つもない可能性があります。その場合、標準または標準に近い仮定、または配列とは何ですか? 少なくとも共通の領域はありますか?いくつかの定義があるかもしれませんが、その場合は、それぞれで最も精度の高いものを探しています。

言語の例:

(これらのいずれかで間違っている場合は修正してください)。

  • C 配列は、ポインター演算を使用してトラバースしたり、特定のオフセット ポイントでアクセスしたりできる、1 つの型のメモリの連続ブロックです。サイズは固定されています。
  • JavaScript、Ruby、および PHP の配列は、可変サイズであり、任意の型のオブジェクト/スカラーを格納できます。また、拡張したり、要素を削除したりできます。
  • PHP 配列には、数値と連想の 2 つのタイプがあります。連想配列には、文字列キーで格納および取得される要素があります。数値配列には、整数で格納および取得される要素があります。興味深いことに、あなたが持っていて$eg = array('a', 'b', 'c')、あなたunset($eg[1])がまだ で取得'c'している場合$eg[2]、今だけ$eg[1]未定義です。array_values()(配列のインデックスを再作成するために呼び出すことができます)。文字列キーと整数キーを混在させることもできます。

この段階では、C 配列がここで唯一の真の配列であり、配列が配列であるために厳密に言えば、最初の箇条書きで述べたすべての特性を備えている必要があると疑っています。もしそうなら — 繰り返しますが、これらは私が確認または拒否した疑いです — JS と Ruby の配列は実際にはベクトルであり、PHP 配列はおそらくある種のテーブルです。

最後の注意: 私はこのコミュニティ wiki を作成したので、コメントの代わりに回答を数回編集する必要がある場合は、それを行ってください。ここではコンセンサスが整っています。

4

8 に答える 8

5

配列|əˈrā |

名詞

1特定の種類のものの印象的な表示または範囲:このトピックに関する膨大な数の文献があります| 途方もない選択肢の配列

2特に順序付けられた配置

  • 軍隊の配置。
    1. 数学:行と列の数量または記号の配置。行列。
    2. コンピューティング:関連する要素の順序付けられたセット。
    3. 法律:陪審員のリスト。

3詩的/文学的な精巧なまたは美しい服:彼は細かい配列で服を着ていました。動詞

  1. [トランス。](通常は配列されます)特定の方法で(物)を表示または配置します:テーブル全体に配列されたのはビュッフェでした| 軍隊は彼に対して配列しました。
  2. [トランス。](通常は配列されます)誰かに服を着せます(指定された服):彼らはハンガリーの民族衣装に配列されました。
  3. [トランス。]法のエンパネル(陪審員)。ORIGIN中英語([準備]と[準備の場所]の意味で):古フランス語のarei(名詞)、areer(動詞)から、ラテン語のad-'toward'+ゲルマン語のベースは'prepare'を意味します。</ li>
于 2009-10-15T04:10:56.887 に答える
5

それはすべて抽象化に関するものであるか、そうであるべきです

そこには実際に良い質問が隠されています。本当に良い質問です。それは私が長い間持っていた言語のペットピーブを引き起こします。

そして、それは悪化しているが、良くはない。

OK:Rubyのような私のお気に入りの言語がまだ間違っているという、低く広く軽視されているFortranが正しかったことがあります。それらは、関数呼び出し、配列、および属性に異なる構文を使用します。それは正確にどれほど抽象的ですか?In fortranfunction(1)の構文はと同じarray(1)であるため、プログラムを変更せずに一方を他方に変更できます。(私は知っています、割り当てのためではありません、そしてFortranの場合、それはおそらく間抜けなパンチカードの文字セットの事故であり、意図的なものではありませんでした。)

x.y重要なのは、、、x[y]およびx(y)の構文が異なる必要があるかどうかは本当にわかりません。特定の抽象化を特定の構文に付加することの利点は何ですか?変換のリファクタリングに取り組んでいるIDEプログラマーのためにより多くの仕事をするために?

そうは言っても、を定義するのは簡単arrayです。最初の正規形では、数値オフセットを介して言語固有の構文を使用してアクセスされる、メモリ内の要素の連続したシーケンスです。より高い正規形では、通常は数値のメッセージに応答するオブジェクトの属性です。

于 2009-10-15T04:11:15.887 に答える
3

プログラミング言語が配列とリストをモデル化する方法を無視し、抽象化の実装の詳細 (および結果として生じるパフォーマンス特性) を無視すると、配列とリストの概念を区別できなくなります。

実装の詳細を導入すると (プログラミング言語には依存しません)、連結リスト、配列リスト、通常の配列、スパース配列などのデータ構造を比較できます。しかし、配列とリスト自体を比較することはもうありません。

私の見方では、配列とリストの違いについては、プログラミング言語のコンテキストでしか話せません。そしてもちろん、その言語でサポートされている配列とリストについて話しています。他の言語に一般化することはできません。

要するに、この質問は誤った前提に基づいており、有用な答えがないと思います。

編集:Ollieのコメントに応えて:

「配列」や「リスト」という言葉を使うことが役に立たないと言っているのではありません。私が言っているのは、特定のプログラミング言語のコンテキストを除いて、言葉は正確で明確な定義を持っていないし、持つこともできないということです. この 2 つの単語に明確な意味を持たせたいと考えていますが、実際にはそうではありません。実際に使われている言葉を見てみましょう。さらに、新しい一連の定義を世界に押し付けようとする試みは、失敗する運命にあります。

実装についての私のポイントは、配列とリストのさまざまな実装を比較対照するとき、まさにそれを行っているということです。それが役に立たないと言っているのではありません。私が言いたいのは、さまざまな実装を比較対照するとき、それらを配列と呼ぶか、リストと呼ぶか、またはその他のものと呼ぶかについて、すべてにこだわるべきではないということです。むしろ、同意できる条件を使用するか、または条件をまったく使用しないでください。

私にとって、「配列」は「おそらく効率的にインデックス付けできるものの順序付けられたコレクション」を意味し、「リスト」は「効率的にインデックス付けできる可能性のあるものの順序付けられたコレクション」を意味します。しかし、傾向に反する配列とリストの両方の例があります。たとえば、一方は PHP 配列、もう一方は Java ArrayLists です。したがって、正確に言いたい場合は...言語に依存しないコンテキストで、「Cライクな配列」または「リンクされたリスト」、または私が本当に意味するデータ構造を明確にする他の用語について話さなければなりません。明確にしたい場合、「配列」と「リスト」という用語は役に立ちません。

于 2009-10-15T04:40:14.010 に答える
3

FOLDOCから:

配列

1. <プログラミング> インデックス (または「添字」) によって区別される、同じ型のデータ項目のコレクション。配列の次元数は言語によって異なりますが、通常は無制限です。

配列は、集計データ型の一種です。単一の通常の変数 (「スカラー」) は、ゼロ次元配列と見なすことができます。1 次元配列は「ベクター」とも呼ばれます。

配列要素への参照は、A[i,j,k] のように記述されます。ここで、A は配列名で、i、j、k はインデックスです。C言語は、各インデックスが A[i][j][k] のように個別の括弧内に記述されるという点で独特です。これは、C では、N 次元配列が実際にはベクトルであり、その各要素が N-1 次元配列であるという事実を表しています。

通常、配列の要素は連続して格納されます。左端または右端のインデックスが最も急速に変化するかどうか、つまり、各行が連続して格納されるか、各列 (2D 配列の場合) が格納されるかは、言語によって異なります。

配列は、順番にアクセスする場合に最適なリストとは 対照的に、予測不可能な順序でアクセスする必要があるデータを格納するのに適しています。配列インデックスは 整数(通常は自然数) ですが、連想配列の要素は文字列で識別されます。

2. <アーキテクチャ>プロセッサ アレイ。アレイ プロセッサと混同しないでください。

また、一部の言語では、「配列」と言うとき、実際には「連想配列」を意味することに注意してください。

連想配列

<プログラミング> (または「ハッシュ」、「マップ」、「辞書」)インデックスが単なる整数ではなく、任意の文字列 である配列。

awkとその子孫 ( Perlなど) には、検索を高速化するための ハッシュ コーディングを使用して実装された連想配列があります。

于 2009-10-15T04:49:00.383 に答える
3

配列は、整数でインデックス付けされたデータ項目の順序付けられたコレクションです。それ以上のことを確信することはできません。これがこの質問の唯一の合理的な結果だと思うこの回答に投票してください。

于 2009-10-15T05:33:22.307 に答える
2

配列:

  1. 要素の有限集合
  2. 要素は順序付けられており、これが唯一の構造です
  3. 同じタイプの要素
  4. 効率的なランダムアクセスをサポート
  5. 効率的な挿入は期待できない
  6. 追加をサポートする場合とサポートしない場合があります

(1) 配列をイテレータやジェネレータなどと区別します。(2) 配列とセットを区別します。(3) 配列を、int と文字列を取得するタプルなどと区別します。(4) 配列を他のタイプのリストと区別します。常にそうであるとは限りませんが、プログラマーの期待は、ランダム アクセスが一定時間であることです。(5) と (6) は、追加の要件を否定するためのものです。

于 2009-10-15T06:11:11.627 に答える
1

実数配列は連続したメモリに値を格納すると私は主張します。それ以外のものは、配列のように使用できるため、単に配列と呼ばれますが、実際にはそうではありません (PHP の「配列」は、実際の配列ではありません (非連想))。ベクトルなどは配列の拡張であり、機能を追加します。

于 2009-10-15T05:40:49.583 に答える
0

配列はコンテナであり、配列が保持するオブジェクトには、順序以外の関係はありません。オブジェクトは抽象的に連続スペースに格納されるため(高レベル、もちろん低レベルも連続する場合があります)、slot [x、y、z...]でオブジェクトにアクセスできます。たとえば、array [2,3,5,7,1]ごとに、slot [2](一部の言語ではslot [3])を使用して5を取得できます。

リスト、コンテナの場合も、それが保持する各オブジェクト(スロットやノードなどの各オブジェクトホルダー)には、他のオブジェクトを「指す」インジケーターがあり、これが主な関係です。一般に、高レベルまたは低レベルの両方で、スペースは連続的ではありませんが、連続的である可能性があります。したがって、slot [x、y、z...]によるアクセスはお勧めしません。たとえば、| -2-3-5-7-1- |に従って、5を取得するには、最初のオブジェクトから3番目のオブジェクトに移動する必要があります。

于 2009-10-15T04:21:22.490 に答える