プログラミングやコンピューターサイエンス全般、アルゴリズムについてですか?


40

大学院生として、有名な企業(Google、Facebook、Microsoftなど)がアルゴリズムの質問をテストやインタビューに入れることはますます一般的になっています。私が応募したいくつかのスタートアップもアルゴリズムについて尋ねました。アルゴリズムの流encyさは、これらの企業のソフトウェア開発者にとって最も重要なことだろうか?

答えが「はい」の場合、アルゴリズムについて効果的に学習および実践するための最良の方法またはリソースは何ですか?ほとんどの教科書やウェブサイトで見られる、一見あまりにも複雑な問題を解決することに興味を持てないようです。基本的なアルゴリズム(クイックソート、バブルソートなど)は簡単に理解できますが、後で覚えて再利用するのは非常に困難です。

ありがとう。

P / S:私が好きなことを聞​​かれたら、それはユーザーの問題を革新的に解決する優れたソフトウェアを構築しているということです。これは、必ずしもソフトウェアが非常に複雑でなければならないという意味ではないと思います。


26
Googleがテキストボックスとボタンを使用してウェブ全体を検索できるようにするのがどれほど複雑かという考えはありますか?
-JeffO

21
@JeffOボタンはもう使用しません;-)
maple_shaft

1
Googleがそれをもっと簡単にすれば、他のすべての検索サイトはコードをまったく必要としません。
-JeffO

質問は、CPUの仕組み、RAMの仕組み、wifiの仕組みなど、コンピューターの仕組みに関するものだと思った。Javaやphpでプログラミングするオタクよりも、ハードウェアの方が優れていると感じています。
jokoon

2
それはアルゴリズムに関するすべてではありませんが、実際にはそれらはCSの中核です。しかし、プログラミングには、アルゴリズムとロジックだけではありません(たとえば、コードを維持するために、アルゴリズムの知識だけを必要としない)。
ヘイレム

回答:


44

アルゴリズムは明確です

アルゴリズムの素晴らしい点は次のとおりです。アルゴリズムが扱う問題空間は明確に定義されています。つまり、要件は実際に知られているだけでなく、通常はソリューションの品質のメトリックのように形式化されます。

したがって、アルゴリズムを考え出すように言っても、通信の問題が発生する可能性はあまりありません。パフォーマンスを測定することは簡単な作業です。同時に、パフォーマンスは論理的に考える能力のかなり良い指標です。

アルゴリズムは効率的なフィルターです

業界(および教育)の現在の問題は、卒業生の平均的な質の低さです。これは、FizzBu​​zzテストで説明されています。

1から100までの数字を調べて、数字が3で割り切れる場合は「fizz」、5で割り切れる場合は「buzz」、どちらでも割り切れない場合は数字自体を出力するプログラムを作成します。

どうやら、Comp Sciの卒業生の大多数はこの問題を解決できていないようです。もちろんこれは恥ずかしいほど単純な質問ですが、これはアルゴリズム上の質問であることに注意してください。これを考えると、Google Code JamやProject Eulerで与えられたような問題を解決できる人を獲得することで、あなたはすでにクリームドラクリームを楽しんでいます。

アルゴリズムはソフトウェア開発のごく一部です

真実は、あなたが業界で働くとすぐに、あなたはアルゴリズムスキルを1%以上使用しないことです。

コードを書き始める前に、まず要件を収集して分析する必要があります。次に、それらに基づいて設計を合成する必要があります。次に、設計を実装する必要があります。次に、元の要件に対して実装を評価してから、要件を反復し、設計を反復し、実装を反復するなどの作業を行う必要があります。

要件の1つは、適切なパフォーマンスです。その要件が満たされていない場合、実装のプロファイルを作成してボトルネックを追跡し、それを最適化することができます。より良いアルゴリズムを使用します(後で簡単に実行できるとは限りません)。したがって:

アルゴリズムは重要です

アルゴリズムをよく理解すればするほど、初めて正しくアルゴリズムを取得できる可能性が大きくなります。そうしないと、より良いアルゴリズムを実装することによってのみ解決できる問題に遭遇する可能性が高いだけでなく、実際に解決することもできません。
したがって、このスキルはほとんど必要ありませんが、開発方法論に単一障害点があり、スキルがない場合は、必要性が発生しないこと、または他の誰かがそれを修正するために飛び込むことのみを期待できます君は。

本当に重要なのは、同様の質問に答えて説明したように、計算の複雑さを感じ、それを低く抑える方法を理解することです。または、GUI開発など、これは単に重要ではないが、それでもほとんどすべての人がそれを嫌うものに特化するために...理由があります!


5
+1を使用すると、非常に包括的でインテリジェントな回答が得られます。また、FizzBu​​zzのフィルターの有効性は悲しいです。それができないという言い訳は絶対にありません。
アダムクロスランド

4
fizzbuzz数値が両方で割り切れる場合は印刷する必要があり、チェックを慎重にモジュロするように注文する必要があるため、多くの人がその上で滑っていると考えました。
マチューM.

1
1%は少し高すぎる可能性があります
大麻

1
@MatthieuM .:両方の印刷は、要件の表現方法に固有のものです。それがない場合は、要件を慎重に確認しなかったことを意味します。今、私が面白いと思うのは、特定の順序で印刷する必要はなく、一貫して同じ順序で印刷する必要もないということです
...-jmoreno

1
@ back2dosは:うん、しかし、より多くの楽しみのようなランダムな順序音でそれをやって...この答えで与えられるような要件がラインを言及していないことをメモして、ちょうど印刷します。FizzBu​​zzテストを与えられた場合、その中に多くの明言されていない仮定があることを指摘する価値があるかもしれません(それから、それはちょうどあなたを賢者として描くかもしれません)。
jmoreno

30

一般に、仕事としてのプログラミングはアルゴリズムに関するものではありません。深いアルゴリズムスキルを必要とせずに、CRUDアプリケーションのプログラミングに何年も費やすことができます。

仕事としてのプログラミングは次のとおりです。

  1. コミュニケーション:

    • ソースコードは、アイデアを同僚に伝える手段です。誰もあなたのコードを読んだり理解したりできなければ、それは価値がありません。

    • 他の開発者と話をしない孤独な開発者は、おそらくコードの間違いを犯し始め、彼自身のアプローチが唯一の受け入れ可能なものであると信じるでしょう。

    • 利害関係者、QA部門、ユーザー、ビジュアルデザイナー、DBAなどと通信する方法を知っている必要があります。

    • 経験豊富な開発者として、スキルの向上を望む経験の少ない同僚に教える必要があります。

  2. 適切なツールの知識:バージョン管理、バグ追跡システム、IDE、特定のタスクに適した言語とその理由、コード分析の使用方法など

  3. 幅広い知識と文化:関数型言語とは?コンピューターはどのようにコードを解釈しますか?LOCが無意味な尺度である理由 等

  4. 使用する言語に関する深い知識。

  5. アルゴリズム。

一方、コンピューターサイエンスは、アルゴリズムを重視しています。あなたが科学者として働いている場合、これは開発者の仕事とは何の関係もないかもしれません。アルゴリズムを最適化する方法、データ表現を別の表現に変換する方法などにより多く取り組むでしょう。


12
-1:「CRUDアプリケーション」アルゴリズムです。それらは(一般に)単純です。「高貴な意味」はありません。
S.Lott

2
そして、ソースコードは、あなたがそれをするように指示することを正確に行うコンピュータへの唯一の通信チャネルです(そして、あなたがそれをやりたいことはほとんどありません)
ラチェットフリーク

5
エンジニアリングチームがアルゴリズムの基本を無視した(またはまったく学習しなかった)CRUDdyアプリケーションをクリーンアップする市場がどれほど優れているかは驚くべきことです。
ジェイソントゥルー

2
@ S.Lott:「CRUDアプリケーションはアルゴリズム」は「I am America」に似ています。;)
ジムG.

1
@JimG:スティーブン・コルバートが言うように、「私はアメリカだからあなたもできる」。CRUDアプリケーションには、アルゴリズムが含まれ、基づいており、含まれ、実装されており、実現されており、具現化され、アルゴリズムを反映しています。特定の前置詞を示唆することなく、不平を言っただけです。どちらがあなたを幸せにしましたか?
S.Lott

16

インタビューにおけるアルゴリズムに関する質問は、企業がコンピューターサイエンスの基礎を理解していると判断する主な方法の1つだと思います。これはプロのプログラマーにとって唯一の重要なスキル分野ではありませんが、優秀なプログラマーの中核能力の1つです。

多くの大企業が面接プロセスでCSの基礎を強調しているのは、卒業して労働力になった後、最も発達しないのはコアスキルだからだと思います。実践的なプログラミング能力、設計スキル、ソフトウェアエンジニアリングの実践などはすべて、主に経験を通じて開発されるものですが、CSの基礎は主に教育の過程で開発されます。

アルゴリズム設計の練習方法については、スティーブイェッジはプログラマーとしてのインタビューの優れたガイドで、SkienaのThe Algorithm Design Manualを推奨しています


4
+1:プログラミング言語、フレームワーク、オペレーティングシステム、エディター、ツールセット、それらはすべて行き来しますが、問題を効果的に解決する方法を知ることは、データ構造とアルゴリズムの基本を知ることと関係があります。これらのことは常に私たちにとどまります。
アダムクロスランド

「アルゴリズム設計の実践方法については、Steve Yeggeが、プログラマーとしてのインタビューの優れたガイドで、SkienaのThe Algorithm Design Manualを推奨しています。」申し訳ありませんが、大学院生であるため、これはこの質問をした人には当てはまらないかもしれません。Google / MSは、Skiena(大学院生向け)から、国際的な大学プログラミング競技会に登場する質問をするようになりました。(これは逸話的な経験から確かに知っています)。Skienaの本は今でも使用されていますが、主に学部レベルの候補者向けです。
user396089

プログラミング競技会に出てくる質問については、以前に質問を見たことがない場合はかなりうんざりしています(IQが通常から3 SD離れている場合を
除く

11

独学で大学で数件のコンピューターサイエンスコースを受講しただけの成功したソフトウェア開発者として、今日のビジネスで直面する最大の問題は、すべてのプログラマーがバブルソートアルゴリズムを最も効率的な方法で書くことができないことです可能。企業が直面する真の問題:

  • 新しいドメインをすばやく学習して適応できない開発者

  • クライアントや利害関係者と有意義な方法で社会的に交流できない開発者

  • ビジネス要件を誤って推測したり、よく考え抜いたりすることができない開発者

  • コードと機能を徹底的にテストする方法を理解していない開発者

  • 意味のある見積もりをタイムリーに提供できない開発者

  • 明確で簡潔なドキュメントを作成できない開発者

  • 自己始動できない、または状況を管理できない開発者

10回のうち9回は、開発者が企業にflするほとんどすべての状況は、上記の品質の1つで絶望的に失敗するためだと思います。GoogleとFacebookを忘れてください、それらは例外的なケースであり、コンピューターサイエンスを深く理解している人々に正当なニーズがあります。

実際のビジネスは、コンピューターサイエンスの複雑さに苦労するのではなく、人類の複雑さに苦労します。問題は、上記の品質をテストするのが本当に難しいことです。ほとんどの場合、あなたはあなたの腸の反応に基づいてこれらの質について人々を判断しなければなりません。優秀な人のスキルと直感がなければ、アルゴリズムの知識をテストするのははるかに簡単です。


+1レギュラーおよびグーグルに似ていないフリーク企業は、優れたビジネススキルを持ち、主にプロセスを発明/適用/管理/修正する方法を理解する人々を必要とします。コンピューターサイエンスはビジネスの問題を解決するものではないため、Googleのような企業がアジャイルの動きをhatch化させなかったことは間違いありません。
-S.ロビンズ

10

個人的には、「標準」アルゴリズムとデータ構造をプログラマの語彙の一部と考えています。そして、プログラマーとして直面する実際的な問題の多くには、この語彙で(少なくとも部分的に)表現できる解決策があることがよくあります。

この語彙を自由に使えるようにすることで、「独自の」ソリューションを考え出す必要がなくなり(言うまでもなく、車輪の再発明)、よりスマートに、より速く作業できるようになります。

「ほとんどの教科書やウェブサイトで見られる、一見複雑すぎる問題を解決することに興味を持てないようです」

「後で覚えて再利用するのは非常に難しいと思う」

それらを完了するために自分自身を強制します。後で感謝します。それらを完全に覚えていなくても(十分な練習を積めば間違いなく覚えますが)、「アルゴリズムXまたはデータ構造Yを使用して類似の問題を解いたことを覚えている」と言えると、非常に役立ちます。それはあなたが詳細を調べて、あなたの記憶をリフレッシュする必要がある場合でも。


データ構造の場合は+1。それらはアルゴリズムコインの残りの半分です。
スペンサーラスブン

9

アルゴリズムを知らないと良いプログラマーになることはできませんが、プログラミングの仕事の他の側面を見えないようにするのは不公平です。例えば、あなたの母国語の厳格な規律と優れた指揮は、少なくともアルゴリズムの知識と同じくらい優れたプログラマーであるために重要です。また、プログラミング言語、ソース管理システム、テスト環境などの基本的なツールを理解することの重要性を過小評価しないでください。

ただし、インタビューに関しては、プログラマーとしての仕事に関連する他の能力を測定するよりも、アルゴリズムの理解度を測定する方がはるかに簡単です。そのため、インタビュアーはアルゴリズムについて尋ねることに集中することが多く、インタビュー中にアルゴリズムを説明する方法に細心の注意を払っています。他のことはそれほど重要ではないからではなく、インタビューに割り当てられた30分間でこれらの他のことを評価するのが難しいからです。


1
+1完璧な答え!アルゴリズムの知識をテストする方が簡単です。
maple_shaft

「あなたのアルゴリズム」-私は独学です。すべてのプログラマーが知っておくべきこれらの一般的なアルゴリズムが何であるかを示すソースまたはリストがどこかにありますか?それらを読み通したいと思います。ありがとう!
オミナス

2
@Ominusアルゴリズムの「紳士のリスト」に関する一般的なコンセンサスはありませんが、ほとんどの場合、検索、ソート、空間的連続性のないデータ構造(リンクリスト、バイナリツリーなど)、および初歩的な(mis)再帰の適用(再帰的階乗、フィボナッチ数列など)
-dasblinkenlight

@Ominus-私も独学ですが、「アルゴリズムの紹介」と思います-CLRSはこの分野に慣れるのに良い方法です。Skienaの本「The Algorithm Design Manual」も優れています。
トッド

5

はい、プログラミングのほとんどはアルゴリズムに関するものです。

しかし、あなたが考えているという意味ではないかもしれません。

私たち全員が異なるアルゴリズムの定義を使用しているという印象を受けます。 アルゴリズムはあいまいな用語であるため、正直に言うと、この質問に答えるのは難しいです。この質問に答えるには、ウィキペディアの定義を使用します。

操作のシーケンスを正確に定義する一連のルール。

これがプログラミングの核心です。あなたが書くとき任意のコードを、あなただけのアルゴリズムを実装しています。いくつかのCRUDアプリケーションを作成している場合、単純なアルゴリズムを実装しています。問題を解決するためのアルゴリズムを思いつくことができるのは、プログラミングとは何かです。残りは単なる詳細です。

私は、アルゴリズムを理解するよりも言語を深く理解することが重要だと言った以前のポスターに反対します。優れたプログラマーは言語を深く学ぶことができるはずですが、アルゴリズムがなければ、自分でコードを作成することはできません。


別の観点から、数学では、心と魂はアルゴリズムであるかもしれませんが、プログラミングにとっては別のものです。アルゴリズム自体を必要とせずにソフトウェアを作成することはできますが(おそらく優れたソフトウェアではありません)、ロジックや抽象的な思考なしではソフトウェアを作成できません。それの時にしかし、それは問題を解決することです。ソリューションを見つけることはアルゴリズムのプロセスですが、ソリューション自体は必ずしもアルゴリズムではありません。
-S.ロビンズ

4

答えはあなたが追求している仕事に完全に依存しています。一部のフィールドは、他のフィールドよりも特にアルゴリズムに焦点が当てられています。アマゾンと何度も面接することができましたが、その点についてお話しします。これらの複雑なアルゴリズムとは関係がほとんどありませんでしたが、タスクを一定の時間で償却する方法については、私は熱狂しました。

アルゴリズムの強力な理解を証明することは、あなたが潜在的な雇用者にあなたが適切な問題解決者であることの証拠です。それは本当に良い従業員の良い指標(IMO)ではありませんが、一部の雇用者はこれをスクリーニングに使用します。大学院の学位を必要とするポジションに応募する場合、アルゴリズムのより厳密な基盤を持つことが期待されます。

(IMO)が実際に非常に役立つのは、特定のアルゴリズムを記憶することではありませんが、一部のアルゴリズムの動作を理解することによって、あなたの心の奥にある小さなナゲットがあります。これにより、あなたの問題の解決策に関する研究が少し行われます。


卒業生の採用バーについて話すための+1。一部の企業は、学部生よりも大学院生を採用する方がはるかに面倒です。しかし、彼らに公平を期すために、大学院生の給与も高く、通常は内部的に高いレベルで採用されます。
user396089

1

プログラミングはアルゴリズムよりもデータ駆動型だといつも思っています。しかし、何もしないのであれば、データを使用するのは...すべての操作はアルゴリズムです。実際、そう、プログラミングはほとんど完全にアルゴリズムベースです。

それは数学のように見えないかもしれません、そしてあなたが日々するだろう多くのアルゴリズムの仕事はGUIとプログラムの間でデータを送るようなものです、しかしそれはアルゴリズムとしてもカウントします。リストボックスへの要素の挿入は、パフォーマンスやリスト構造の操作などの独自の問題を伴う標準の挿入アルゴリズムです。


1

それらの企業で働いているプログラマーだけがあなたの質問に本当に答えることができます。「Introduction to Algorithms」などで扱われている種類のアルゴリズムは、おそらく過去25年間で私のプログラミングライフの0.01%に貢献してきました。通常、データ構造または並べ替えが必要な場合、提供されるライブラリまたはフレームワークには必要なものが含まれています。超高速FFTが必要なときは、自分で作成するのではなく、Intel Math libのようなものを見つけます。ただし、Googleで彼らが何をするかは、私のキャリアで何をするかとは大きく異なります。スキーナの本「アルゴリズム設計マニュアル」は、彼が語る戦争の物語のために目を見張るものでした。彼は仕事A LOTでアルゴリズムを使用していることがわかります。

独立したプログラミングコンサルタントとしての私の経験では、成功は3つのことからもたらされました。1。クライアントと効果的に通信すること。3.複雑さの管理

数字の1と2だけでは不十分です。コードが(それを書いたプログラマ以外の誰かによって)保守可能でない場合、それは運命です。

番号3は、習得が最も難しいプログラミングスキルです。それは、アーキテクチャ、設計、コーディングに熟考する必要があります。マスタリングのリファクタリングが必要です。SOLID / DRYの原則を理解する必要があります。Intro to Algorithmsを読んでそれを習得することに専念したプログラマー、またはThe Pragmatic Programmerを読んで自分を1つにすることに専念したプログラマーを雇わなければならなかった場合、毎回後者を雇います。(相互に排他的である必要はありません)。


1

はい。

コンピューターサイエンスは、ほとんどがアルゴリズムです(割合)。

いや

しかし、それはコンピューターの「科学」です。コンピュータサイエンスの最も一般的なアプリケーションは、ソフトウェアエンジニアリングです。ソフトウェアエンジニアリングは、主にアルゴリズムではありません。それは主に創造の技術、完璧さの追求についてであり、今日存在する現実の人々の生活に良い影響を与えることを中心としています。コンピューターサイエンスも同じ動機を共有しているかもしれませんが、ソフトウェアエンジニアリングとはかけ離れています。

主要なコンピューターサイエンス大学の専任教授に、プログラミングについて理解する最も重要なことは何かを尋ねると、「アルゴリズムとデータ構造」を教えてくれるでしょう。

大手ソフトウェア会社の上級開発者に、プログラミングについて理解する最も重要なことを尋ねると、「顧客を喜ばせることを学ぶ」と言われるでしょう(つまり、アジャイルを理解し、顧客のように考え、時間通りに出荷し継続的に、そのもの作りの仕事)、など

セマンティクスのように見えるかもしれませんが、私の理解から、この2つは実際と理論の両方で著しく異なります。


1

コンピューターサイエンスで最も重要な部分を1つ選択する必要がある場合、アルゴリズムではなく抽象化を選択します。


1

コンピューターサイエンスでは、あなたが学ぶ概念はそれを示すまでは役に立ちません。したがって、コンピューターサイエンスの世界では大きな懸念事項です。

コンピューターサイエンスのほとんどすべての側面にアルゴリズムが必要だと思います。これを紹介しましょう。次のリストには、コンピューターサイエンスのさまざまな分野とそれらが使用するアルゴリズムが含まれています。

オートマトン

パワーセット構造。非決定性オートマトンを決定性オートマトンに変換するアルゴリズム。 Todd-Coxeterアルゴリズム。剰余類を生成する手順。

人工知能

アルファベータ。アルファ最大プラスベータ最小。ボードゲームで広く使用されています。 Antアルゴリズム。アリのコロニー最適化は、問題を解決し、2つの場所間の最適なパスを見つけるために、アリの行動に触発されたアルゴリズムのセットです。 DE(微分進化)。チェビシェフ多項式近似問題を解きます。 オンライン製品レビューにおける皮肉な文の半教師付き認識。ツイートまたはオンライン文書で皮肉や皮肉を認識するアルゴリズム。このようなアルゴリズムは、ヒューマノイドロボットのプログラミングにも不可欠です。

コンピュータビジョン

縮図。画像または動画を小さいもので表します。 画像内のオブジェクトをカウントします。接続コンポーネントのラベル付けアルゴリズムを使用して、最初に各オブジェクトにラベルを付け、次にオブジェクトをカウントします。 O'Carrollアルゴリズム。昆虫の視覚の数学的変換から、このアルゴリズムは物体を回避する方法を評価します。

遺伝的アルゴリズム

3つの演算子を使用します。選択(ソリューションを選択)、再現(選択したソリューションを使用して他のソリューションを構築)、交換(より良い場合はソリューションを交換)。

フィットネスの比例選択。ルーレットホイール選択とも呼ばれる、ソリューションの選択に使用される関数です。 切り捨ての選択。ソリューションを選択するための別の方法で、フィットネスによって順序付けられています。 トーナメントの選択。トーナメントの種類ごとに最適なソリューションを選択してください。 確率的ユニバーサルサンプリング。個人は線の連続したセグメントにマッピングされ、各個人のセグメントのサイズは、ルーレットホイールの選択とまったく同じサイズになります。

ニューラルネットワーク

ホップフィールドネット。バイナリしきい値ユニットを備えた連想メモリシステムとして機能するリカレント人工ニューラルネットワーク。それらは安定状態に収束します。 バックプロパゲーション。人工ニューラルネットワークのトレーニングに使用される教師あり学習手法。 自己組織化マップ(Kohonenマップ)。教師なし学習を使用してトレーニングされたニューラルネットワークは、トレーニングサンプルの低次元(2D、3D)表現を生成します。高次元データの視覚化に適しています。

バイオインフォマティクス

ニードルマン・ブンシュ。タンパク質またはヌクレオチド配列の2つの配列でグローバルアライメントを実行します。 スミス・ウォーターマン。ニードルマン・ブンシュのバリエーション。

圧縮

ロスレス圧縮アルゴリズム

Burrows-Wheeler変換。ロスレス圧縮の改善に役立つ前処理。 デフレート。ZIPで使用されるデータ圧縮。 デルタエンコーディング。順次データが頻繁に発生するデータの圧縮を支援します。 増分エンコード。文字列のシーケンスに適用されるデルタエンコーディング。 LZW。(Lempel-Ziv-Welch)。LZ78の後継。圧縮するデータから変換テーブルを作成します。GIFグラフィカル形式で使用されます。 LZ77および78。さらなるLZバリエーションの基礎(LZW、LZSS、...)。どちらも辞書コーダーです。 LZMA。Lempel-Ziv-Markov chain-Algorithmの略です。 LZO。速度を重視したデータ圧縮アルゴリズム。 PPM(部分一致による予測)。コンテキストのモデリングと予測に基づく適応統計データ圧縮技術。Shannon-Fanoコーディング。シンボルのセットとその確率に基づいてプレフィックスコードを構築します。 切り捨てられたバイナリ。通常、有限のアルファベットを持つ均一な確率分布に使用されるエントロピーエンコーディング。バイナリエンコーディングを改善します。 ランレングスエンコーディング。同じコードのシーケンスをオカレンスの数で置き換える一次圧縮。 Sequitur。文字列の漸進的な文法推論。 EZW(埋め込みゼロツリーウェーブレット)。画像をビットストリームに圧縮して精度を高めるプログレッシブエンコーディング。損失の多い圧縮でも、より良い結果が得られる場合があります。

コードをシンボルの確率とコード長に合わせるようにコードをシンボルに割り当てる Encodingコーディングスキーム。

ハフマンコーディング。相対的な文字周波数を利用した単純な可逆圧縮。 適応ハフマン符号化。ハフマン符号化に基づく適応符号化技術。 算術コーディング。高度なエントロピーコーディング。 範囲エンコード。算術コーディングと同じですが、見方が少し異なります。 単項コーディング。nに1が続き、その後にゼロが続く数値nを表すコード。エリアスデルタ、ガンマ、オメガコーディング。正の整数をエンコードするユニバーサルコード。フィボナッチコーディング。正の整数をバイナリコードワードにエンコードするユニバーサルコード。 ゴロムコーディング。幾何学的分布に従うアルファベットに最適なエントロピーコーディングの形式。 ライスコーディング。 幾何学的分布に従うアルファベットに最適なエントロピーコーディングの形式。

非可逆圧縮アルゴリズム

線形予測コーディング。音声のデジタル信号のスペクトルエンベロープを圧縮形式で表すことによる損失のある圧縮。 A-lawアルゴリズム。標準の圧伸アルゴリズム。 Mu-lawアルゴリズム。標準のアナログ信号圧縮またはコンパンディングアルゴリズム。 フラクタル圧縮。フラクタルを使用して画像を圧縮するために使用される方法。 変換コーディング。オーディオ信号や写真画像などのデータのデータ圧縮の種類。 ベクトル量子化。非可逆データ圧縮でよく使用される手法。 ウェーブレット圧縮。画像および音声の圧縮に適したデータ圧縮の形式。

暗号化

秘密鍵(対称暗号化)

復号化と暗号化の両方に秘密鍵(または直接関連する鍵のペア)を使用します。

Rijndaelとしても知られるAdvanced Encryption Standard(AES)フグ。古くなったDEの代替として意図された汎用アルゴリズムとしてSchneierによって設計されました。 データ暗号化標準(DES)、以前はDEアルゴリズム。 IDEA(国際データ暗号化アルゴリズム)。以前はIPES(改善されたPES)、DESの代替。PGP(Pretty Good Privacy)によって使用されます。キーを使用して、ブロックに分割されたデータに対して変換を実行します。 RC4またはARC4。インターネットトラフィック用のSSLやワイヤレスネットワーク用のWEPなどのプロトコルで広く使用されているストリーム暗号。 小さな暗号化アルゴリズム。いくつかの式を使用して、ブロック暗号アルゴリズムを簡単に実装できます。 PES(提案された暗号化標準)。 IDEAの古い名前。

公開鍵(非対称暗号化)

公開キーと秘密キーとして指定されたキーのペアを使用します。公開鍵はメッセージを暗号化し、秘密鍵のみがメッセージの復号化を許可します。

DSA(デジタル署名アルゴリズム)。素数と乱数を使用してキーを生成します。米国の機関で使用され、現在はパブリックドメインです。 エルガマル。GNU Privacy Guardソフトウェア、PGP、およびその他の暗号化システムで使用されるDiffie-Hellmanに基づいています。 RSA(Rivest、Shamir、Adleman)。電子商取引プロトコルで広く使用されています。素数を使用します。 Diffie-Hellman(Merkle)キー交換(または指数キー交換)。保護されていない通信チャネルで秘密を共有する方法とアルゴリズム。RSAによって使用されます。 NTRUEncrypt。畳み込み乗算を使用した多項式のリングを使用します。

メッセージダイジェスト機能

メッセージダイジェストは、任意の長さの文字列またはデータを暗号化したコードであり、ハッシュ関数によって処理されます。

MD5。CDまたはDVDのISOイメージを確認するために使用されます。 RIPEMD(RACE Integrity Primitives Evaluation Message Digest)。MD4の原則に基づき、SHA-1に類似しています。 SHA-1(セキュアハッシュアルゴリズム1)。関連する暗号化ハッシュ関数のSHAセットで最も一般的に使用されます。NSA機関によって設計されました。 HMAC。キー付きハッシュメッセージ認証。 タイガー(TTH)。通常、Tigerツリーハッシュで使用されます。

擬似乱数を使用した暗号化を 参照してください。乱数ジェネレーター

暗号技術

秘密共有、秘密分割、キー分割、M of Nアルゴリズム。

シャミールの秘密共有スキーム。これは、多項式補間に基づく式です。 Blakleyの秘密共有スキーム。本質的に幾何学的であり、秘密はm次元空間のポイントです。

その他の技術と解読

サブセット合計。整数のセットが与えられた場合、サブセットの合計はゼロになりますか?暗号化で使用されます。 Shorのアルゴリズム。RSAなどの非対称関数に基づいてコードを解読できる量子アルゴリズム。

幾何学

ギフト包装。点の集合の凸包を決定します。 ギルバート-ジョンソン-ケールティ距離。2つの凸形状間の最小距離の決定。 グラハムスキャン。平面内の一連の点の凸包を決定します。 線分交差点。ラインがスイープラインアルゴリズムと交差するかどうかを確認します。 多角形のポイント。特定のポイントが特定のポイント内にあるかどうかをテストします。 レイ/プレーンの交差。 *線/三角形の交差。*光線/平面交差の特定の場合。 暗黙の表面のポリゴン化。暗黙の表面を多角形表現で近似します。 三角測量。距離がわかっている他のポイントへの角度からポイントまでの距離を評価する方法。

グラフ 3D Surface Trackerテクノロジー。非表示の表面を考慮しながら、ビデオの壁に画像を追加するプロセス。 ベルマンフォード 重み付きグラフの最短経路を計算します(エッジの重みの一部が負になる場合があります)。 ダイクストラのアルゴリズム。エッジの重みが負でないグラフで最短経路を計算します。 摂動法。グラフ内のローカル最短パスを計算するアルゴリズム。 フロイド・ワーシャル。重み付き有向グラフのすべてのペアの最短経路問題を解きます。 フロイドのサイクル発見。繰り返しのサイクルを見つけます。 ジョンソン。疎な重み付き有向グラフのすべてのペアの最短パスアルゴリズム。 クラスカル。グラフの最小全域木を見つけます。 プリム。グラフの最小全域木を見つけます。DJP、JarníkまたはPrim–Jarníkアルゴリズムとも呼ばれます。 * Boruvka。*グラフの最小全域木を見つけます。 フォード・フルカーソン。グラフの最大フローを計算します。 エドモンズ・カープ。Ford-Fulkersonの実装。 ノンブロッキングミニマルスパニングスイッチ。電話交換用。 ウッドハウスシャープ。グラフの最小全域木を見つけます。 春ベース。グラフ描画のアルゴリズム。 ハンガリー人。完全に一致するアルゴリズム。 着色アルゴリズム。グラフ彩色アルゴリズム。 最寄りの隣人。最寄りの隣人を見つけます。 トポロジカルソート。(方向に従って)エッジを持つすべてのノードの前に各ノードが来るように、有向非循環グラフをソートします。 Tarjanのオフライン最小共通祖先アルゴリズム。ツリー内のノードのペアの最小共通祖先を計算します。

グラフィックス

ブレゼンハムのラインアルゴリズム。決定変数を使用して、指定された2点間の直線をプロットします。 風景3D風景を描きます。 * DDAラインアルゴリズム。*浮動小数点演算を使用して、指定された2点間の直線をプロットします。 塗りつぶし。接続された領域を色で塗りつぶします。 画像の復元。写真を復元し、画像を改善します。 Xiaolin Wuのラインアルゴリズム。ラインアンチエイリアス。 画家のアルゴリズム。3次元の風景の可視部分を検出します。 レイトレーシング。リアルな画像レンダリング。 フォンシェーディング。3Dコンピュータグラフィックスの照明モデルと補間方法。 グーローシェーディング。3Dオブジェクトの表面全体の光と色のさまざまな効果をシミュレートします。 スキャンラインレンダリング。架空の線を移動して画像を作成します。 グローバルイルミネーション。他のオブジェクトからの直接照明と反射を考慮します。 補間。デジタルズームなどの新しいデータポイントの構築。 リシンセサイザー。写真上のオブジェクトを削除し、PhotoshopおよびThe Gimpで使用される背景を再構築します。リシンセサイザーのチュートリアル。 勾配切片アルゴリズム。これは、線を描くための勾配切片式の実装です。 スプライン補間。Rungeの現象によるエラーを減らします。 3D Surface Trackerテクノロジー。 ビデオの壁に画像またはビデオを追加し、隠された表面を考慮します。

リスト、配列、ツリー

検索中

辞書検索。予測検索を参照してください。 選択アルゴリズム。リスト内でk番目に大きいアイテムを見つけます。 バイナリ検索アルゴリズム。ソートされたリスト内のアイテムを見つけます。 幅優先の検索。レベルごとにグラフをトラバースします。 深さ優先検索。ブランチごとにグラフを横断します。 最高の検索。優先度キューを使用して、重要度が高い順にグラフを走査します。 ツリー検索。*用途ヒューリスティックはスピードを向上させるためにすることを最良優先探索の特殊なケース。 均一コストの検索。コストが異なる最低コストのルートを見つけるツリー検索。 予測検索。検索用語の大きさと検索の最高値と最低値を考慮した検索のようなバイナリ。 ハッシュ表。ソートされていないコレクション内のアイテムにキーを関連付けて、線形時間でそれらを取得します。 補間検索。予測検索を参照してください。

仕分け

バイナリツリーの並べ替え。挿入ソートと同様の、増分、バイナリツリーのソート。 ボゴソート。非効率的なデスクカードのランダムな並べ替え。 バブルソート。インデックスのペアごとに、順不同の場合はアイテムを交換します。 バケットの並べ替え。リストをバケットに分割し、個別にソートします。ハト穴ソートを一般化します。 カクテルソート(または双方向バブル、シェーカー、リップル、シャトル、ハッピーアワーソート)。それぞれがリストを通過する両方向にソートするバブルソートのバリエーション。 コームソート。リストの終わり近くの小さな値である「カメ」を排除し、値の間のギャップを利用するバブルソートの効率的なバリエーション。 ソートのカウント。リストAの数値の範囲を使用して、この長さの配列Bを作成します。Bのインデックスは、Aの値がi未満の要素の数をカウントするために使用されます。 Gnomeソート。挿入ソートに似ていますが、要素を適切な場所に移動するのは、バブルソートのように一連のスワップによって行われます。 ヒープソート。リストをヒープに変換し、ヒープから最大の要素を削除し続け、リストの最後に追加します。 挿入ソート。ソートされたアイテムのリストで現在のアイテムがどこに属しているかを判別し、そこに挿入します。 イントロソート。または内省的なソート。クイックソートで始まり、特定の再帰レベルでヒープソートに切り替わります。 ソートをマージします。リストの前半と後半を別々にソートし、ソートされたリストをマージします。 パンケーキソート。シーケンスのプレフィックスの要素を逆にします。 ピジョンホールソート。空の配列に、ソートする配列のすべての要素を順番に入力します。 郵便配達員の並べ替え。郵便局で使用されるバケットソートの階層バリアント。 クイックソート。リストを2つに分け、最初のリストのすべてのアイテムが2番目のリストのすべてのアイテムの前に来るようにします。次に、2つのリストを並べ替えます。多くの場合、選択方法。 基数ソート。アイテムに関連付けられたキー、または数字を処理して整数をソートします。 選択ソート。残りの要素のうち最小のものを選択し、ソートされたリストの最後に追加します。 シェルソート。値間のギャップを使用して挿入ソートを改善します。 スムーズソート。ヒープソートを参照してください。 確率的ソート。bogosortを参照してください。

などなど...


0

質問ヘッダーで2つの質問をしたので、両方に答えます。

はい、コンピュータサイエンスはすべてアルゴリズムに関するものです。まあ...実際、それはコンピューターサイエンスには多くの側面があるため、少し誤解を招きやすいので、言い換えます。ワーキングワールドで適用されるコンピューターサイエンスは、主にアルゴリズムに関するものです。Google、Facebook、およびウォール街のすべてのクレイジーな場所を雇用している物理学者と開発者のような企業は、非常に複雑な問題を単純な形式に還元したいと考えています。

いいえ、プログラミングはアルゴリズムだけではありません。プログラミングとは、仕様を取得し、それらを実行用にコンパイルできるコードに変換することです。

答えの余分な部分:ソフトウェア開発はプログラミングではありませんが、多くの人が用語を混同し、それらを同じ意味で使用しているようです。プログラミングは、おそらくソフトウェア開発のより大きなプロセスの機能または手法にすぎません。ソフトウェア開発はアルゴリズムだけではありません。ソフトウェアの問題を解決し、健全なビジネス互換プロセスを適用して問題を効率的に解決できるようにすることです。ソフトウェア開発プロセス、さらにはプログラミング自体も、本質的にアルゴリズムプロセスである可能性がありますが、これはアルゴリズムに関するものと同じではありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.