web-dev-qa-db-ja.com

データ構造とアルゴリズムを学習するためのプログラミング言語の選択

プログラミング言語推奨しますか学習するについてデータ構造とアルゴリズム

以下を考慮してください:

  • 個人的体験
  • 言語機能(ポインター、オブジェクト指向など)
  • 学習に適しているDS&A concept

プログラミング言語にとらわれない(数学的な観点から書かれ、擬似コードを使用する)本があるので、私は尋ねます。これらのいずれかから学んだ場合、アルゴリズムをコーディングして実行するプログラミング言語を選択したいと思います。

次に、DS&特定のプログラミング言語で書かれた例の概念-そして、これらのアルゴリズムもコーディングしたいと思います-したがって、ある程度、言語本も選ぶ。

いずれにせよ、私は言語を選択する必要があり、私はずっとその言語に固執したいと思います。個人的な言語設定はさておき、この目的に最適なものはどれですか?

70
bguiz

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

PythonとRuby

Python and Ruby=のような高レベル言語は、それらが高レベルであり、構文が非常に読みやすいため、しばしば推奨されます。しかし、これらの言語はすべて共通のデータ構造。学習演習として独自のバージョンを実装することを止めるものは何もありませんが、他の高レベルのデータ構造の上に高レベルのデータ構造を構築していることに気付く場合があります。

また、RubyとPythonは動的に型付けされた言語です。これは良いかもしれませんが、初心者にとっては混乱しやすく、最初は難しいかもしれません。通常、エラーは実行時までわからないため、エラーをキャッチします。

C

Cはもう一方の極端です。メモリの管理方法など、実際に低レベルの詳細を学習したい場合に役立ちますが、malloc()/ free()の正しい使用法のように、メモリ管理が突然重要な考慮事項になります。気が散ることがあります。また、Cはオブジェクト指向ではありません。それは悪いことではありませんが、単に注目に値します。

C++

C++が言及されています。コメントで言ったように、これはひどいの選択だと思います。 C++は、単純な使用法でもひどく複雑であり、ばかげた量の「落とし穴」があります。また、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(Eclipse、NetbeansおよびIntelliJ Community Edition for Java、Visual Studio Express for C#、Visual Studio Community Edition)があり、コードの作成と実行を簡単にします)配列や自分で作成したオブジェクトよりも複雑なネイティブデータ構造を使用しない場合、C/C++で行うのと基本的に同じことを学習しますが、実際にメモリを管理する必要はありません。

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

PythonまたはRuby(実際にはどちらでもかまいません)は、最初は動的型付けに問題がある可能性があるため、次の選択肢(および他の2つに非常に近い)になります。

80
cletus

Javaをお勧めします。主な理由:

  • garbage collection
  • 参照
  • 豊富なコレクション

編集:下の有権者が説明してください。

40
codaddict

私の意見では、Cはデータ構造とアルゴリズムを学ぶのに最適な言語になると思います。これは、Cが独自の言語を書くことを強制するからです。ポインタ、動的メモリ割り当て、およびリンクリスト、ハッシュテーブルなどの一般的なデータ構造の背後にある実装を理解するように強制されます。 )。

27
Taylor Leese

Pythonはすばらしい。読みやすく、フル機能。擬似コードを使用する場合、Pythonはかなりおなじみになります。

Pythonは C Irvine で既に選択されているアルゴリズム言語であり、次のように記述されています。
"Pythonは、教育で非常に必要とされてきたアルゴリズム指向の言語を表します。Pythonの教科書のような構文と実験を促進する双方向性。

Pythonは、グラフ作成ツールである Gato でも初心者に優しい方法で動作します。アルゴリズムとデータ構造の学習は、視覚化することで役立つ1つのトップです。これは、Gatoが(複雑なグラフライブラリを学習することなく)簡単にできることです。

14
Mantas Vidutis

データ構造およびアルゴリズムのみを学習することが目的であれば、JavaScriptと言います。ブラウザでコードを実行できます。オブジェクトの処理が非常に柔軟であり、メモリ管理、言語構造、または学習している実際のコンピューターサイエンスから焦点を移す他の要素ではなく、データ構造とアルゴリズムに完全に集中できます。

また、ブラウザを使用してDOMとCanvasを使用してグラフやツリーをレンダリングすることにより、さまざまなデータ構造を簡単に視覚化できるという利点もあります。

CSコースは長年にわたって主題が教​​えられる言語を変更する傾向があります。単に、学習を容易にする言語のより新しくより良い実装が到着し、実際の問題に集中しやすくなるからです。

12
Ernelli

Oberon-2 または Component Pascal 。最後のものは最初のもののスーパーセットです。

アインシュタインはかつて言った「できるだけシンプルにしよう、しかしシンプルではない」報告する。そして、それは上記のオベロンの子孫にも当てはまります。

プログラミング言語の完成度に関しては、アントワーヌ・ド・サン=テグジュペリを引用したいと思います。 。ワースは、これを達成できなくても正しい道を歩んでいます。 「Wirthプログラミング言語の行」(ALGOL-> Pascal-> Modula-2-> Oberon-> Oberon-2)では、後続の各言語は以前のものよりも単純であると同時に強力です。

パワフルだがシンプルな言語。強力な静的型付け、簡単なオブジェクト指向機能、ガベージコレクション。機能リストは大きくありませんが、特に初期段階で生産性を高め、物事を複雑にしないために十分です。

アルゴリズムとデータ構造を学びたいときは、それを意味します。ただし、言語が「強力」(C++、C#、Java、Pythonなどの多くの機能を備えている)の場合、アルゴリズムやデータ構造ではなく、言語の学習に多くの時間を浪費することになります。木々の森は見えません。 =)ツリーは構文要素(およびその他の機能)として、フォレストは重要な概念(アルゴリズム、データ構造、OOPなど)として考えることができます。言語に含まれる機能(ツリー)が増えると、より複雑になり、ステップを踏んで概念を理解する(フォレストを表示する)作業になります。

しかし、言語が非常に強力な場合(小さなセットで十分に実証された機能がある場合)、言語自体は2位になります。それほど多くの木がありませんので、2、3のステップを実行できます。 =)

また、アルゴリズムとデータ構造に関する多くの本ALGOL/Pascalのような擬似コードを使用する、この言語の例を簡単に変換できます。また、Wirthの「Algorithms and Data Structures」ブックの例を直接使用できます。 Oberonエディション(2004)、 [〜#〜] pdf [〜#〜] (1.2 MB)。

いくつかの追加リンク:

8
Wildcat

私はエイダをお勧めします。範囲チェックなど、他の言語にはないデータ構造の機能がありますtype Day is range 1 .. 31;また、非常に厳密なコンパイル時および実行時のチェック(オフにすることを選択しない限り)を備えているため、実装のバグを見つけやすくなります。

7
Daniel Rose

最も抵抗の少ない道を歩きたいなら、Python。不要なボイラープレートなどが最小限になります。

理想的には、Cでアルゴリズムを学びたいので、メモリレベルで何が起こっているかを学ぶことができます。また、関数型言語でアルゴリズムを学びたいので、同様のアルゴリズムが永続的なデータ構造でどのように機能するかを確認できます。

Knuthの有名な本 大量の(発明されたプラットフォーム)アセンブラコードが含まれています。超ハードコアになりたい場合にお勧めです。ただし、個人的には、アルゴリズムクラスを使用して作業していたときにCで作業していました(開示:ほんの数年前)。私は時々Knuthでいくつかの問題に取り組んでいますが、アルゴリズムを学習するための私の選択言語として完全にMMIXを使用するかどうかわかりません。ちょっとやり過ぎだと思う。

[〜#〜] edit [〜#〜]:また、あなたが何に慣れているかにも依存します。今すぐアルゴリズムテキストを使い始めたいが、Cを使ったことがない場合は、Pythonは正解ではありません。言語は、あなたがこれを楽しみたいので、克服するための巨大なハードル。

最後のポイント:少なくとも私がアルゴリズムを学んでいたとき、私は非常に多くの時間を紙に費やしました。私はそれが重要だと思います-漸近法などについて学びたいということです。どんな言語でもアルゴリズムを実装することに時間を費やしてはいけません。

5
Rob Lachlan

「唯一のツールがハンマーの場合、問題はすべて釘のように見える傾向があります」

少なくともいくつかの言語を学びます。

また、選択は目的によって異なります。

趣味? Windowsの世界での仕事ですか? Linux/UNIXファミリー?

アプリケーションの種類:ビジネスと科学。ハードウェアドライバーまたはアプリケーション?

デスクトップアプリケーションまたはWebアプリケーション?

いくつかの提案があります。

(a)間違いなくJを学ぶ(jsoftware.comから無料、APLの後継。JとAPLはどちらも、チューリングの勝者であるKen Iversonの作品です...チューリング賞は、コンピューティングにおけるノーベル賞のようなものです)。

(b)Windowsの世界にいる場合、.NETの多くはc#で実行されるため、c#から始めます。可能であれば、Tom Archerの「Inside c#」のコピーをMicrosoft Pressから入手してください。 Microsoftのエクスプレスバージョンをダウンロードすると、無料のc#開発システムを入手できます。

(c)TDD/BDDの使用方法を学習します...言語に関係なく、最初にユニットテストと呼ばれる小さなテストを作成します。次に、単体テストに合格するための製品コードを作成します。一度に1つの小さなステップ...それはあなたが使用する言語だけでなく、方法論でもあります。

(d)アセンブラー言語を学ぶ...アセンブラーは低レベルで、ほとんど機械語であり、舞台裏で何が起こっているのかをよく理解できます。

(e)Windowsの世界以外では、c ++をお勧めします。

最良の言語はありません。

言語のみの場合は、プログラミングが簡単になります。

非常に具体的なアルゴリズムを学習するだけでなく、より一般的で、特定の問題を解決するアプローチを選択するのに役立つパターンを学習することもできます。

確かなことは、プログラマーになるかどうかを学ぶために物事が尽きることは決してないということです。

4
gerryLowry

LISPは検討する価値があると思います。

私の最初の大学プログラミングコースはLISPでした。その前に私は10年間、いくつかの言語でプログラムを書いていました。最初のプログラミングコースは退屈だと思いましたが、私は間違っていました。

LISPの構文は非常に単純であるため、LISPは非常に興味深い言語です。フォーカスは構文から機能に移行します。関数型プログラミングスタイルは、学ぶのに非常に貴重なものでもあります。 LISPコースの後、LISPが教えてくれた新しいコンセプトのおかげで、C++でプログラムをまったく新しい、より良い方法で記述していることに気付きました。

また、LISPはコードとデータに同じ表現を使用します。これにより、コードをオンザフライで生成して実行する興味深いアルゴリズム設計が可能になります。

4
Anders Abel

標準ML、OCaml、F#、Haskellなどの代数的データ型とパターンマッチングを備えた言語に感謝します。たとえば、OCaml/F#で記述された赤黒バイナリ検索ツリーのバランスを再調整する関数は次のとおりです。

let balance = function
  | R(R(a, x, b), y, c), z, d | R(a, x, R(b, y, c)), z, d
  | a, x, R(R(b, y, c), z, d) | a, x, R(b, y, R(c, z, d)) ->
      R(B(a, x, b), y, B(c, z, d))
  | a, x, b -> B(a, x, b)
3
Jon Harrop

私は間違っているかもしれませんが、データ構造とアルゴリズムはプログラミング言語に依存していませんか?

最終的に、データ構造はデータを整理する方法にすぎません。高水準言語はそれをサポートします。確かに、特定の言語には基本データ構造を実装するメカニズムがあります(JavaまたはC++ STL)のCollections Frameworkなど)が、選択したプログラミング言語でデータ構造をプログラミングすることを妨げません。さらに、アルゴリズムは疑似コードで記述されているため、言語に依存しません。

私はそれがあなたの質問に本当に答えているわけではないことを理解していますが、あなたが探しているものを把握するのに苦労しています。データ構造/アルゴリズムの学習、または新しい言語の学習。

2
Pran

ひどいC++以外の言語であれば問題ありません。

2
Jeremy Jose