[解決済み] データ構造とアルゴリズムの学習におけるプログラミング言語の選択【非公開
質問
どのプログラミング言語 をお勧めします。 を学ぶことをお勧めします。 について データ構造とアルゴリズム で?
を考慮する。
- 個人的な経験
- 言語の特徴 (ポインタ、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つに非常に近いです)。
関連
-
[解決済み】Dijkstraのアルゴリズムが負の重みのエッジに対して機能しないのはなぜですか?
-
[解決済み】クイックソートとヒープソートの比較
-
[解決済み] log(n!)=Θ(n-log(n))でしょうか?
-
[解決済み】ソートアルゴリズムにおける安定性とは何ですか、なぜそれが重要なのですか?
-
[解決済み】Redisに使用されている基礎的なデータ構造は何ですか?
-
[解決済み] ロードされたサイコロをシミュレートするための効率的なデータ構造とアルゴリズムとは?
-
[解決済み] 再帰と反復
-
[解決済み] ある問題がNP完全であることをどのように証明するか?
-
[解決済み] 二分探索木におけるk番目の最小要素を最適な方法で探す
-
[解決済み] ビット単位で、モジュラス演算子の代わりに使用
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] アルゴリズム設計マニュアル』の解答はどこにあるのですか?[終了しました]
-
[解決済み] DFS-Forest Componentとは?
-
[解決済み] T(n) = 2T(n/2) + O(n) からO(nlogn)を得る方法
-
[解決済み] DPLLアルゴリズムはどのように動作しますか?[クローズド]
-
[解決済み] 線形時間でのソート?[クローズド]
-
[解決済み] 並べ換え→数→並べ換えの高速マッピングアルゴリズム
-
[解決済み] 重なり合う円の面積の合計
-
[解決済み] 三角関数の仕組み [クローズド]
-
[解決済み] リンクリストのソートで最も高速なアルゴリズムは?
-
[解決済み] エラトステネスの篩アルゴリズムの時間複雑性