コンピュータサイエンス

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

5
デッドコードがコンパイラによって検出できないことの証明
私はさまざまなトピックの冬のコースを教えることを計画しています。そのうちの1つはコンパイラーになります。今、私はこの問題に出くわしましたが、四半期を通じて与えるべき課題を考えていましたが、私は困惑しているので、代わりに例としてそれを使用するかもしれません。 public class DeadCode { public static void main(String[] args) { return; System.out.println("This line won't print."); } } 上記のプログラムでは、のためにprintステートメントが実行されないことは明らかですreturn。コンパイラーは、デッドコードに関する警告またはエラーを出すことがあります。たとえば、上記のコードはJavaでコンパイルされません。ただし、javacコンパイラは、すべてのプログラムでデッドコードのすべてのインスタンスを検出するわけではありません。コンパイラーがそれを実行できないことをどのように証明しますか?

7
プログラムを開くと、オペレーティングシステムは独自のマシンコードを挿入しますか?
私はCPUを研究していますが、メモリからプログラムを読み取り、その命令を実行する方法を知っています。また、OSはプログラムをプロセス内で分離し、各プログラムを非常に高速に切り替えて、同時に実行していると考えますが、実際には各プログラムはCPUで単独で実行されることも理解しています。しかし、OSがCPUで実行される大量のコードである場合、どのようにプロセスを管理できますか? 私は考えてきましたが、考えられる唯一の説明は、OSが外部メモリからRAMにプログラムをロードすると、元のプログラム命令の途中に独自の命令を追加するため、プログラムが実行され、プログラムがOSを呼び出して、いくつかのことを実行できます。OSがプログラムに追加する命令があり、CPUがOSコードにいつか戻ることができると信じています。また、OSがプログラムを読み込むと、禁止されている命令(メモリ内の禁止されたアドレスにジャンプする)があるかどうかをチェックし、それを排除すると信じています。 私はきちんと考えていますか?私はCSの学生ではありませんが、実際には数学の学生です。可能であれば、OSがCPUで実行される大量のコードであり、同時に実行できない場合、OSがプロセスを管理する方法を説明する人を見つけられなかったため、これに関する良い本が欲しいでしょう。プログラムの時間。これらの本は、OSが物事を管理できることだけを伝えていますが、今ではその方法を伝えています。

3
ピュア/依存型システムの簡単だが完全な説明は何ですか?
何かが単純な場合は、いくつかの言葉で完全に説明できるはずです。これは、λ計算に対して行うことができます。 λ計算は、構文規則(基本的に構造)であり、リダクションルール(特定のパターンが出現するまで、そのようなパターンが存在しなくなるまで繰り返し検索/置換手順が適用されることを意味します)。 文法: Term = (Term Term) | (λ Var . Term) | Var 削減ルール: ((λ var body) term) -> SUBS(body,var,term) where `SUBS` replaces all occurrences of `var` by `term` in `body`, avoiding name capture. 例: (λ a . a) -> (λ a a) ((λ a . (λ b . …

2
停止ステータスが不明な非常に短いプログラムとは何ですか?
Binary Lambda Calculusのこの579ビットプログラムには、不明な停止ステータスがあります。 01001001000100010001000101100111101111001110010101000001110011101000000111001110 10010000011100111010000001110011101000000111001110100000000111000011100111110100 00101011000000000010111011100101011111000000111001011111101101011010000000100000 10000001011100000000001110010101010101010111100000011100101010110000000001110000 00000111100000000011110000000001100001010101100000001110000000110000000100000001 00000000010010111110111100000010101111110000001100000011100111110000101101101110 00110000101100010111001011111011110000001110010111111000011110011110011110101000 0010110101000011010 つまり、このプログラムが終了するかどうかはわかりません。それを決定するには、Collat​​zの予想を解く必要があります-少なくとも、2 ^ 256までのすべての数値に対して。このリポジトリには、このプログラムがどのように取得されたかの完全な説明があります。 また、停止ステータスが不明な短いBLCプログラムがありますか?

3
フロイドのサイクル検出アルゴリズム| サイクルの開始点の決定
私はフロイドのサイクル検出アルゴリズムを理解する助けを求めています。ウィキペディア(http://en.wikipedia.org/wiki/Cycle_detection#Tortoise_and_hare)の説明を読みました。 アルゴリズムがO(n)時間でサイクルを検出する方法を見ることができます。ただし、亀とウサギのポインターが初めて会った後、亀のポインターを最初に戻し、亀とウサギの両方を一度に動かすことで、サイクルの開始を決定できるという事実を視覚化することはできません。彼らが最初に会うポイントは、サイクルの始まりです。 私がそれを理解/視覚化できないので、誰かが説明を提供することで助けてくれますか?


5
興味深いアナグラムを見つける
言うと同じ長さの2つの文字列です。anagramming二つの文字列の全単射写像であるようそれぞれについて、。a1a2…ana1a2…ana_1a_2\ldots a_nb1b2…bnb1b2…bnb_1b_2\ldots b_np:[1…n]→[1…n]p:[1…n]→[1…n]p:[1\ldots n]\to[1\ldots n]ai=bp(i)ai=bp(i)a_i = b_{p(i)}iii 同じ文字列のペアに対して複数のアナグラムが存在する場合があります。例えば、場合 `abcab`と私たちが持っているとなど。a=a=a=b=b=b=cababp1[1,2,3,4,5]→[4,5,1,2,3]p1[1,2,3,4,5]→[4,5,1,2,3]p_1[1,2,3,4,5]\to[4,5,1,2,3]p2[1,2,3,4,5]→[2,5,1,4,3]p2[1,2,3,4,5]→[2,5,1,4,3]p_2[1,2,3,4,5] \to [2,5,1,4,3] アナグラムのの重み は、2番目の文字列を取得するために再配置できるチャンクを取得するために最初の文字列で行う必要のあるカットの数であると言います。正式には、この値の数れる。すなわち、その時点の数であり、はないない、正確1.For例によって増加及び、なぜならカットチャンクに、一度と、及び切り込み4回、5つのチャンクに。w(p)w(p)w(p)pppi∈[1…n−1]i∈[1…n−1]i\in[1\ldots n-1]p(i)+1≠p(i+1)p(i)+1≠p(i+1)p(i)+1\ne p(i+1)pppw(p1)=1w(p1)=1w(p_1) = 1w(p2)=4w(p2)=4w(p_2) = 4p1p1p_11234512345p2p2p_212345 2つの文字列とアナグラムが存在するとします。次に、少なくとも1つのアナグラムの重みを最小にする必要があります。これが一番軽いとしましょう。(最も軽いアナグラムが複数ある場合があります。重みだけに興味があるので気にしません。)aaabbb 質問 アナグラムが存在する2つの文字列が与えられたときに、2つの文字列の最も軽いアナグラムの正確な重みを効率的に生成するアルゴリズムが必要です。アルゴリズムが最も軽いアナグラムを生成する場合でも問題ありませんが、そうする必要はありません。 すべてのアナグラムを生成して重量を量るのは非常に簡単なことですが、多くのアナグラムが存在する可能性があるため、軽いアナグラムを直接検出する方法をお勧めします。 動機 この問題が興味深い理由は次のとおりです。コンピュータに辞書を検索させ、アナグラム、まったく同じ文字を含む単語のペアを見つけるのは非常に簡単です。しかし、作成されるアナグラムの多くは面白くありません。たとえば、Websterの第2国際辞書にある最長の例は次のとおりです。 胆嚢 十二指腸s造設 問題が明らかである:彼らは非常に軽いanagrammingを認めるため、これらの結果がおもしろくであることを単に交換cholecysto、duedenoおよびstomyセクション、一方2.の重量のために、このはるかに短い例では、はるかに意外で面白いです: 海岸線 断面 ここで、最も軽いアナグラムの重みは8です。 この方法を使用して、興味深いアナグラム、つまりすべてのアナグラムの重みが高いアナグラムを見つけるプログラムがあります。しかし、これは、可能なすべてのアナグラムを生成して重み付けすることでこれを行いますが、これは遅いです。

2
通常の言語が「通常」と呼ばれるのはなぜですか?
Michael Sipserによる計算理論入門の最初の章を終えたところで、有限オートマトンの基本について説明しています。 彼は、通常の言語を、有限オートマトンで記述できるものとして定義しています。しかし、私は彼が通常言語が「通常」と呼ばれる理由を説明する場所を見つけることができませんでした。この文脈における「通常」という用語の起源は何ですか? 注:私は初心者なので、簡単な言葉で説明してみてください!

2
基数ツリーとパトリシアの試行の違いは何ですか?
私は基数ツリー(別名圧縮試行)とパトリシア試行について学習していますが、実際に同じであるかどうかについて矛盾する情報を見つけています。基数ツリーは、ノードが唯一の子ノードである場合にノードをその親とマージすることにより、通常の(圧縮されていない)トライから取得できます。これはパトリシアの試みにも当てはまります。2つのデータ構造はどのように異なっていますか? たとえば、NISTは2つを同じものとしてリストします。 パトリシアツリー (データ構造) 定義:唯一の子であるノードがその親とマージされるトライのコンパクトな表現。 基数ツリーとも呼ばれます。 ウェブ上の多くの情報源は同じことを主張しています。しかし、どうやらパトリシアの試みは基数の木の特殊なケースです。ウィキペディアのエントリは言う: PATRICIAの試行は、基数が2の基数の試行です。つまり、キーの各ビットが個別に比較され、各ノードが双方向(つまり、左対右)ブランチになります。 私はこれを本当に理解していません。違いは、ルックアップを行う際の比較の方法だけですか?各ノードを「双方向ブランチ」にするにはどうすればよいですか?ALPHABET_SIZE与えられたノードに対して可能な限り多くのブランチがあるべきではありませんか? 誰かがこれを明確にすることはできますか?実用的な目的のために、基数の試行は通常、パトリシアの試行として実装されていますか?または、そのような一般化を行うことはできませんか?

2
PSPACE≠EXPTIMEであると考えるのはなぜですか?
PSPACEが一般的にEXPTIMEと異なると考えられる理由を直感的に理解するのに苦労しています。PSPACEが入力サイズ空間多項式で解ける問題の集合である場合、指数時間の爆発が大きくなり、指数空間を使用しない問題のクラスはどのようになりますか?f(n )f(n)f(n) ユバル・フィルマスの答えはすでに非常に役立ちます。しかし、誰もがそれはなぜ私の緩い引数スケッチできたかもしれない PSPACE≠EXPTIME(すなわちPSPACEはEXPTIMEの適切なサブセットではないこと)というケースもが?入力サイズで多項式的にスケーリングする空間で達成可能なシステム構成の総数の上限を超えるために、指数空間が必要ではないでしょうか?言うまでもなく、なぜEXPTIME≠EXPSPACEが未解決の問題なのかは理解できますが、PSPACEとEXPTIMEの関係については理解できません。


2
NPにはないが決定可能なNPハード問題
NP完全ではなく、決定不能ではない、理解しやすいNPハード問題の良い例があるのだろうか? たとえば、停止の問題はNP完全ではなくNPハードですが、決定できません。 これは、多項式時間ではなく、解決策を検証できる問題であることを意味すると考えています。(そうでない場合は、この文を修正してください)。

2
N未満のランダムビットで2 ^ Nの1の確率をシミュレートする
次の離散分布をシミュレートする必要があるとします。 P(X=k)={12N,1−12N,if k=1if k=0P(X=k)={12N,if k=11−12N,if k=0 P(X = k) = \begin{cases} \frac{1}{2^N}, & \text{if $k = 1$} \\ 1 - \frac{1}{2^N}, & \text{if $k = 0$} \end{cases} 最も明白な方法は、NNNランダムビットを描画し、それらすべてが000(または111)に等しいかどうかをチェックすることです。しかし、情報理論は言う S=−∑iPilogPi=−12Nlog12N−(1−12N)log(1−12N)=12Nlog2N+(1−12N)log2N2N−1→0S=−∑iPilog⁡Pi=−12Nlog⁡12N−(1−12N)log⁡(1−12N)=12Nlog⁡2N+(1−12N)log⁡2N2N−1→0 \begin{align} S & = - \sum_{i} P_i \log{P_i} \\ & = - \frac{1}{2^N} \log{\frac{1}{2^N}} - \left(1 - \frac{1}{2^N}\right) \log{\left(1 - \frac{1}{2^N}\right)} …

4
巡回セールスマン問題の解を多項式時間で検証するにはどうすればよいですか?
したがって、TSP(Travelling salesman problem)決定問題はNP completeです。 しかし、多項式時間で最適な解を見つける方法がないため、TSPの特定の解が実際に多項式時間で最適であることを検証する方法を理解できません(問題はPにないためです)? 検証が実際に多項式時間で実行できることを確認するのに役立つかもしれないものはありますか?

8
コンピューターはバイトのデータ型をどのように判断しますか?
たとえば、コンピューターが10111100RAMの特定の1バイトに保存されている場合、コンピューターはこのバイトを整数、ASCII文字、または他の何かとして解釈する方法をどのように知るのでしょうか?型データは隣接するバイトに保存されますか?(1バイトに2倍のスペースを使用する結果となるため、これは事実ではないと思います。) おそらくコンピューターはデータの種類さえ知らず、それを使用するプログラムだけが知っているのではないかと思います。私の推測では、RAMはR AMであり、したがって順次読み取られないため、特定のプログラムは特定のアドレスから情報をフェッチするようにCPUに指示し、プログラムはそれを処理する方法を定義します。これは、型キャストの必要性などのプログラミングに適しているようです。 私は正しい軌道に乗っていますか?

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