コンピュータサイエンス

コンピュータサイエンスの学生、研究者、実務家のためのQ&A

11
クイックソートが実際に他のソートアルゴリズムよりも優れているのはなぜですか?
標準アルゴリズムコースでは、クイックソートは平均でであり、最悪の場合はであると教えられてい。同時に、最悪の場合(mergesortやheapsortのようなであり、最高の場合(bubblesortのような)線形時間であるが、メモリの追加の必要性がある他のソートアルゴリズムが研究されています。O (n 2)O (n log n )O (n ログn )O(nlog⁡n)O(n \log n)O (n2)O(n2)O(n^2)O (n ログn )O(nlog⁡n)O(n \log n) いくつかの実行時間をひと目見た後、クイックソートは他の効率ほど効率的であってはならないと言うのが自然です。 また、学生は基本的なプログラミングコースで、再帰があまりにも多くのメモリを使用するなどの理由であまり良くないことを学ぶと考えてください。したがって(これは本当の議論ではありませんが)、これはクイックソートがそうではないという考えを与えますそれは再帰アルゴリズムであるため、本当に良いです。 それでは、実際には、クイックソートが実際に他のソートアルゴリズムよりも優れているのはなぜですか?実世界のデータの構造に関係していますか?コンピューターのメモリの動作方法に関係していますか?一部のメモリは他のメモリよりもはるかに高速であることは知っていますが、それがこの直感に反するパフォーマンスの本当の理由であるかどうかはわかりません(理論的な推定と比較した場合)。 1更新:正規答えはに関与定数と言っている平均的な場合の、他のに関与する定数よりも小さいアルゴリズム。ただし、直感的なアイデアだけではなく、正確な計算を使用して、これを適切に正当化する方法はまだありません。O (n log n )O (n ログn )O(nlog⁡n)O(n\log n)O (n ログn )O(nlog⁡n)O(n\log n) いずれにせよ、いくつかの答えが示唆するように、メモリレベルでは実装がコンピューターの内部構造を利用し、たとえばキャッシュメモリがRAMよりも速いことを使用して、本当の違いが生じるようです。議論はすでに興味深いものですが、答えはそれに関係しているように思われるので、メモリ管理に関してさらに詳細を見たいと思います。 更新2:ソートアルゴリズムの比較を提供するいくつかのWebページがあり、一部は他よりも洗練されています(最も顕著なのはsort-algorithms.com)。素晴らしい視覚補助を提示する以外に、このアプローチは私の質問に答えません。

7
、、 -completeおよび -hard の定義は何ですか?
私はコンピューティングと複雑性についてのコースを受講しており、これらの用語の意味を理解することができません。 私が知っているのは、NPがNP完全のサブセットであり、NP完全のサブセットであるということだけですが、それらが実際に何を意味するのかわかりません。Wikipediaは、説明がまだ高すぎるため、あまり役に立ちません。

29
数学的な証明を書き留めるのは、コンピューターコードを書くよりもフォールトプルーフなのはなぜですか?
バグなしでコンピュータプログラムを書き留めるよりも、間違いを犯さずに数学的な証明を書き留める方がはるかに簡単だと気づきました。 これは私の経験よりも広く行われているようです。ほとんどの人は、プログラミング中に常にソフトウェアのバグを作成します。また、コンパイラには、常に間違いを教えてくれます。私は一度に間違いのない大きなコンピュータープログラムを書いた人のことを聞いたことがなく、バグがないと完全に確信していました。(実際、バグのないプログラムはほとんどなく、多くの高度にデバッグされたプログラムですらあります)。 しかし、コンパイラーが間違いを犯したことをフィードバックすることなく、場合によっては他人からフィードバックを得ることなく、論文全体または数学的な証明の本を書くことができます。 はっきりさせてください。これは、人々が数学の証明で間違いを犯さないと言うことではありませんが、経験の浅い数学者にとっても、その間違いは通常それほど問題ではなく、あなたの間違い。 実際、これが当てはまらない場合、数学はほとんど不可能に思えます。 だから、これは私に質問をするようになりました:前者が後者よりもはるかに扱いやすいようにする、誤りのない数学的な証明を書くことと誤りのないコンピューターコードを書くこととで何がそんなに違いますか? プログラマーが怠makesになり、コードを厳密に書くために必要なことをできないようにするのは、人々がコンパイラーの「外部の神託」をミスに向けているという事実に過ぎないと言うことができます。この見方は、もし彼らがコンパイラーを持っていなければ、数学者と同じように完璧であることができるということを意味するでしょう。 あなたはこの説得力があると思うかもしれませんが、プログラミングと数学的な証明を書き留めた私の経験に基づいて、これは本当に説明ではないと直感的に思えます。2つの取り組みについては、根本的に異なるものがあるようです。 私の最初の考えは、違いがあるかもしれないが、数学者にとって、正しい証明はすべての論理的なステップが正しいことだけを必要とするということです。すべてのステップが正しい場合、証明全体が正しいです。一方、プログラムにバグがないためには、すべてのコード行が正しいだけでなく、プログラム内の他のすべてのコード行との関係も同様に機能する必要があります。 言い換えれば、ステップ場合の証明では、ステップでミスを作り、その後、正しいなりません台無しステップ今まで。ただし、コード行が正しく記述されている場合、行間違いは行の動作に影響するため、行を記述するときは常に他のすべての行との関係を考慮する必要があります。これを制限するためにカプセル化とそれらすべてを使用できますが、完全に削除することはできません。Y X X Y X XバツXXYYYバツXXバツXXYYYバツXXバツXX つまり、数学的証明のエラーをチェックする手順は、証明ステップの数が本質的に線形ですが、コンピューターコードのエラーをチェックする手順は、コードの行数が本質的に指数関数的です。 どう思いますか? 注:この質問には、さまざまな事実や視点を探求する多数の回答があります。回答する前に、それらすべてを読んで、追加する新しいものがある場合にのみ回答してください。冗長な回答、または事実と意見を裏付けない回答は削除される場合があります。

10
コンパイラがCで記述されている言語は、Cよりも高速になりますか?
見撮影ジュリアのウェブページを、あなたは、いくつかのアルゴリズム(タイミングは、以下に示す)間でいくつかの言語のいくつかのベンチマークを見ることができます。もともとCで書かれたコンパイラーを備えた言語は、Cコードよりも優れているのでしょうか? 図:Cに対するベンチマーク時間(小さいほど良い、Cパフォーマンス= 1.0)。

3
アルゴリズム分析の魔法の背後にあるシステムはありますか?
アルゴリズムの実行時間を分析する方法については、多くの質問があります(たとえば、ランタイム分析およびアルゴリズム分析を参照)。多くは似ています。たとえば、ネストされたループのコスト分析や、分割統治アルゴリズムを求めるものですが、ほとんどの答えはオーダーメイドのようです。 一方、別の一般的な質問への回答では、いくつかの例を使用してより大きな全体像(特に漸近解析に関する)を説明していますが、手を汚す方法はありません。 アルゴリズムのコストを分析するための構造化された一般的な方法はありますか?コストは、実行時間(時間の複雑さ)、または実行された比較の数、スペースの複雑さなどのコストのその他の尺度である場合があります。 これは、初心者を指すのに使用できる参照質問になるはずです。したがって、通常よりも広い範囲です。少なくとも1つの例で説明されているが、多くの状況をカバーする、一般的で教訓的に提示された答えを与えるように注意してください。ありがとう!

12
なぜ、本当に、停止問題がそれほど重要なのでしょうか?
プログラムが停止するかどうかを判断する可能性を却下するために停止問題が頻繁に使用される理由がわかりません。ウィキペディア[記事] [1]は、有限のメモリを備えた決定論的なマシンが以前の状態を停止または繰り返すことを正しく説明しています。リンクされたリストがループしてO(1)のスペースの複雑さでホールティング関数を実装するかどうかを検出するアルゴリズムを使用できます。 Halting Problemの証明は、いわゆる「パラドックス」、つまり、嘘つきのパラドックスと同じように(少なくとも周期的な)自己参照の矛盾にすぎないように思えます。唯一の結論は、停止機能がそのような不正な質問の影響を受けやすいということです。 したがって、逆説的なプログラムを除き、停止機能は決定可能です。それでは、なぜそれを反対の証拠として保持するのでしょうか? 4年後:これを書いたとき、私はちょうどこのビデオを見ました。プログラマーはいくつかのプログラムを取得し、どのプログラムが終了するかを判断する必要があり、ビデオではそれが不可能な理由を説明しています。欲求不満だったのは、arbitrary意的なプログラムがあれば、主人公がそれらが終了したかどうかを証明できる可能性があることを知っていたからです。一般性の概念はどういうわけか失われました。「一部のプログラムは終了することが証明できない」と言うことと、「プログラムが終了することが証明できない」と言うことの違いです。そのための多くのアルゴリズムが正式に実証されています。私がオンラインで見つけたすべての参考文献によってこの区別をすることができなかったのは、この質問のタイトルにどのように来たかでした。このため、私はその答えに本当に感謝しています これにより、停止関数がブール値ではなく3項として再定義されます。

3
に一連の数字があるかどうかをどのように決定できますか?
次の演習を行いました。 させて f(n )= { 100nπ の10進表現で発生します 他にf(n)={10n occurs in the decimal representation of π0else\qquad \displaystyle f(n) = \begin{cases} 1 & 0^n \text{ occurs in the decimal representation of } \pi \\ 0 & \text{else}\end{cases} が計算可能であることを証明します。fff これはどのように可能ですか?天気を私の知る限りでは、我々は知らない数字(またはその)のすべての配列を含み、アルゴリズムは、確かにいくつかの手順がされていることを決めることができないではないに発生します。したがって、根本的な問題は半決定的であるため、fは計算可能ではないと思います。ππ\pifff

12
なぜそんなに多くのプログラミング言語があるのですか?
私はC / C ++にかなり堪能であり、さまざまなスクリプト言語(awk / sed / perl)を回避できます。pythonを使用し始めたのは、C ++の気の利いた側面の一部とawk / sed / perlのスクリプト機能を組み合わせたためです。 しかし、なぜそんなに多くの異なるプログラミング言語があるのでしょうか?これらのすべての言語で同じことができると思うので、なぜ1つの言語に固執してそれをコンピューターのプログラミングに使用しないのですか?特に、コンピュータープログラマーとして関数型言語を知っておくべき理由はありますか? 関連する読み物: なぜ新しいプログラミング言語が成功するのか、失敗するのか? プログラミング言語で行うべき研究はまだありますか?

14
なぜグラフを見て、すぐに別のポイントに最も近いポイントを見つけることができますが、プログラミングにはO(n)時間がかかりますか?
明確にさせてください: 与えられた数の点nの散布図を考えると、精神的にプロット内の任意の点に最も近い点を見つけたい場合、グラフ内のほとんどの点をすぐに無視して、近くの小さな一定の数の点に絞り込みます。 しかし、プログラミングでは、ポイントのセットnが与えられ、任意のポイントに最も近いポイントを見つけるには、他のすべてのポイント、つまり時間をチェックする必要があります。O(n )O(n){\cal O}(n) グラフの視覚的な視覚は、私が理解できないいくつかのデータ構造に相当すると思われます。プログラミングでは、ポイントをクアッドツリーなどのより構造化された方法に変換することにより、時間でポイントに最も近いポイントを見つけるか、時間。N K ⋅のログ(N )O(ログN )kkknnnK ⋅ ログ(n )k⋅log⁡(n)k\cdot\log(n)O(ログn )O(log⁡n){\cal O}(\log n) しかし、データ再構築後のポイント検索用の既知の償却アルゴリズム(私が見つけることができる)はまだありません。O(1 )O(1){\cal O}(1) では、なぜこれは単なる目視検査で可能に見えるのでしょうか?

6
カテゴリー理論は関数型プログラミングの学習に役立ちますか?
私はHaskellを学んでおり、その言語に魅了されています。しかし、私には深刻な数学やCSのバックグラウンドはありません。しかし、私は経験豊富なソフトウェアプログラマです。 Haskellでより良くなるために、カテゴリー理論を学びたいです。 Haskellを理解するための良い基礎を提供するために、カテゴリー理論のどのトピックを学ぶべきですか?

4
有限オートマトンを正規表現に変換する方法は?
正規表現を同じ言語を受け入れる(最小限の)NFAに変換することは、Thompsonのアルゴリズムなどの標準アルゴリズムを使用すると簡単です。しかし、他の方向はより面倒であるように思われ、結果の表現が面倒な場合があります。 NFAを同等の正規表現に変換するためのアルゴリズムは何ですか?時間の複雑さや結果のサイズに関して利点はありますか? これは参考質問になるはずです。メソッドの一般的な説明と重要な例を含めてください。

6
既知のNPハード問題に基づく暗号化アルゴリズムが存在しないのはなぜですか?
RSAなどの今日の暗号化のほとんどは、NPの困難な問題とは考えられていない整数因数分解に依存していますが、BQPに属しているため、量子コンピューターに対して脆弱です。なぜ、既知のNPハード問題に基づく暗号化アルゴリズムがなかったのだろうか。(少なくとも理論的には)NP困難であると証明されていないものよりも優れた暗号化アルゴリズムを作成するように思えます。

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

2
BIT:バイナリインデックスツリーの背後にある直感とは何ですか?
バイナリインデックス付きツリーは、他のデータ構造と比較して、文献が非常に少ないか比較的少ないです。それが教えられる唯一の場所はtopcoderチュートリアルです。チュートリアルはすべての説明で完了していますが、そのようなツリーの背後にある直感を理解できませんか?どうやって発明されたのですか?その正確さの実際の証拠は何ですか?

5
P = NPを解決しない方法
またはいずれかを証明しようとする試みは数多くあり、当然、多くの人がどちらの方向を証明するためのアイデアを持っているかを考えています。P ≠ N PP=NPP=NP\mathsf{P} = \mathsf{NP} P≠NPP≠NP\mathsf{P} \neq \mathsf{NP} 私は、機能しないことが証明されているアプローチがあることを知っています。そして、おそらく失敗した歴史のあるものがもっとあります。また、多くの証明の試みが克服できない、いわゆる障壁があるようです。 行き止まりの調査を避けたいのですが、それは何ですか?

Licensed under cc by-sa 3.0 with attribution required.