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

コンピュータサイエンス教育に特に適した教訓的なツールと方法

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

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

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

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のこちらも参照してください。

4
プロット検査ヒューリスティックをだます方法は?
上ここで、デイブ・クラークは、漸近的な成長を比較するために、あなたが手で関数をプロットすべきであると提案しました。理論的に傾倒したコンピューター科学者として、私はこのブードゥーをプロットとして証明しません。考え直して、これは非常に有用なアプローチであり、時には十分に活用されていないことにも同意する必要があります。プロットは、最初のアイデアを得るための効率的な方法であり、時にはそれだけで十分です。 TCSを教えるとき、「常に機能するXだけを実行できる場合、正式な証明は何に必要ですか?」と尋ねる学生が常にいます。誤fallを指摘して説明するのは、彼の先生次第です。math.SEで最終的にフェールオーバーする見かけのパターンの素晴らしい例のセットがありますが、それらはかなり数学的なシナリオです。 それでは、どのようにプロット検査ヒューリスティックをだますのでしょうか?違いを見分けるのが難しい場合がいくつかあります。例えば [ ソース ] 推測してから、実際の関数のソースを確認してください。しかし、それらは私が期待するほど壮観ではありません。特に初心者にとっても、実際の関係は機能だけから簡単に見つけることができるからです。 関数定義と合理的なプロット検査から真実が明らかではない(相対的な)漸近的成長の例はありnnnますか?数学関数と実際のデータセット(特定のアルゴリズムの実行時間など)はどちらも歓迎です。ただし、区分的に定義された関数は控えてください。

3
ド・モーガンの法則を説明し理解する直観的な方法は何ですか?
De Morganの法則は、コンピューターサイエンスコースの入門数学でしばしば導入されます。用語を否定することで、ステートメントをANDからORに変換する方法としてよく見ます。 真理値表を覚えているだけでなく、これが機能する理由について、より直感的な説明はありますか?私にとってこれは黒魔術を使うようなもので、数学的にあまり傾いていない人にとって意味があるようにこれを説明するより良い方法は何ですか?

4
クイックソートが子供に説明しました
昨年、私は「幼稚園のための量子力学」に関する素晴らしい論文を読んでいました。簡単な紙ではありませんでした。 今、私は可能な限り簡単な言葉でクイックソートを説明する方法を疑問に思います。平均複雑度がであることを(または少なくとも手波で)どのように証明できますか?または少なくとも小学校では?O(nlogn)O(nlog⁡n)O(n \log n)

3
日常の材料からの論理ゲート
論理ゲートは、電磁リレー、真空管、またはトランジスタで実装できる抽象的なデバイスです。これらの実装は、基本的にバイナリの安定性を超えた連鎖性、耐久性、およびサイズのさまざまなプロパティのために、コンピューティングで成功しました。また、電気はエネルギー源であるため、簡単に出荷できます。 木、大理石、重力で作られた加算器を見てきました。「チップ上のラボ」毛細管現象駆動型プロトタイプを見てきました。私はあらゆる種類の特殊な機械計算機を見ました(Curta、スライド規則)。ドミノトレイルは使い捨てロジックゲートとして見てきました。 私は、必ずしも便利、耐久性、または高速である必要はありませんが、計算を実行するために日常の素材の特性を活用し、直接見える他の例示的なコンピューティングデバイスに興味があります。ドミノの軌跡は近いですが、リセットするには少し複雑すぎます。 磁気機械的配置?パイプ/トラフの水?より一般的な大理石の仕掛け? PS。ここに新しいものがあります。 機械式CPUクロック

6
線形代数のどの部分がコンピューターサイエンスで使用されていますか?
私は線形代数とそのアプリケーションを読んで、コンピューターサイエンスの教材(主に機械学習)の理解に役立てていますが、CSにとって多くの情報が役に立たないことを心配しています。たとえば、線形方程式のシステムを効率的に解く方法を知ることは、新しい方程式ソルバーをプログラムしようとしない限り、あまり役に立ちません。さらに、本は、行列に逆行列がある場合のスパン、線形依存性、独立性、およびこれらの間の関係について多くのことを話しましたが、CSでこれを適用することは考えられません。それでは、線形代数のどの部分がCSで使用されていますか?

6
間隔内の2つの数値の最大XORを見つける:二次式よりも良いことはできますか?
lllrrr L ≤ I 、最大(I ⊕ J )最大(私⊕j)\max{(i\oplus j)}L ≤ I 、J ≤ Rl≤私、j≤rl\le i,\,j\le r ナイーブアルゴリズムは、考えられるすべてのペアを単純にチェックします。たとえば、ルビーでは次のようになります。 def max_xor(l, r) max = 0 (l..r).each do |i| (i..r).each do |j| if (i ^ j > max) max = i ^ j end end end max end 私感私たちはより良い次より行うことができます。この問題のためのより良いアルゴリズムはありますか?

1
ライブコーディングを使用して教えるためのヒント
初年度のプログラミングとアルゴリズムのコースに参加しています。最近の講義で、ライブコーディングを使用して資料を提示することにしました。つまり、本質的にはキーボードの後ろに座ってコードを記述し、emacsを使用してコードを評価し、プロセスを容易にしました。 これは非常に成功し、学生たちはよりアクティブなフォーマットを高く評価したことについてコメントしました。これがこの教育形式を使用した最初の試みだったので、完全に実行されなかったことがわかります。問題の中には、emacsに精通していないことに関連するものもあれば、生徒の質問によってスクリプトから遠く離れすぎてしまうこともありました。私はもっ​​と上手にできることを知っています。 ライブコーディングレクチャーを使用してレクチャー(およびその他のデモンストレーション)を行うためのガイドラインは何ですか? 避けるべき落とし穴は何ですか?

4
再帰を教える
私は大学の教員補佐です。次のトピックは再帰です。学生が概念を簡単に把握して再帰的に考えることができるように、再帰を教えるのに最適な方法はどれですか。 再帰を教えるためにスタック構造を説明することを考えていましたが、プロセスを追跡する際にスタックするのではないかと心配しています。ヒントはありますか?
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.