タグ付けされた質問 「education」

コンピュータサイエンス分野の学習とCS教育に関する一般的な質問

13
「いくつかのテストケースを試す」ヒューリスティックを欺く方法:正しいように見えるが実際は正しくないアルゴリズム
ある問題のアルゴリズムが正しいかどうかをテストするための通常の出発点は、いくつかの単純なテストケースでアルゴリズムを手動で実行してみることです。 「。これは優れたヒューリスティックです。これは、アルゴリズムに対する誤った試行の多くを迅速に排除し、アルゴリズムが機能しない理由を理解するための優れた方法です。 ただし、アルゴリズムを学習するとき、一部の学生はそこでやめようとします:試行することを考えられるすべてのコーナーケースを含む少数の例でアルゴリズムが正しく機能する場合、アルゴリズムが正しい必要があると結論付けます。「いくつかのテストケースで試してみることができるのに、なぜアルゴリズムが正しいことを証明する必要があるのか​​」と尋ねる学生が常にいます。 それでは、「多数のテストケースを試す」ヒューリスティックをどのように欺くのでしょうか。このヒューリスティックでは不十分であることを示す良い例を探しています。言い換えれば、表面的には正しいように見えるアルゴリズムの1つ以上の例を探しており、だれかが思い付く可能性のあるすべての小さな入力に対して正しい答えを出力しますが、アルゴリズムは実際には動作しません。たぶん、アルゴリズムはたまたますべての小さな入力で正しく動作し、大きな入力に対してのみ失敗するか、異常なパターンを持つ入力に対してのみ失敗します。 具体的には、私は探しています: アルゴリズム。欠陥はアルゴリズムレベルである必要があります。実装のバグを探していません。(たとえば、最低限、この例は言語にとらわれず、ソフトウェアエンジニアリングや実装の問題ではなく、アルゴリズムの問​​題に関連する必要があります。) 誰かがもっともらしく思いつくかもしれないアルゴリズム。擬似コードは、少なくとももっともらしいように見えるはずです(たとえば、難読化された、または明らかに疑わしいコードは良い例ではありません)。宿題や試験の問題を解決しようとするときに、一部の学生が実際に思いついたアルゴリズムである場合、ボーナスポイントがあります。 妥当な手動テスト戦略に高い確率で合格するアルゴリズム。手作業でいくつかの小さなテストケースを試みる人は、欠陥を発見する可能性は低いはずです。たとえば、「12個の小さなテストケースで手動でQuickCheckをシミュレート」しても、アルゴリズムが正しくないことを明らかにすることはできません。 好ましくは、決定論的アルゴリズム。私は多くの学生が「手作業でいくつかのテストケースを試す」が決定論的アルゴリズムが正しいかどうかをチェックする合理的な方法であると考えているのを見てきましたが、ほとんどの学生はいくつかのテストケースを試すことは確率論を検証する良い方法だとは思わないでしょうアルゴリズム。確率的アルゴリズムの場合、特定の出力が正しいかどうかを確認する方法がないことがよくあります。また、出力分布に関する有用な統計テストを実行するのに十分な例をクランクすることはできません。したがって、決定論的アルゴリズムは学生の誤解の中心により明確になるため、決定論的アルゴリズムに焦点を当てることを好みます。 私はあなたのアルゴリズムが正しいことを証明することの重要性を教えたいです。そして、このようないくつかの例を使って、正当性の証明の動機付けを助けたいと思っています。私は比較的単純で学部生がアクセスしやすい例を好むでしょう。重い機械や数学的/アルゴリズム的背景を必要とする例はあまり有用ではありません。また、「不自然」なアルゴリズムも必要ありません。ヒューリスティックを欺くための奇妙な人工アルゴリズムを構築するのは簡単かもしれませんが、非常に不自然に見えるか、このヒューリスティックを欺くためだけに明らかなバックドアが構築されている場合、おそらく学生には納得しません。良い例はありますか?

9
計算はどのように/いつコンピュータサイエンスで使用されますか?
多くのコンピューターサイエンスプログラムでは、2つまたは3つの計算クラスが必要です。 私は、計算機が計算機科学でどのように、そしていつ使用されるのかと思っています。コンピューターサイエンスの学位のCSコンテンツは、アルゴリズム、オペレーティングシステム、データ構造、人工知能、ソフトウェアエンジニアリングなどに焦点を当てる傾向があります。

5
同じ目的に役立つさまざまなアルゴリズム/データ構造を学ぶ理由は何ですか?
私は学部生だったので、この質問について疑問に思っていました。これは一般的な質問ですが、以下の例で詳しく説明します。 私は多くのアルゴリズムを見てきました-例えば、最大流量の問題については、問題を解決できる3つのアルゴリズムを知っています:Ford-Fulkerson、Edmonds-Karp&Dinic、Dinicが最も複雑です。 データ構造(たとえば、ヒープ)には、バイナリヒープ、二項ヒープ、およびフィボナッチヒープがあり、フィボナッチヒープは全体的な複雑さが最適です。 私を混乱させているのは、すべてを知る必要がある理由はありますか?なぜ最高の複雑さを学び、慣れるだけではありませんか? すべてを知っているのが最善だと知っています。BでなくAを使用することでしか解決できない問題/アルゴリズムなど、「より有効な」理由があることを知りたいだけです。

14
プログラミング言語を勉強していることを両親に説明するにはどうすればよいですか?
現在、コンピューターサイエンスの修士号を取得しています。プログラミング言語、特に型システムに興味があります。私はこの分野の研究に興味を持ち、次の学期にこのテーマの博士号を取得します。 さて、ここに本当の質問があります。コンピューターサイエンスや関連分野の知識がまったくない人に、私が(したい)ことをどうやって説明できるのでしょうか。 タイトルは、私が自分のしていることを両親や友人などに説明することさえできないという事実から来ています。ええ、「全体のポイントはソフトウェア開発者がより良いソフトウェアを書くのを助けることです」と言うことができますが、私はそれが本当に役に立つとは思いません。私は中世の人にとって自動車整備士だと言っているように感じます。彼らは単に私が何を話しているのか知らず、それを改善する方法は言うまでもありません。 誰も現実世界と良い類似性を持っていますか?「a-ha」の瞬間を引き起こす啓発的な例は?コンピューターサイエンス(または学術)の経験がない60歳以上に、短くてシンプルなコードスニペットを実際に見せるべきですか?その場合、どの言語を使用すればよいですか?ここの誰かが同様の問題に直面しましたか?

13
コンピュータサイエンスに興味を持ってもらうために、16〜17歳の子供たちと何をすればよいですか。
私は大学で数週間のうちに一種の「オープンデー」に参加するつもりです。この時間の一部として、私は(同僚と一緒に)高校レベルの生徒全員を2時間与え、全員を収容するのに十分な大きさのコンピューターラボを与えました。彼らとコンピューターサイエンスを行うことを奨励するための活動または一連の活動(私の大学で、理想的ですが、一般的にも)。ここで何をすべきかについて私は絶対に迷っていますし、ありとあらゆる提案を歓迎します。
40 education 

7
アルゴリズムの漸近的複雑性とアルゴリズム設計の実践との関連性の説明
アルゴリズムと複雑さでは、アルゴリズムの漸近的な複雑さ、つまり、入力のサイズが無限大になるときにアルゴリズムが使用するリソースの量に焦点を当てます。 実際には、必要なのは、有限の(場合によっては非常に多数の)インスタンスで高速に動作するアルゴリズムです。 関心のある有限数のインスタンスで実際にうまく機能するアルゴリズムは、優れた漸近的複雑さを持つ必要はありません(有限数のインスタンスでの良好なパフォーマンスは、漸近的複雑性に関して何も意味しません)。同様に、優れた漸近的複雑さを備えたアルゴリズムは、関心のある有限数のインスタンスでは実際にはうまく機能しない可能性があります(たとえば、大きな定数のため)。 なぜ漸近的な複雑さを使用するのですか?これらの漸近解析は、実際のアルゴリズムの設計にどのように関連していますか?

6
コンピューターはどのように機能しますか?
私は何年もの間コンピューターのオタクです。私はかなりの数の言語でプログラミングでき、それらを構築することもできます。先日、私は仲間と座って、コンピューターが実際に電気を取り込んでそれを処理する方法を尋ねましたが、私たちはそれを理解できませんでした。 つまり、コンピューターはどのように一定の電気の流れを取り、それを1と0に変えてから、実際にそれらの1と0で何かをして、15秒間点灯させるのですか? 私はゲート(AND、OR、NOR、NAND、NOT)とダイオード、抵抗器、トランジスタについて少し理解していますが、これは本当の素人の言葉で説明するのに最適な場所だと思いました! 誰かが私を正しい方向に向けたり、簡単な説明をしてもらえますか?

13
最初のプログラミングコースの言語選択の基準
大学レベルのCS教育者として、最初のプログラミングコースでどのプログラミング言語を教えるかという問題がしばしば議論の対象になります。数千の言語から選択することができ、ある言語キャンプを別の言語キャンプよりも多くの宗教的な熱(または熱意)が支えています。各プログラミング言語を取り巻くこの主観的なバイアスはすべて、教育者が言語を選択することを非常に困難にします。 私の質問は: 教育者はどのような客観的な基準を使用して、大学の1年生のプログラミングコースの基礎として使用するプログラミング言語を選択できますか?これらの基準の根拠は何ですか? 注:プログラミング言語のリストと、それらが使用するのに最適な理由を知りたくありません。問題は最高の言語ではなく、言語を選択するための基準です。ただし、特定のポイントを説明するためにプログラミング言語を使用することもできます。 この質問は、トピック外とみなされた別の質問https://cs.stackexchange.com/questions/1946/criteria-for-choosing-a-first-programming-languageに触発されました。

2
「計算科学を本当に教えることの残酷さについて」
ダイクストラは、コンピューティングサイエンスを実際に教えることの残酷さについてのエッセイで、入門的なプログラミングコースについて次の提案を行っています。 一方では、述語計算のように見えるものを教えますが、哲学者とは非常に異なって行います。初心者プログラマーに未解釈の式の操作を訓練するために、論理代数のすべての代数的特性に学生を慣れさせるブール代数としてそれをもっと教えます。直感へのリンクをさらに切断するために、ブールドメインの値{true、false}の名前を{black、white}に変更します。 一方、スキップと複数の割り当てを基本ステートメントとして、ローカル変数のブロック構造、ステートメント構成の演算子としてのセミコロン、素敵な代替構成、素敵な、シンプルでクリーンな命令型プログラミング言語を教えます必要に応じて、プロシージャコールを繰り返します。これに、ブール値、整数、文字、文字列などの最小限のデータ型を追加します。本質的なことは、導入するものが何であれ、対応するセマンティクスはそれに付随する証明ルールによって定義されるということです。 最初から、そしてコース全体を通して、プログラマーのタスクはプログラムを書き留めることだけではなく、彼の主なタスクは、彼が提案するプログラムが同様に正式な機能仕様を満たしていることを正式に証明することであることを強調します。証明とプログラムを手に取りながら設計している間、学生は述語計算で操作の敏a性を完璧にする十分な機会を得ます。最後に、この入門プログラミングコースは主に正式な数学のコースであるというメッセージを伝えるために、問題のプログラミング言語がキャンパスで実装されていないため、学生はプログラムをテストする誘惑から保護されています。 彼はこれは深刻な提案であることを強調し、彼の考えが「全く非現実的」で「非常に難しすぎる」など、考えられるさまざまな異議を概説しています。 しかし、そのkitは仮定のためにも飛ぶことはありません。間違っていることが証明されています。[私の経験では、これは一度だけでは不十分だと言っているので、前の文を少なくとももう2回繰り返す必要があります。] ダイクストラはどのコースを参照していますか?また、それについて説明している他の文献はありますか? エッセイは1988年にダイクストラがテキサス大学オースティンの大学にいたときに登場しました。これはおそらく手がかりです-彼らはダイクストラのアーカイブをホストしていますが、それは巨大であり、私はこのコースについて他の人から特に興味があります。 ここでは、ダイクストラのアイデアが良いか現実的かを議論したくありません。これをcstheory.seまたはcs.seに投稿することを検討しましたが、a)教育者のコミュニティには簡単に答えられる人がいる可能性が高いため、b)ダイクストラ自身が彼のコースは「主に正式な数学。」同意しない場合は、移行のフラグを設定してください。

8
計算の複雑さに関する知識のないプログラマーになることは問題ですか?
私は大学で運動を割り当てられました。私はそれを家に持ち帰り、それを解決するためのアルゴリズムをプログラムしようとしました。 それから、私が思いついた最も些細なことを作り、講師に見せました。簡単な観察の後、彼は私のソリューションの実行時の複雑さは実現不可能であり、より効率的なものを示していると感じました。そして、計算の複雑さについて何も知らないプログラマーの伝統があります(私はそれらの1つでした)。

9
コンピューターサイエンスとコンピューターリテラシーの違いを説明する[非公開]
古典的なコンピューターサイエンスと「MS-Windowsの使用に長けている」との違いを英語の主要な人に説明するのに良いメタファーまたは例は何ですか コンピュータサイエンス コンピュータープログラミング コンピューターを使用して 3つの大きく異なるもの。ほとんどの人は、コンピューターサイエンスとは何かさえ知りません。彼らは「コンピューター」という言葉を見るだけです。したがって、「彼はコンピューターサイエンス専攻です」は「彼は私のプリンターを接続できる」と解釈できます。または、彼は「コンピューターに長けている」。さらに少ない人は、コンピュータープログラミングとコンピューターサイエンスの違いを知っています。 コンピュータサイエンスは計算理論です。CSは、実際のコンピューターがなくても学習できます。CPUマイクロアーキテクチャ。数値の並べ替え方法、リストの走査方法など。ステートマシン。アルゴリズム、big(Oh)など。プログラミング言語またはコンパイラの設計方法。 プログラミングとは、コンピューター科学者が作成した言語とコンパイラーでコードを作成し、アプリケーションを作成することです。 最後に、コンピューターを使用しています(GUI、マウス、キーボードを使用します。インターネット、MS-Officeなど) しかし、これらの3つはすべて、素人でも同じ意味で使用されています。 古典的なコンピューターサイエンスと「MS-Windowsの使用に長けている」との違いを英語の主要な人に説明する良い例えです。

7
アセンブリ言語が必要なのはなぜですか?
私たちは主に高レベル言語でプログラムを書きます。それで勉強しながらアセンブリ言語に出会いました。したがって、アセンブラーはアセンブリー言語を機械語に変換し、コンパイラーは高水準言語でも同じことを行います。アセンブリ言語には、move r1 r3、move a 5などの指示があります。勉強するのはかなり難しいです。では、なぜアセンブリ言語が作成されたのでしょうか?コンピューター工学のクラスでアセンブラーについて勉強するのはなぜですか?

3
NP完全性の教育-チューリング削減対カープ削減
コンピューターサイエンス専攻にNP完全性を教えるのに最適な方法についての質問に興味があります。特に、Karp削減またはチューリング削減を使用してそれを教える必要がありますか? NP完全性と削減の概念は、すべてのコンピューターサイエンス専攻が学ぶべきものだと思います。しかし、NP完全性を教えるとき、カープ削減の使用にはいくつかの欠点があることに気付きました。 第一に、カープの削減は一部の学生にとって不必要に混乱させるようです。削減の直感的な概念は、「問題Xを解決するアルゴリズムがあれば、それを使用して問題Yも解決できます」です。これは非常に直感的ですが、カープの削減よりもチューリングの削減にはるかに良く対応します。その結果、NP完全性を証明しようとする学生は、直感に惑わされ、誤った証明を形成することがわかります。両方の種類の縮約を教えようと試み、カープ縮約のこの側面を強調することは、不必要な形式主義のように感じられ、不必要な授業時間と不必要な技術的詳細のように感じることに学生が注意を払うことがあります。このより制限された削減の概念を使用する理由は自明ではありません。 カープ削減とチューリング(クック)削減の違い、およびそれらがどのようにNP完全性の異なる概念につながるかを理解しています。カープの削減により、複雑さのクラス間の区別がより細かくなります。したがって、複雑性理論を真剣に研究するためには、カープ削減が明らかに正しいツールです。しかし、これを学んでいるだけで複雑性理論に進まないコンピューターサイエンスの学生にとって、この細かい区別が重要であるかどうかは、彼らがさらされるために重要です。 最後に、学生として、私は「トートロジー」のような問題に出くわしたとき戸惑っていたのを覚えています。たとえば、ブール式を与えられ、それがトートロジーであるかどうかを確認します。紛らわしいのは、この問題が明らかに難しいことです。そのための多項式時間アルゴリズムは、P=NPP=NPP=NP; この問題を解決することは、明らかにトートロジーの問題を解決するのと同じくらい難しいです。ただし、直感的にトートロジーは充足可能性と同じくらい困難ですが、トートロジーはNP困難ではありません。はい、今日これがなぜそうなのか理解していますが、当時私はこれに戸惑っていたことを覚えています。(結局、頭を突き抜けたのは、どうしてNPハードとコNPハードを区別するのかということです。とにかく、それは人為的なものであり、実践によってあまり動機付けられていないようです。実際の観点から見ると、co-NPの硬度はNPの硬度と本質的に同じ実際的な結果をもたらすように思われますが、なぜこの区別にすべてがこだわるのでしょうか?はい、私は知っています答えですが、学生として、私はこれが主題をより不可解でやる気が少ないと感じただけだったことを覚えています) だから、私の質問はこれです。NP完全性を生徒に教えるとき、カープ削減またはチューリング削減を使用して教える方が良いですか?チューリング縮約を使用してNP完全性の概念を教えようとした人はいますか?もしそうなら、それはどうでしたか?チューリング簡約を使用して概念を教え、カープ簡約に関連する概念上の問題をスキップした場合、非自明な落とし穴または欠点はありますか? 関連:こことここを参照してください。文献でKarpリダクションを使用する理由は、NP硬度とco-NP硬度を区別できるためです。ただし、この能力がすべてのCS専攻で取られるべきアルゴリズムクラスの学習目標にとって重要であるかどうかの教育学的観点に焦点を当てた答えを与えていないようです。同様の議論があるcstheory.SEのこちらも参照してください。


12
コンピューターを使用せずにコンピューターサイエンスを教えるにはどうすればよいですか?
世界のいくつかの場所では、人々は通常コンピューターにアクセスできないため(したがって、コンピューターの知識がほとんどありません)、ハードウェアとソフトウェアは時代遅れであり、停電などに悩まされています。(良い)本へのアクセスも不足する傾向があります。このような状況でコンピューターサイエンスを教えるにはどうすればよいですか? 実験をして、彼らが学んだことを応用することができなければ、彼らは信じられないほどやる気があり、ほとんどの時間をこの趣味に捧げても、まったく(よく)学ばないのではないかと心配しています。CSを理論的にのみ教えることは可能ですか?
21 education 

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