4

私はLISPを学んでいますが、LISPプログラムにキーと値のペアを格納するのに最適なオプションは何かを尋ねたいだけです。

前述のキーと値のペアについては、JAVAのマップコレクションのように使用したいと思います。キーを値とともに格納し、キーごとに値を検索できます。
例:と文字列が"apple"一致する"fruit"場合、このペアが存在しない場合はこのペアを保存できるようにし、"apple"フルーツであるに関連付けられた値をクエリできます。

推奨事項やコードサンプルは非常に役立ちます。前もって感謝します

4

3 に答える 3

2

学習しているLisp(Scheme、Common Lispなど)を指定しなかったので、CommonLispを推測します。間違っている場合はコメントしてください。それに応じて編集します。

Lispではそのようなものはアソシエーションリストと呼ばれます。これは非常に一般的に使用されるため、それを可能にする便利な機能がいくつかあります。ただし、基本的には、ペアのリストにすぎません((key . value) ... )

カーネギーメロン大学の説明を確認することをお勧めします。これにより、関連付けリストの操作を簡単にするassocなどの機能の概要がわかります。alist-consとても役に立ちました。

アソシエーションリストの問題は、一定時間の挿入がありますが、削除とルックアップは両方ともO(n)であるということです。したがって、速度が大きな懸念事項である場合は、実際のハッシュテーブルに目を向けることをお勧めします。

Common Lisp Cookの本には、これらについての良い説明があります。それらは、一定時間のランダムアクセスを可能にする実際の配列(ベクトルと呼ばれることもあります)に依存しています。アソシエーションリストとは異なり、これらはO(1)ルックアップを提供します。ただし、Lispは一般的にリストが得意なので、関連付けリストほど使いやすいものではありません。

注:Schemeの場合、コンパイラーがデフォルトでSRFI 1および69拡張機能を提供していない場合、これらの関数のほとんどはSRFI1および69拡張機能で提供される必要があります。

于 2012-10-21T18:38:50.433 に答える
1

Common Lispでは、関連付けリストを使用できます。

アソシエーションリストおよび関数ASSOCについては、 CommonLispHyperspecを参照してください。

より複雑で高速なもののために、CommonLispはハッシュテーブルを提供します。

于 2012-10-21T19:51:27.657 に答える
0

比較を公平にするためにMap、Javaではインターフェースです。さまざまな実装がありますが、それらは非常に異なるため、読み取り/書き込み/削除操作で同じ複雑さを提供しない場合があります。リンクリストとして実装されるものもあれば、バイナリトライなどで実装されるものもあります。

MapJavaでは、データにアクセスする方法を定義するだけで、データの保存方法は定義しません。

Lispsは、CLOSについて考えると、インターフェイスの概念がありません。これは、CLOSが多重継承をサポートしているためです。Mapこの方法でコレクションにアクセスするという概念がなく、Javaに存在するようなインターフェースの概念もないという理由だけで、Javaに適切な類似物はありません。

Javaにはいくつかの標準的な実装がありMapます。1つはHashMapHashtableに非常に似ています)です。hash-tableこれはCommonLispのクラスと非常によく似ています。JavaにもありLinkedHashMapます。これはLispの関連リストと非常によく似ています。必要最低限​​のLispは赤黒木マップを提供せず、スレッドに関して標準化された動作はありません-特定の実装に関するドキュメントを読む必要がありますが、さまざまなデータ構造の多くの優れた実装をここで見つけることができます:http://www.cliki.net/Data%20structure

于 2012-10-21T21:42:24.983 に答える