TL; DR:パフォーマンス上の利点はありません!
最初のLispはデータ構造としてcons
(リンクリストセル)を持ち、すべてに使用しました。 Common LispとSchemeの両方には今日のベクタがありますが、機能的なスタイルではうまく一致しません。リンクされたリストには、1つの再帰的なステップがあり、アキュムレータの前にゼロ個以上の要素を追加できます。最後に、繰り返しの間に共有されたリストがあります。この操作では、複数の再帰が行われ、すべてのテールを共有する複数のバージョンが作成されます。私は共有がリンクされたリストの最も重要な側面だと言います。ミニマックスアルゴリズムを作成して状態をリンクリストに格納すると、状態の変更されていない部分をコピーすることなく状態を変更できます。 C++ビャーネ・ストロヴストルップの
Creatorは、データ構造を有するのペナルティはスクランブルとリンクリストのように二重の大きさは容易にあなたが順番に挿入し、データ構造の半分の要素を移動する必要がある場合でも上回っていることin a talkに言及しています。これらは二重にリンクされたリストと突然変異の挿入であることを覚えておいてください。しかし、ほとんどの時間はポインタを直線的に追跡し、すべてのCPUキャッシュミスを取得し、正しい場所を見つけ出し、したがってソートされたO(n)ベクトルをリストする方が良いでしょう。
リストにたくさん挿入するプログラムがある場合は、おそらくツリーがより良い選択肢になります。cons
でCLとSchemeで行うことができます。実際に、Chris Okasakiのすべての機能的なデータ構造はcons
で実装できます。 Haskellのほとんどの "可変"構造は、それと同様に実装されています。
Schemeでパフォーマンス上の問題が発生し、プロファイリング後にリンクリスト操作を配列1で置き換える必要があることが判明した場合は、その方法で何も立っていることはありません。結局のところ、すべてのアルゴリズムの選択肢には長所と短所があります。ハードコンピューティングはどの言語でも難しいです。
1)シンプリシティ2)トリビアルO(1)プリフェンド3)共有 – Bergi
@Bergiシンプリシティは実際には「パフォーマンス」の利点ではありませんが、それは理由です。私はあなたの共有ポイントを理解しているとは分かりません。不変性を仮定すると、フラットアレイを簡単に共有することができます。 – Textfield
しかし、配列の一部を共有することはできません。リストはテールを共有できます。 – Bergi