どのアルゴリズム/データ構造を「認識」して名前で知る必要がありますか?[閉まっている]


69

私はかなり経験豊富なプログラマーだと思っています。私はもう5年以上プログラミングを続けています。しかし、私の弱点は用語です。私は独学なので、プログラミングの方法は知っていますが、コンピューターサイエンスのより正式な側面のいくつかは知りません。それで、名前で認識して知ることができる実用的なアルゴリズム/データ構造は何ですか?

アルゴリズムの実装に関する本の推奨を求めているのではないことに注意してください。私はそれらを実装することを気にせず、アルゴリズム/データ構造が問題の良い解決策になるときを認識できるようにしたいだけです。「認識」するアルゴリズム/データ構造のリストをもっと求めています。たとえば、私はこのような問題の解決策を知っています:

0〜999というラベルの付いた一連のロッカーを管理します。人々はロッカーを借りに来て、ロッカーキーを返すために戻ってきます。どのロッカーが無料で、どのロッカーが使用されているかを管理するソフトウェアをどのように構築しますか?

ソリューションは、キューまたはスタックになります。

私が探しているのは、「どのような状況でBツリーを使用すべきか-ここでどの検索アルゴリズムを使用すべきか」などです。そして、より複雑な(しかし一般的に使用される)データ構造/アルゴリズムが機能します。

ウィキペディアのデータ構造アルゴリズムのリストを見てみましたが、それはちょっとやり過ぎだと思います。それで、私が認識すべき重要なものは何かをもっと探していますか?


10
「建設的ではない」として閉会する投票。どんな答えも完全に主観的です-「知っておくべき」ことについてコンセンサスはありません。
Oded

2
そのロッカーの問題のどの部分が入出力の順序付けを必要としますか?[ヒント!]
テラスティン

5
@Odedには、ほとんどの人が、どのデータ構造とアルゴリズムに精通したプログラマーが知っておくべきかについて同意するリストが絶対にあります。
デビッドカウデン

6
@Odedコンセンサスはありませんか?コンピュータサイエンスのアルゴリズムとデータ構造に関する入門コースのシラバスについてはどうですか?かなりよく標準化され、ピアレビューされました。良い出発点。
MarkJ

3
代替ソリューション; 日ごとに請求し、最大請求額があると仮定します。あなたがロッカーを許可し、それにユリウス日番号を書くとき、紙タグをキーに取り付けます。キーが返されたら、タグを見て、未払いの賃料を計算します。タグがない、または破損していると、最大の料金がかかります。未使用のキーはバッグに保管されます(ロッカーを貸すときに無料のキーから特定のキーを選択する必要がないため)。データ構造の合計サイズ:0ビット。アルゴリズムのすべての部分はO(1)です。
ジェームズヤングマン

回答:


78

客観的な応答:

この質問に対する私の最初の回答は、まもなく卒業するCS学生としての経験的経験と、CS分野で働きたい人のタイプについての私の予想に基づいています。実際には、ACM SIGCSEおよびIEEEコンピューティング社会の主観的な意見に関して客観的な答えがあります。10年ごとに、ACMIEEEの団体は、コンピューティング業界の状態に関する専門知識に基づいて、学部のコンピューターサイエンスカリキュラムの提案を詳述する共同出版物で協力しています。詳細については、cs2013.orgをご覧ください。委員会は彼らのカリキュラム推薦をリストする最終レポートを発行します。

そうは言っても、私のリストはまだかなり良いと思います。

以下の元の答え。


何を知っておくべきですか?

最小

熟練したプログラマーには、少なくともコンピューターサイエンスの学部レベルの知識が必要だと思います。確かに、CSは堅実なコミュニティであり、ほとんどの専門職に焦点が絞られているため、コンピューターサイエンスの小さなサブセットのみで多くの仕事に効果を発揮できます。また、多くの人々は、学部での勉強を終えてさらに専門化するでしょう。しかし、私はどちらも基本的なCSの知識を知らない言い訳ではないと思います。

タイトルの質問に答えるために、学部のCS学生(熟練したプログラマーの基礎)が卒業時に知っておくべきことを以下に示します。

データ構造

  • マシンデータ表現
    • 1、2の補数、および関連する算術
    • 単語、ポインター、浮動小数点
    • ビットアクセス、シフト、および操作
  • リンクリスト
  • ハッシュテーブル(マップまたは辞書)
  • 配列
  • スタック
  • キュー
  • グラフ
  • データベース

アルゴリズム

  • 並べ替え:
    • バブルソート(なぜ悪いかを知るため)
    • 挿入ソート
    • ソートのマージ
    • クイックソート
    • 基数スタイルのソート、カウントソートおよびバケットソート
    • ヒープソート
    • ボゴと量子ソート(=
  • 検索中:
    • 線形検索
    • バイナリ検索
    • 深さ優先検索
    • 幅優先検索
  • 文字列操作
  • 反復
  • ツリートラバーサル
  • リストトラバーサル
  • ハッシュ関数
  • ハッシュテーブル、ツリー、リスト、スタック、キュー、配列、セットまたはコレクションの具体的な実装
  • スケジューリングアルゴリズム
  • ファイルシステムの走査と操作(iノードまたは同等のレベル)。

デザインパターン

  • モジュール化
  • 工場
  • ビルダー
  • シングルトン
  • アダプタ
  • デコレータ
  • フライ級
  • 観察者
  • イテレータ
  • 州[機械]
  • モデルビューコントローラー
  • スレッド化と並列プログラミングパターン

パラダイム

  • 命令的
  • オブジェクト指向
  • 機能的
  • 宣言的
  • 静的および動的プログラミング
  • データマークアップ

複雑性理論

  • 複雑さの空間
  • 計算可能性
  • レギュラー、コンテキストフリー、ユニバーサルチューリングマシンの完全な言語
  • 正規表現
  • カウントと基本的な組み合わせ

超えて

質問の後半で質問する内容に入るために、上記に精通している場合、特定のシナリオに適したパターン、アルゴリズム、およびデータ構造を簡単に識別できるはずです。ただし、最善の解決策がない場合が多いことを認識してください。時には、2つの悪のうち小さい方を選択するか、単純に2つの同等の実行可能なソリューションから選択する必要があります。このため、選択を仲間から守るには一般的な知識が必要です。

アルゴリズムとデータ構造のヒントを次に示します。

  • バイナリ検索は、並べ替えられたデータでのみ使用できます(使用する必要があります)。
  • 基数スタイルの並べ替えは素晴らしいですが、並べ替えられるのは有限クラスのものだけです。
  • ハッシュテーブルと同様に、ツリーはほとんどすべてに適しています。ハッシュテーブルの機能を外挿して、効率を犠牲にして多くの問題を解決することができます。
  • 配列を使用して、最も高いレベルのデータ構造をバックアップできます。「データ構造」は、配列内の位置にアクセスするための巧妙な数学にすぎない場合があります。
  • 言語の選択は、髪を引き抜くか、問題を解決するかの違いになります。
  • ASCIIテーブルと128要素の配列は、暗黙的なハッシュテーブル(=
  • 正規表現は多くの問題を解決できますが、HTMLの解析には使用できません
  • データ構造は、アルゴリズムと同じくらい重要な場合があります。

上記のいくつかは簡単に思えないかもしれませんし、いくつかはあいまいに見えるかもしれません。あなたが私にもっと詳細に話して欲しいなら、私はそうすることができます。しかし、私の希望は、「文字列内のすべての文字の出現回数をカウントする関数を設計する」などのより具体的な質問に遭遇したとき、ASCIIテーブルと128の要素配列についてのヒントを見てください答えの表。

これらのアイデアに基づいて、私はあなたの質問で概説されたロッカーの問題に対する答えを提案します。


あなたの質問で提起された問題に答えてください。

これはあなたの質問に対する最良の答えではないかもしれませんが、あまり複雑なものを必要としない興味深いものだと思います。そして、それは確かにキューを使用する時間の複雑さ、またはロッカーが無料かどうかを判断するために線形時間を必要とするスタックを打ち負かすでしょう。

ロッカーは0〜999個あります。ロッカーの数が固定されているため、0〜999の範囲で衝突することなく、ハッシュ関数を簡単に想像できます。この関数は、単純にh(x)= x mod 1000です。ここで、[概念的に]整数キーと値として1000要素のchar配列の内容を含むハッシュテーブルを作成します。顧客がロッカー78を使用するために予約したい場合は、78をハッシュ関数に入れ(78を返す)、その数値を配列のベースポインターに追加します。オフセット値が指す場所に真の値を格納します。 。同様に、78が使用されているかどうかを確認する必要がある場合は、その場所に格納されている値を読み取り、trueに対して確認するだけです。

このソリューションは、バイナリツリーでバックアップされた優先度キューの場合のlog(n)時間ストレージおよびルックアップとは対照的に、ルックアップおよびストレージに対して一定時間で動作します。説明は意図的に冗長であるため、より高い概念が効率的なアルゴリズムに要約されていることがわかります。

ここで、利用可能なすべてのロッカーを知る必要がある場合、優先度キューの方が良いとは思わないでしょうか?優先キューに使用可能なロッカーがk個ある場合、それらすべてを繰り返すにはkステップかかります。さらに、優先度キューの実装によっては、優先度キューを再構築しなければならない場合があります。これには、k * log(k):(k <1000)ステップが必要です。配列ソリューションでは、1000要素の配列を反復処理して、どの配列が開いているかを確認するだけです。使用可能なリストまたは使用済みのリストを実装に追加して、k時間のみをチェックインすることもできます。


1
素晴らしい答えです!また、使用している言語の定義済み関数/データ構造、たとえばC ++のアルゴリズムとstlデータ構造、またはJava API for Javaを使用することに自信があることを付け加えます。
マルクタニ

1
優れた!特に「正規表現は多くの問題を解決できますが、HTMLの解析には使用できません。」
FrustratedWithFormsDesigner

2
「問題」が現れるまで、答えは良かった。プライオリティキューまたはハッシュテーブルを使用する理由はまったくありません。単純なスタックで十分です。必要に応じて、無料のロッカーの完全なリストを取得するための反復を追加します。
マチューM.

1
リレーショナルデータベース+ SQL、B +ツリーの知識、コンパイラ理論、ハードウェア構成の知識、オペレーションシステム理論の知識、TCP / IPネットワークの知識を追加する必要がありますか?
dan_l

1
私はデザインパターンに懐疑的です。多くの言語はある種の言語では有用ですが、他の言語では役に立たないおよび/または不必要です。また、アルゴリズム、およびトライとスキップリストのデータ構造にヒューリスティックを追加することもできます。従来のアルゴリズム/データ構造は、同期アクセスの制限に達しますが、複数のスレッドと同時実行を使用する他の非伝統的なアプローチに打ち勝つことができます。ヒューリスティックにより、必要なルックアップの回数を劇的に減らすことができますが、スキップリストのような構造では、グローバルロックなしでデータ構造に書き込むことができます。
エヴァンプライス

6

アルゴリズムの設計マニュアルスティーブンS. Skienaによっては、あなたが検索しているソースのように思えます。2番目の部分は、関連するアルゴリズムのレビューに関する問題の分類リストです。Webバージョンがあります。


3
素晴らしい本ですが、本当にプログラマーになるためにすべてをマスターする必要はありません。私は最近、それを買って、私は1979年以来、プログラムに支払われてきた(そして、はい、私はそれは私がそれから何かを学ぶことができると信じ買った。)
ケイト・グレゴリー

@KateGregory私はこの本を買って、RubyやJavascriptのような高レベルの言語しか知らないので(2進ツリー、リンクリストなどはない)、実際にそれを理解することができませんでした。
bigpotato

4

「すべき」というものはありません。A.基本的な複雑さのクラス(線形、対数など)に精通します。B. Bツリーのような派手なデータ構造でできるように、単純な配列でほぼ何でもできることを認識します。適切な構造/アルゴリズムを選択する秘trickは、パフォーマンス、予想される入力サイズ、実装の複雑さのバランスを取ることにあります。

次に、状態マシン、グラフ理論、凸性理論(線形計画法など)という抽象的でありながら非常に有用なものがあります(有用性はすぐには明らかになりませんが)。


1
何をいつ使用するかを知ることの重要性を過小評価しないでください。単純な配列を使用して解決したこれらの問題は、その大きなクライアントを巻き込み、長年にわたって正常に機能していたアプリケーションを見つけようとしているときに戻ってきて噛み付くため、クイックソート。
ピーターB

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