客観的な応答:
この質問に対する私の最初の回答は、まもなく卒業するCS学生としての経験的経験と、CS分野で働きたい人のタイプについての私の予想に基づいています。実際には、ACM SIGCSEおよびIEEEコンピューティング社会の主観的な意見に関して客観的な答えがあります。10年ごとに、ACMとIEEEの団体は、コンピューティング業界の状態に関する専門知識に基づいて、学部のコンピューターサイエンスカリキュラムの提案を詳述する共同出版物で協力しています。詳細については、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時間のみをチェックインすることもできます。