私はコンピューターサイエンスの学生で、自分の自由時間中にできるだけ多くの情報を吸収しようとしています。私はアルゴリズムにさまざまな形式(オンラインコース、本、Webチュートリアル)で何度も何度も戻りますが、その概念は私の注意を維持できません。わからないだけです。なぜアルゴリズムがそれほど特別なのですか。
なぜフラクタルが素晴らしいのか、なぜ黄金比が素晴らしいのか、なぜ折り紙が素晴らしいのか、そして上記すべての科学的応用を説明できます。一体私はニュートンの法則と円錐形のセクションさえ大好きです。しかし、アルゴリズムに関して言えば、私は驚かないだけです。彼らは人間の認知について新しい方法で全く洞察力がありません。アルゴリズムが先入観を打ち砕き、心を変えるものになると期待していましたが、何度も何度も失敗します。多分私は私のアプローチで何か間違っているのです。
アルゴリズムがプログラミングにとってなぜそれほど重要なのか、誰か教えてもらえますか?
アルゴリズムは、あらゆる種類の計算またはコンピュータープログラムのvery中心部です。実際、コンピュータープログラムは、いくつかの派手な構造化データと組み合わせたアルゴリズムの集まりにすぎません。それでおしまい。 アルゴリズム+データ構造=プログラム。
コンピュータプログラムは、それが従う論理的なルールで構成されています。このようなルールは、アルゴリズムとして構成されています。ルールは何にも作用しないため、ルールだけでは役に立たない-ルールには意味のある実体が欠けている。まるで空の皿から食べ物をスプーンで食べるのは無意味であるのと同じように、食べ物がなければプロセスは何ももたらしません。無駄だ。しかし、その物質を追加すると、このコンテキストでは、食品またはデータがすべて意味を持ちます。何か操作する必要があります。
次に、アルゴリズムはhowを操作する方法を定義します。 問題を解決するために何が正確に。さまざまな種類のアルゴリズムがさまざまな種類の問題を解決します。アルゴリズムが問題を解決する方法を理解することが重要です。なぜなら、自分が何をしているのかを理解しないと、より高い視点から物事を見ることができないからです。同様に、レンガを次々に配置するだけでは、橋を架けることはできません。ある人がしていること、彼らが解決している問題、そしてなぜ彼らが彼らのやり方をしているのかについてより深くより深く(---)理解する行う。コンピューティングとコンピュータープログラミングのコンテキストでは、アルゴリズムの理解と研究がこの理解をもたらします。
彼らは素晴らしいではありません。これは、他のツールと同様に、開発で使用する通常のツールにすぎません。
その唯一の目的は、特定の問題への回答を提供することです、ホイールを何度も再発明すること、つまり時間を浪費することを避けます。
例:
リストをソートするが必要な場合は、独自のアルゴリズムを開発するのに時間を浪費する代わりに、既存のアルゴリズムを使用します。
例外:あなたはあなたが何をしているのかを正確に知っており、特定の状況では、他の状況と比べてあなたの速度が速くなるか、なんとかして良くなることを知っています。
ハッシュパスワードが必要な場合は、独自のアルゴリズムを作成する代わりに既存のアルゴリズムを使用し、時間を浪費するだけでなく、セキュリティ上の脅威を導入します。
例外:あなたはセキュリティ研究者であり、新しいアルゴリズムをテストする準備ができている専門家のラボがあります。
「すごくない」とはどういう意味ですか?
最初のソート関数はどのように見えましたか?配列を並べ替えるのにN log(N)
時間かかりましたか?それとも、挿入/選択/バブルソートのバリエーションでしたか?
アルゴリズムなしでインターネット検索エンジンは可能でしょうか?インデックスに登録された200億のページを検索するのに2分もかからない場合、人々はGoogleを頻繁に使用するでしょうか?わずか1GBのテキストファイルを含むフォルダーをテキスト検索できるアプリケーションを作成してみて、アルゴリズムなしでどのように機能するかを確認してください。
コードの実行時間を短縮する方法を探しています完全に素晴らしい。あなたは他の人が何十年も研究してきた知識を提供され、それを数日または数時間で把握することができます。それは巨人の肩の上に立つようなものです。
彼らは人間の認知について新しい方法で全く洞察力がありません。
どのようにしてこの結論に達したかはわかりませんが、それは完全に間違っています。反対は真です。アルゴリズムは、これまでにない人間の認知への深い洞察を提供します。これは Church–Turing論文 で形式化されています。推測は関数の計算可能性に関するものですが、計算可能性の直感について非常に重要な結果があります。
人間の心は原則的に無限であると効果的に述べています(「ユニバーサルコンストラクター」と呼ばれることもあります。「ユニバーサルアセンブラー」と「フォンノイマンユニバーサルコンストラクター」の類似した明確な概念と混同しないでください。
仮説が真である場合、(David Deutschによると、 The Beginning of Infinity )(人間の)心はユニークですすべての既知の宇宙:それだけで、物理的な宇宙の残りの部分に持続的な影響を引き起こすことができます。
議論は少し複雑になりますが、本質的には、私たちの世界の他のすべてのもの、私たちの太陽系、そして私たちの銀河さえも範囲が限られているという点にまで減少します。 私たちの心は知識を生成することができるため、創造的な心(人間の心のような)だけでも、物理的に課された制限を拡張できます。
人間の認識に興味がある場合は、これを詳しく説明しているドイツの本を読むことをお勧めします。そして、これらすべては、アルゴリズムの洞察力、特に教会チューリングの論文から直接続きます。
それとは別に、アルゴリズムはあなたが認知の変化を引き起こすと興味深いものになります。たとえば、再帰、動的プログラミング、または推移性を最初に理解すると、まるで小さな光が頭の中で点灯しているように見えます–洞察力があります。したがって、アルゴリズムは、世界の主要な意味で、洞察に富んでいます。
アルゴリズムは、問題を解決するための基本的なツールキットの一部です。特定の順序で物事が必要になるたびに特定の種類の並べ替えルーチンを作り直す必要がある場合は、a)ソリューションの開発に時間がかかり、b)間違いなく間違いを犯します(または少なくとも正しくありません)。
いつB +ツリーを使用するのが最適ですか?参照の局所性はいつ重要であり、いつ無視できますか? 常にリレーショナルデータベースの設計を完全に正規化する必要がありますか、それとも非正規化した方が良い場合がありますか?プロセス間(またはスレッド間)ロックでうまく機能するパターンはどれですか。等.
(他の人や自分で作成した)アルゴリズムについてどう考えればいいのかわからない場合は、単純なコーダーを超えて進むことはできません。
人間の認知についてアルゴリズムが実証しているのは、ほとんど無限で複雑なアプリケーションを作成することが可能であり、比較的小さな緊急の問題を解決することだけが必要なことです。これは、以前の問題の世代が解決され、アルゴリズムにカプセル化されているためです。これらのアルゴリズムは、それらのアルゴリズムがどのように開発されたか、またはどのように機能するかを知らなくても、単純に不透明に使用できます。
フラクタルが素晴らしい理由、黄金比が素晴らしい理由、折り紙が素晴らしい理由、そして上記すべての科学的応用
アルゴリズムはそれらすべてを可能にするため、「素晴らしい」ものです。特定のフラクタル構造を作成する方法を誰かにどのように伝えますか?あなたは彼らに明確な指示のセットを与えます。それはアルゴリズムです。ファイをどのように計算しますか?アルゴリズムに従います。一般的な概念があなたに刺激を与えない場合、それはおそらくそれがあなたの日常生活にすでに深く浸透しているために、あなたが単にそれを当たり前のことと思っているからでしょう。ただし、アルゴリズムの科学的応用について考えることができない場合は、概念を理解していないか、科学についての最初のことを知りません。
アルゴリズムが先入観や心変わりを打ち砕くのを期待していましたが、何度も何度も彼らは惨めに失敗します。
コンピューティングのアルゴリズムだけに目を向けると、おそらくあなたの期待は膨らみます。 expexctingになっていると、何にでもフローリングするのは難しいです。それにもかかわらず、ある意味で美しい、または印象的な洞察を必要とするアルゴリズムはたくさんあります。これらはあなたが現在クラスで学んでいるものではないかもしれませんが、クイックソートのようなアルゴリズムが少なくともかなり気の利いたものであると思わなければ、あなたは間違った分野にいるかもしれません。何十億ものレコードを含むデータベースを即座に検索できるアルゴリズムがあることに感心していない場合は、実際に試みているわけではありません。比較的単純なアルゴリズムによって何百万ものコンピューターが何兆ものデータパケットを非常に確実に相互に送信できることが「素晴らしい」とわからない場合、印象に残ることはありません。
彼らは人間の認知について新しい方法で全く洞察力がありません。
アルゴリズムは、考慮されている問題に対するソリューションの存在の建設的な証明と見なすことができます。そして同様に、建設的な存在証明は、結果を計算するためのアルゴリズムに変えることができます。
そして、証明は、存在する場合の代替証明であっても、目前の問題についての洞察を提供します。
他の人はすでにクックブックの意味でアルゴリズムに取り組んでいるので、理論に取り組みます。
シンプルで迅速なアルゴリズムで十分であるという考えを得るのは簡単です。コードは、より大きなデータセットを使用した実際の問題に使用され、速度が遅くなるだけでなく、使用できなくなります。
理論の多くは、時間とスペースの要件growが問題のサイズが大きくなるにつれてどのように行われるかに関するものです。小さいデータセットでは単純な選択が非常に高速であることが多く、許容できないほど大きくなるため、これは重要です。
多くのプログラマーはアルゴリズムを自分で分析する必要はなく、多くの人は理論についての誤解を避けていますが、バブルソートが潜在的に巨大なデータセットをソートする適切な方法であると考える人は誰でも撃たれるべきです。
もう1つは、基本的なアルゴリズムの多くはまさにそれですが、より洗練されたアルゴリズムに出会うアイデアのいくつかは本当に驚くべきものであり、間違いなく素晴らしいものです。
しかし...まあ、先入観を打ち砕くことがあなたの判断基準である場合、あなたはまず粉砕するために関連する先入観が必要です。問題のサイズが大きくなったときに指数時間(またはさらに悪い場合)が実際に何を意味するのかを理解していない限り、アルゴリズム理論は実際に衝撃を与えることを目的としていません。
もう1つのポイント-人間の認識に似ているアルゴリズムを探している場合、おそらく、学習中にそれらにさらされたことはないでしょう。私は主に人工知能の分野(エキスパートシステム、ニューラルネットワーク、メタヒューリスティックス)のトピックについて話しています。これらは通常、上級クラスで教えられるか、まったく教えられません。