コンピュータサイエンス

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

6
数値の基本的な操作に一定の時間がかかると仮定するにはどうすればよいですか?
通常、アルゴリズムでは、数値の比較、加算、減算を気にしません-それらが時間実行されると仮定します。たとえば、比較ベースの並べ替えがであると言うときにこれを想定しが、数値が大きすぎてレジスタに収まらない場合、通常は配列として表現するため、基本操作には要素ごとに追加の計算が必要です。O (n log n )O(1)O(1)O(1)O(nlogn)O(nlog⁡n)O(n\log n) で2つの数値(または他のプリミティブな算術関数)の比較ができることを示す証拠はありますか?そうでない場合、比較ベースの並べ替えがと言っているのはなぜですか?O (n log n )O(1)O(1)O(1)O(nlogn)O(nlog⁡n)O(n\log n) SOの質問に答えたときにこの問題が発生し、遅かれ早かれbig-intを処理する必要があるため、アルゴリズムがはないことに気付きました。また、擬似多項式時間アルゴリズムではなく、でした。PO(n)O(n)O(n)PPP

9
なぜ最新のプロセッサでの加算はビット単位の操作と同じくらい速いのですか?
最新のプロセッサではビット単位の操作が非常に高速であることがわかっています。32ビットまたは64ビットを並列で操作できるため、ビット単位の操作には1クロックサイクルしかかかりません。ただし、加算は、少なくとも1つ、場合によっては最大12個のビット単位の操作で構成される複雑な操作であるため、当然、3〜4倍遅くなると考えました。単純なベンチマークの後、ビット単位の演算(XOR、OR、ANDなど)のどれとでも加算が正確に速いことを見て驚いた。誰もこれに光を当てることができますか?

9
プログラミング言語のどのプロパティがコンパイルを不可能にしますか?
質問: 「プログラミング言語の特定のプロパティでは、コードに記述されたコードを実行するための唯一の方法は解釈によるものです。つまり、従来のCPUのネイティブマシンコードへのコンパイルは不可能です。これらのプロパティは何ですか?」 コンパイラ:Parag H. DaveおよびHimanshu B. Daveによる原則と実践(2012年5月2日) 本は答えについての手がかりを与えません。プログラミング言語の概念(SEBESTA)で答えを見つけようとしましたが、役に立ちませんでした。ウェブ検索もあまり役に立ちませんでした。手がかりはありますか?

4
(いつ)ハッシュテーブルルックアップはO(1)ですか?
ハッシュテーブルルックアップは一定の時間で動作するとよく言われます。ハッシュ値を計算すると、配列ルックアップのインデックスが得られます。しかし、これは衝突を無視します。最悪の場合、すべてのアイテムが同じバケットに到着し、ルックアップ時間は線形()になります。Θ(n)Θ(n)\Theta(n) ハッシュテーブルルックアップを本当にすることができるデータの条件はありますか?それは平均的にのみですか、またはハッシュテーブルにO (1 )最悪のケースルックアップを含めることができますか?O(1)O(1)O(1)O(1)O(1)O(1) 注:ここではプログラマーの視点から来ています。ハッシュテーブルにデータを格納すると、ほとんど常に文字列またはいくつかの複合データ構造であり、データはハッシュテーブルの有効期間中に変更されます。したがって、完璧なハッシュについての答えはありがたいですが、それらはかわいいですが、逸話的であり、私の観点からは実用的ではありません。 PSフォローアップ:ハッシュテーブル操作O(1)はどのようなデータですか?

3
コンピューターはどのように時間を追跡しますか?
コンピューターは毎回正しい時刻と日付をどのように伝えることができますか? コンピューターを閉じる(シャットダウンする)と、内部のすべての接続とプロセスが停止します。もう一度コンピューターを開くと、正確な正確な時刻が表示されるのはどうですか?コンピューターをシャットダウンしても完全にシャットダウンしませんか?まだいくつかのプロセスが実行されていますか?しかし、バッテリーを取り出して(したがってすべてのプロセスを強制的に停止して)数日後に再び起動するときに、ラップトップは正しい時間をどのように伝えますか?

6
チューリングマシンが計算の一般的なモデルであるのはなぜですか?
私はCS学部です。Turingがどのようにして彼の抽象的なマシン(計算を行う人をモデル化する)を思いついたのかは理解していますが、私にとっては扱いにくい、洗練されていない抽象化のようです。なぜ「テープ」、マシンヘッドが記号を書いたり、状態を変えたり、テープを前後に動かしたりするのか、と考えるのはなぜですか。 根本的な意味は何ですか?DFAはエレガントです。通常の言語を認識するために必要なものを正確にキャプチャしているようです。しかし、チューリングマシンは、私の初心者の判断では、単なる不器用な抽象的な仕掛けです。 それについて考えた後、最も理想的な計算モデルは、入力文字列に対応するいくつかの物理システムが、動きに設定された後、静的平衡に達すると言うことだと思います。元の文字列からのシステムは、正しい出力文字列に対応します。これは、システムが元の状態のみに基づいて決定論的に変化するため、「自動化」の概念を捉えています。 編集: いくつかの回答を読んだ後、チューリングマシンについて私を混乱させるのは、それが最小限に思えないことであることに気付きました。計算の標準モデルは明らかに計算可能性の本質を伝えるべきではないでしょうか? また、明確でない場合は、DFAが計算の完全なモデルではないことを知っています。 返信いただきありがとうございます。

4
MapReduceの目新しさは何ですか?
数年前、MapReduceは分散プログラミングの革命として歓迎されました。批評家もいましたが、概して熱狂的な誇大宣伝がありました。それも特許を取得しました![1] 名前が連想させるmapとreduce関数型プログラミングでは、私が読んだとき(ウィキペディア) マップステップ:マスターノードは入力を受け取り、それをより小さなサブ問題に分割し、ワーカーノードに配布します。ワーカーノードがこれを順番に繰り返して、マルチレベルツリー構造になります。ワーカーノードは小さな問題を処理し、その応答をマスターノードに返します。 削減ステップ:マスターノードはすべてのサブ問題への回答を収集し、それらを何らかの方法で組み合わせて出力を形成します。これは元々解決しようとしていた問題への回答です。 または[2] MAPの内部: [...] MAPは入力値を単語に分割します。[...] MAPは、入力の指定された各キー/値ペアを潜在的に多くの中間キー/値ペアに関連付けることを目的としています。 REDUCEの内部: [...] [REDUCE]は、命令集約(たとえば、削減)を実行します。多くの値を取得し、それらを単一の値に削減します。 私は仕方がありません。これは、Mergesortの意味での分割と征服であり、単純で単純です!それで、MapReduceに(概念的な)目新しさはどこかにありますか、それとも特定のシナリオで役立つ古いアイデアの新しい実装ですか? 米国特許7,650,331:「効率的な大規模データ処理のためのシステムおよび方法」(2010) GoogleのMapReduceプログラミングモデル— R.Lämmelによる再訪(2007)

2
コインダクションとは何ですか?
(構造)誘導について聞いたことがあります。小さい構造から有限構造を構築することができ、そのような構造について推論するための証明原則を提供します。アイデアは十分に明確です。 しかし、コインダクションはどうですか?どのように機能しますか?無限の構造について決定的なことをどのように言えますか? 対処する(少なくとも)2つの角度があります。すなわち、物事を定義する方法として、また証明技術としての共誘導です。 コインダクションを証明技術として考えると、コインダクションとバイシミュレーションの関係は何ですか?

1
LL文法とLR文法の言語理論的比較
LR(k)パーサーはLL(k)パーサーよりも強力であるとよく言われます。これらの声明はほとんどの場合あいまいです。特に、固定またはすべてのkの和集合のクラスを比較する必要がありますか?では、状況はどうですか?特に、LL(*)がどのように適合するかに興味があります。kkkkkk 私の知る限り、LLパーサーとLRパーサーが受け入れるそれぞれの文法セットは直交しているため、それぞれの文法セットによって生成される言語について話しましょう。ましょによって解析することができる文法によって生成される言語のクラス示すLのR (K )パーサ、および他のクラスの類似します。LR(k)LR(k)LR(k)LR(k)LR(k)LR(k) 次の関係に興味があります。 LL(k)⊆?LR(k)LL(k)⊆?LR(k)LL(k) \overset{?}{\subseteq} LR(k) ⋃∞i=1LL(k)⊆?⋃∞i=1LR(k)⋃i=1∞LL(k)⊆?⋃i=1∞LR(k)\bigcup_{i=1}^{\infty} LL(k) \overset{?}{\subseteq} \bigcup_{i=1}^{\infty} LR(k) ⋃∞i=1LL(k)=?LL(∗)⋃i=1∞LL(k)=?LL(∗)\bigcup_{i=1}^{\infty} LL(k) \overset{?}{=} LL(*) LL(∗)∘?⋃∞i=1LR(k)LL(∗)∘?⋃i=1∞LR(k)LL(*) \overset{?}{\circ} \bigcup_{i=1}^{\infty} LR(k) これらのいくつかはおそらく簡単です。私の目標は、「完全な」比較を収集することです。参考文献を歓迎します。

6
実際の正式なプログラム検証
ソフトウェアエンジニアとして、工業製品用のコードをたくさん書いています。クラス、スレッド、いくつかの設計作業、およびパフォーマンスの妥協を伴う比較的複雑なもの。私は多くのテストを行い、テストにうんざりしているので、Coq、Isabelleなどの正式な証明ツールに興味を持ちました...これらのいずれかを使用して、コードにバグがないことを正式に証明できますか?それと?-しかし、これらのツールの1つをチェックアウトするたびに、日常のソフトウェアエンジニアリングに使用できると確信せずに立ち去ります。今、それは私だけである可能性があり、私はそれについてのポインタ/意見/アイデアを探しています:-) 特に、これらのツールの1つを機能させるには、検討中のプログラムのオブジェクト、メソッドなどを証明者に適切に定義するために莫大な投資が必要になるという印象を受けます。それから、証明者は、対処しなければならないすべてのサイズを考えると、蒸気が尽きないのではないかと思います。または、副作用を取り除く必要があるかもしれません(これらの証明ツールは宣言型言語で本当にうまくいくようです)、それが高速ではないため使用できない「実証済みのコード」になるかどうか疑問に思います十分に小さい。また、使用する言語を変更する余裕はありません。JavaまたはC ++である必要があります。OXXXmlでコードを作成するのは上司に伝えることはできません。コードの正確性を証明できます... フォーマルプルーフツールの経験が豊富な人はコメントできますか?再び-私なりLOVE正式な証明ツールを使用して、私は彼らが素晴らしいと思いますが、私は彼らが私は、Java / C ++の卑しい溝から到達することはできません象牙の塔にいるという印象を持っている...(PS:IまたLOVEハスケル、OCamlは...間違った考え方得ることはありません:私は、宣言型言語や形式的な証明のファンですが、私は)私は現実的ソフトウェア工学にその便利を作ることができる方法を確認しようとしています 更新:これはかなり広いので、次のより具体的な質問を試してみましょう:1)証明者を使用して産業用Java / C ++プログラムの正確性を証明する例はありますか?2)Coqはそのタスクに適していますか?3)Coqが適切な場合、最初にCoqでプログラムを作成し、次にCoqからC ++ / Javaを生成する必要がありますか?4)このアプローチは、スレッド化とパフォーマンスの最適化を処理できますか?

7
立法はNP完全ですか?
法的コードを複雑性に関連付ける作業があったかどうかを知りたい。特に、「この法律の本とこの特定の状況を考えると、被告は有罪ですか?」という決定問題があると仮定します。どの複雑度クラスに属しますか? カードゲームMagic:the GatheringはNPとチューリング完全の両方であることが証明された結果があります。同様の結果が法的なコードに存在すべきではないでしょうか。

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

10
Ruby / Pythonのような動的言語は、パフォーマンスのようなC / C ++に到達できますか?
Rubyのような動的言語用のコンパイラをビルドして、C / C ++と同等の性能を比較することは可能でしょうか?私がコンパイラについて理解していることから、Rubyを例にとると、Rubyがリフレクションを処理する方法、整数から大きな整数への自動型変換などの機能、および静的型付けの欠如が効率的なコンパイラを構築するため、Rubyコードのコンパイルは効率的ではありませんRubyの場合は非常に困難です。 Rubyやその他の動的言語をC / C ++に非常に近い性能を発揮するバイナリにコンパイルできるコンパイラを構築することは可能ですか?PyPy / RubiniusなどのJITコンパイラが最終的にパフォーマンスでC / C ++と一致する、または一致しないという根本的な理由はありますか? 注:「パフォーマンス」はあいまいになる可能性があることを理解しているので、それを明確にするために、パフォーマンスYでC / C ++でXを実行できる場合、Yに近いパフォーマンスでRuby / PythonでXを実行できますか?Xは、デバイスドライバーやOSコードからWebアプリケーションまですべてです。

12
コンパイラーが割り当て解除を自動的に挿入しないのはなぜですか?
Cのような言語では、プログラマはfreeへの呼び出しを挿入することが期待されています。コンパイラがこれを自動的に行わないのはなぜですか?人間は(バグを無視して)妥当な時間内にそれを行うので、不可能ではありません。 EDIT:今後の参考のために、ここで興味深い例があり、別の議論です。

3
配列をインターリーブするためのインプレースアルゴリズム
要素の配列が与えられます2n2n2n a1,a2,…,an,b1,b2,…bna1,a2,…,an,b1,b2,…bna_1, a_2, \dots, a_n, b_1, b_2, \dots b_n タスクは、結果の配列が次のようになるようにインプレースアルゴリズムを使用して配列をインターリーブすることです b1,a1,b2,a2,…,bn,anb1,a1,b2,a2,…,bn,anb_1, a_1, b_2, a_2, \dots , b_n, a_n インプレース要件がなければ、新しい配列を簡単に作成し、要素をコピーして時間アルゴリズムを提供できます。O(n)O(n)\mathcal{O}(n) インプレース要件では、分割統治アルゴリズムはアルゴリズムを上げ。θ(nlogn)θ(nlog⁡n)\theta(n \log n) 質問は次のとおりです。 あるその場でもあり、時間アルゴリズムは、?O(n)O(n)\mathcal{O}(n) (注:均一コストのWORD RAMモデルを想定できるため、インプレースはスペース制限に変換されます)。O(1)O(1)\mathcal{O}(1)

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