コンピュータサイエンス

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

4
関数型プログラミングで永続データ構造を使用するのはなぜですか?
関数型プログラミングでは、永続的なデータ構造と不変オブジェクトが使用されます。私の質問は、なぜこのようなデータ構造をここに持つことが重要なのですか?データ構造が永続的でない場合、どうなるかを低レベルで理解したいですか?プログラムはより頻繁にクラッシュしますか?

1
L = L(G)と表示する方法は?
正式な文法を与えることによって正式な言語を指定することは頻繁に行われます。言語を記述するだけでなく、言語を解析するため、または適切な科学を行うためにも文法が必要です。すべての場合において、手元の文法が正しいこと、つまり希望する単語を正確に生成することが重要です。 正式な証明を省略して、なぜ文法が目的の言語の適切な表現であるのかを高レベルで議論することができます。しかし、何らかの理由で疑問がある場合、または正式な証拠が必要な場合はどうでしょうか?適用できる手法は何ですか? これは参照質問になると思われます。したがって、少なくとも1つの例で説明されているが、多くの状況をカバーする、一般的で教訓的に提示された答えを与えるように注意してください。ありがとう!

1
決定論的なプッシュダウンオートマトンでコンテキストのない言語を受け入れることができるかどうかを決定する
文脈自由文法Gが与えられると、Gが受け入れる言語を正確に受け入れる非決定的プッシュダウンオートマトンNが存在します。(およびその逆) Gが受け入れる言語を正確に受け入れる決定的プッシュダウンオートマトンDも存在する場合があります。それは文法に依存します。 Gの生成に関するどのアルゴリズムによって、Dが存在するかどうかを判断できますか?


2
離散ベイジアンネットワークを効率的に格納するデータ構造の組み合わせは何ですか?
ベイジアンネットワークの背後にある理論を理解し、実際に構築するのに何が必要か疑問に思っています。この例では、100個の離散確率変数のベイジアン(有向)ネットワークがあるとします。各変数は、最大10個の値のいずれかを取ることができます。 すべてのノードをDAGに保存し、各ノードについて条件付き確率テーブル(CPT)を保存しますか?一部のCPTが変更されたときに(DAGで使用されるものとは別に)値の効率的な計算を保証するために使用する必要がある他のデータ構造はありますか?

1
グラフにエッジを追加すると、最短距離はいくつ変化しますか?
してみましょう、いくつかの完全な、加重、無向グラフとします。からエッジを1つずつ追加して、2番目のグラフを作成します。合計でエッジをに追加します。G ′ = (V 、E ′)E E ′ Θ (| V |)G ′G=(V,E)G=(V,E)G=(V,E)G′=(V,E′)G′=(V,E′)G'=(V, E')EEEE′E′E'Θ(|V|)Θ(|V|)\Theta(|V|)G′G′G' 我々は一つのエッジを追加するたびにに、我々はすべてのペア間の最短距離を考える及び。を追加した結果、これらの最短距離がいくつ変化したかを数えます。してみましょう最短距離の数も変化することを、私たちは追加したときに番目のエッジを、とlet、我々は、合計で追加エッジの数をすること。E ′(V 、E ′)(V 、E ′ ∪ { (u 、v )} )(u 、v )C i i n(u,v)(u,v)(u,v)E′E′E'(V,E′)(V,E′)(V, E')(V,E′∪{(u,v)})(V,E′∪{(u,v)})(V, E' \cup \{ (u,v) \})(u,v)(u,v)(u,v)CiCiC_iiiinnn 大きさは?C=∑iCinC=∑iCinC = \frac{\sum_i C_i}{n} 、も同様。この限界は改善できますか?は追加されたすべてのエッジの平均であると定義しているため、であることが証明されていますが、多くの距離が変化する単一のラウンドはそれほど興味深いものではありません。C = O (n 2)C C = Ω (n …

2
「自然な」決定不能な言語はありますか?
決定できない「自然な」言語はありますか? 「自然」とは、文字列のプロパティによって直接定義された言語を意味し、機械や同等のものを介してではありません。以下のような言語のルックス言い換えれば、 どこMは TMで、DFA(または正規-EXP)、PDA(または文法)、など。、そしてLはない自然。しかし、L = { x y … ∣ x はy …の接頭辞です}は自然です。L = { ⟨ M⟩ | ... }L={⟨M⟩∣…} L = \{ \langle M \rangle \mid \ldots \}MMMLLL L = { x y… ∣ x はyの接頭辞… }L={バツy…∣バツ yの接頭辞です…}L = \{xy \ldots \mid x \text{ is a prefix of y} …

1
NPI内の階層の自然な候補
と仮定しましょうP ≠ N PP≠NP\mathsf{P} \neq \mathsf{NP}。N P INPI\mathsf{NPI}は、PにもN P -hardにも属さないの問題のクラスです。N P Iであると推測される問題のリストはここにあります。N PNP\mathsf{NP}PP\mathsf{P}N PNP\mathsf{NP}N P INPI\mathsf{NPI} ラドナーの定理があればということを教えてくれるN P ≠ PNP≠P\mathsf{NP}\neq\mathsf{P}、その後の無限の階層があるN P INPI\mathsf{NPI}問題、すなわちありますN P INPI\mathsf{NPI}難しい他よりも問題N P INPI\mathsf{NPI}問題は。 私はこのような問題の候補者を探しています、つまりは、私は問題のペアに興味があります - A 、B ∈ N PA,B∈NPA,B \in \mathsf{NP}、 - AAAとBBBあることを推測されているNPINPI\mathsf{NPI}、 - AAAに削減することが知られているBBB、 -しかし、そこにありますBBBからへの既知の減少はありませんAAA。 これらをサポートするための議論がある場合はさらに良いです。例えば、複雑性理論または暗号法のいくつかの推測を仮定して、BBBが還元しないという結果がありますAAA。 任意のある自然のような問題の例は? 例:グラフ同型問題および整数因数分解問題はと推測され、これらの推測を​​サポートする引数があります。すべての意思決定の問題が難しいことが知られてこれら二つのではなく、よりがあるN Pの -hard?NPINPI\mathsf{NPI}NPNP\mathsf{NP}

2
JITコンパイラは通常のコンパイラとどう違うのですか?
Java、Ruby、Pythonなどの言語用のJITコンパイラーについては、多くの誇大宣伝がありました。JITコンパイラはC / C ++コンパイラとどのように違いますか。また、C / C ++コンパイラは単にコンパイラと呼ばれますが、Java、Ruby、またはPython用に記述されたコンパイラはなぜJITコンパイラと呼ばれますか?
22 compilers 

4
ランダムコンパレータを受け入れるソートアルゴリズム
一般的な並べ替えアルゴリズムは、通常、並べ替えるデータのセットと、2つの個別の要素を比較できる比較関数を受け取ります。コンパレータが順序関係¹の場合、アルゴリズムの出力はソートされたリスト/配列です。 私は、どのソートアルゴリズムが実際には順序関係ではないコンパレーター(特に、各比較でランダムな結果を返すもの)で動作するのか疑問に思っています。「作業」とは、ここでは、入力の順列を返し続け、常に最悪のシナリオに低下したり、無限ループに入ったり、要素が欠落したりするのではなく、通常引用された時間の複雑さで実行されることを意味します。ただし、結果の順序は定義されていません。さらに良いことに、コンパレータがコインフリップの場合、結果の順序は均一な分布になります。 私の大まかな精神的な計算から、マージソートはこれで問題なく、同じ実行時コストを維持し、公平なランダムな順序を生成するように見えます。しかし、クイックソートのようなものは退化する可能性があり、おそらく終了せず、公平ではないと思います。 ランダムコンパレータで説明されているように、他のどのソートアルゴリズム(マージソート以外)が機能しますか? 参考のために、コンパレータは、適切な関数(決定論的)であり、順序関係の公理を満たす場合、順序関係になります。 それは決定論的です。compare(a,b)特定の場合a、b常に同じ結果を返します。 推移的です: compare(a,b) and compare(b,c) implies compare( a,c ) それは反対称です compare(a,b) and compare(b,a) implies a == b (すべての入力要素が別個であると想定しているため、反射性は問題ではありません。) ランダムコンパレータは、これらのすべてのルールに違反します。ただし、順序関係ではないコンパレータはまだランダムではありません(たとえば、おそらく1つのルールに違反している可能性があり、セット内の特定の要素のみに違反している可能性があります)。

1
AVLツリーはウェイトバランスされていませんか?
前の質問では、重量バランスの取れた木の定義と赤黒木に関する質問がありました。 この質問は、AVLツリーの場合と同じ質問をすることです。 問題は、他の質問と同様にバランスのとれた木の定義を考えると、μμ\mu いくつかありますすべての大きな十分なAVL木があるように、 -balancedは?μ > 0μ>0\mu \gt 0μμ\mu AVLツリーの定義は1つだけで、あいまいさはないと思います。


3
このコードが一意にデコード可能なのはなぜですか?
ソースアルファベット:{ a 、b 、c 、d、e 、f}{a,b,c,d,e,f}\{a, b, c, d, e, f\} コードのアルファベット:{ 0 、1 }{0,1}\{0, 1\} a :0101a:0101a\colon 0101 b :1001b:1001b\colon 1001 c :10c:10c\colon 10 d:000d:000d\colon 000 e :11e:11e\colon 11 f:100f:100f\colon 100 コードを一意にデコードできるようにするには、プレフィックスが不要である必要があると思いました。しかし、このコードでは、コードワードcccは、たとえばコードワードfffのプレフィックスであるため、プレフィックスフリーではありません。しかし、私の教科書は、その逆は接頭辞なしである(私はこれを理解していない)と教えてくれます。誰かがこれが何を意味するのか、またはなぜそれが一意にデコード可能であるのかを説明できますか?クラフトの不等式を満たしていることは知っていますが、それは必要条件であり、十分条件ではありません。

2
巡回セールスマン問題は多項式時間でどのように検証可能ですか?
だから、私は決定問題が次のように定義されているという考えを理解しています コストがCよりも低いパスPはありますか? そして、受け取ったパスを確認することで、これが正しいことを簡単に確認できます。 ただし、この基準に適合するパスがない場合はどうなりますか?最適なパスTSP問題を解決せずに、「いいえ」の答えをどのように検証し、最良の問題を見つけるにはCよりもコストがかかりますか?

2
なぜ確率を掛けるよりもログの確率を速く加えるのですか?
質問を組み立てるために、コンピューターサイエンスでは、いくつかの確率の積を計算することがよくあります。 P(A,B,C) = P(A) * P(B) * P(C) 最も単純なアプローチは、単にこれらの数値を掛けることであり、それが私がやろうとしていたことです。しかし、上司は、確率のログを追加する方が良いと言いました。 log(P(A,B,C)) = log(P(A)) + log(P(B)) + log(P(C)) これにより対数確率が得られますが、必要に応じて後で確率を取得できます。 P(A,B,C) = e^log(P(A,B,C)) ログの追加は、次の2つの理由により優れていると考えられます。 確率の積が非常に小さいためゼロに丸められる「アンダーフロー」を防ぎます。多くの場合、確率は非常に小さいため、これはリスクとなります。 多くのコンピューターアーキテクチャが乗算よりも速く加算を実行できるため、高速です。 私の質問は2番目のポイントについてです。これは私がそれを説明したのを見た方法ですが、ログを取得するための追加コストを考慮していません!「ログのコスト+加算のコスト」を「乗算のコスト」と比較する必要があります。それを考慮に入れた後、それはまだ小さいですか? また、ウィキペディアのページ(Log potential)はこの点で混乱を招いており、「ログ形式への変換は高価ですが、一度しか発生しません」と述べています。追加する前にすべての用語のログを個別に取得する必要があると思うため、これは理解できません。私は何が欠けていますか? 最後に、「コンピューターは乗算よりも加算を高速に実行する」という正当性は曖昧です。それはx86命令セットに固有のものですか、それともプロセッサアーキテクチャのより基本的な特性ですか?

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