1. ホーム
  2. algorithm

[解決済み] データ構造とアルゴリズムの学習におけるプログラミング言語の選択【非公開

2023-05-05 18:22:30

質問

どのプログラミング言語 をお勧めします。 を学ぶことをお勧めします。 について データ構造とアルゴリズム で?

を考慮する。

  • 個人的な経験
  • 言語の特徴 (ポインタ、OOなど)
  • DS & A の概念の学習への適合性

プログラミング言語に依存しない(数学的な観点から書かれ、疑似コードを使用する)本がいくつかあるので質問します。もし、これらの本から学ぶのであれば、プログラミング言語を選択して、アルゴリズムをコーディングし、実行したいと思います。

それから、特定のプログラミング言語で書かれた例でDSamp; Aの概念を紹介する他の本があります - そして私はこれらのアルゴリズムもコーディングしたいと思います - したがって、ある程度は言語も本を選びます。

いずれにせよ、私は言語を選択しなければなりませんし、ずっと1つの言語にこだわりたいと思っています。個人的な言語の好みはさておき、この目的にはどれが最適なのでしょうか?

どのように解決するのですか?

この質問に対する答えは、あなたが何を学びたいかによります。

PythonとRuby

PythonやRubyのような高レベルの言語は、高レベルで構文が非常に読みやすいため、しばしば提案されます。しかし、これらの言語はすべて一般的なデータ構造のための抽象化を持っています。学習のために独自のバージョンを実装することを止めることはできませんが、他の高レベルのデータ構造の上に高レベルのデータ構造を構築することになり、必ずしも有用ではないことがわかるかもしれません。

また、RubyとPythonは動的型付け言語です。これは良いことですが、初心者を混乱させることもありますし、一般的に実行時まで明らかにならないので、エラーをキャッチするのが(最初は)難しくなることもあります。

C

C言語はもう一方の極にあります。メモリがどのように管理されているかといった本当に低レベルの詳細を学びたい場合には良いのですが、malloc()/free()の正しい使い方といったように、メモリ管理は突然重要視されます。それは気が散るかもしれません。また、C言語はオブジェクト指向ではありません。それは悪いことではなく、単に注意すべきことです。

C++

C++が挙げられています。コメントで述べたように、これは ひどい の選択だと思います。C++は単純な使い方でもひどく複雑で、とんでもない量の"gotchas"を持っています。また、C++には共通の基本クラスがありません。ハッシュテーブルのようなデータ構造は、共通の基本クラスがあることに依存しているので、これは重要なことです。名目上の基底クラスのためのバージョンを実装することはできますが、それは少し使い勝手が悪いです。

Java

Javaについても言及されています。多くの人がJavaを嫌っていますし、この言語が非常に冗長で、より現代的な言語機能(例えばクロージャ)が欠けているのは事実ですが、そんなことは全く問題ではありません。Javaは静的型付けされ、ガベージコレクションを備えています。つまり、Javaコンパイラーは、動的型付け言語では(実行時まで)検出できない多くのエラーを検出しますし、セグメンテーションフォールトを扱うこともありません(Javaでメモリリークができないわけではありません。) 私は、Javaは良い選択だと思います。

C#

C#は 言語 は、Javaの現代版のようなものです。Javaと同様に、仮想マシン上で動作するマネージド(ガベージコレクション)中間コンパイル言語です。C/C++ 以外のここに挙げたすべての言語も仮想マシン上で動作しますが、Python や Ruby などはバイトコードにコンパイルされるのではなく、直接解釈されます。

C#は基本的にJavaと同じ長所と短所があります。

Haskell (その他)

最後に、関数型言語です。Haskell、OCaml、Scheme/Lisp、Clojure、F#などです。これらはすべての問題を非常に異なる方法で考えるので、いつかは学ぶ価値がありますが、やはり何を学びたいかということに尽きます:関数型プログラミングかデータ構造か?私は、問題を混乱させるよりも、一度に1つのことを学ぶことに専念します。もし、ある時点で関数型言語を学ぶのであれば(私はそれをお勧めします)、Haskellは安全で素晴らしい選択です。

私のアドバイス

JavaまたはC#を選びましょう。どちらも無料の優れたIDE(JavaはEclipse、Netbeans、IntelliJ Community Edition、C#はVisual Studio Express、Visual Studio Community Edition)があり、コードを書いて実行するのは簡単です。配列よりも複雑なネイティブのデータ構造と、あなた自身が書いた任意のオブジェクトを使用しない場合、C/C++で行うのと基本的に同じことを学ぶことができますが、実際にメモリを管理する必要はありません。

説明させてください。拡張可能なハッシュ テーブルは、十分な要素が追加された場合、サイズを変更する必要があります。どのような実装でも、これは、バッキング データ構造 (通常は配列) のサイズを 2 倍にして、既存の要素をコピーするようなことを意味します。実装は基本的にすべての命令型言語で同じですが、C/C++ では、何かを正しく割り当てたり解放したりしない場合、セグメンテーション フォルトに対処する必要があります。

PythonまたはRuby(それは本当に重要ではありません)が私の次の選択です(そして、他の2つに非常に近いです)。