コンピュータサイエンス

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

2
このプログラムは整数ごとに終了しますか?
GATE準備のパートテストでは、次の質問がありました。 f(n): if n is even: f(n) = n/2 else f(n) = f(f(n-1)) 「すべての整数で終了します」と答えました。なぜなら、いくつかの負の整数であっても、Stack Overflow Errorとして終了するからです。 しかし、私の友人は、これは実装されたコードではなく、単なる擬似コードであるため、いくつかの負の整数の場合は無限再帰になると反対しました。 正しい答えとその理由は?

2
スタックベースのプログラミング言語を同時に実行することはできますか?
FORTHやCatなどのスタックベースのプログラミング言語について読んでいますが、その性質を考えると、パラダイムに関係なく、一度に1つのアクションしか実行できないようです(FORTHは必須ですが、Catは機能的です)。 命令型言語はスタックを変更し、Joyなどの純粋に機能的な言語は新しいスタックを返しますが、ポイントは一度に1つのスタックのみが使用されることです。 それでは、スタックベースのプログラミング言語は並行することができますか?複数のスタックを同時に使用するなどして、並行性を実現できますか? スタックベースのプログラミング言語で遅延評価を実装することは可能ですか? 上記の言語と概念について誤解している場合は修正してください

1
仮想アドレス空間が物理アドレス空間よりも大きい場合、アドレスマッピングはどのようにメモリに保存されますか?
40の物理アドレスビットを持つシステムで作業しているとしましょう。合計物理アドレス空間(バイトアドレス可能なメモリを想定)はバイト、または1 TiBです。また、仮想アドレスの長さが48ビットの場合、物理メモリ内の場所よりも多くのアドレスが仮想メモリで使用できることを意味します。2402402^{40} 「過剰な」アドレスはハードディスクの場所も参照する可能性があるため、これは理にかなっています。しかし、私が理解していないのは、仮想アドレスと物理アドレス間の変換がどのように行われるかです。VASの場所を物理的な場所にリンクするマッピングがどこかに格納されていると思います。物理的な場所よりも多くの仮想アドレスの場所がある場合、これらすべてのマッピングをメモリに保存するにはどうすればよいですか?少なくとも、各仮想アドレスを格納するために48ビットが必要であり、次に、マップ先の物理的な場所を格納するためにさらに40ビットが必要です。すべての場所をマッピングすると、物理メモリ自体よりも多くのメモリが必要になるため、明らかに、各仮想アドレスの対応する物理アドレスへの1:1マッピングを保存することはできません。 ここで正確に何が欠けていますか?

2
ラムダ計算における未知の関数の関数方程式を解く
ラムダ計算の未知の関数の関数方程式を解く技術はありますか? 私はそのように拡張的に定義されたアイデンティティ関数を持っていると仮定します: Ix=x私バツ=バツI x = x (つまり、その関数の予想される振る舞いの方程式を書き留めることによって)そして、その関数の内包的な式を取得するために、代数変換を行うによってそれを解決したい:I私I I=λx.x私=λバツ。バツI = \lambda x.x これは、関数がどのように期待どおりに動作するか(つまり、ラムダ計算でどのように実装するか)を示しています。 もちろん、アイデンティティ関数は単なる例として使用されます。このような方程式を解くより一般的な方法に興味があります。特に、次の要件を満たす関数を見つけたいと思います。BBB Bf(λx.M)=(λx.fM)Bf(λバツ。M)=(λバツ。fM)B\;f\;(\lambda x.M) = (\lambda x.f M) それは、「注入」は、所与の関数であり、所与ラムダ関数に(λ X 。M )の「ボディ」の前にMのでこと、おそらくは離れてそれを取って、新しいものを構築することによって、(いくつかの任意のラムダ式です)関数fが適用されるパラメーターになりました。fff(λx.M)(λバツ。M)(\lambda x.M)MMMfff

1
数学のトピックまたはコンピュータープログラミングの習熟度を高める分野ですか?[閉まっている]
閉じた。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集して事実と引用で答えられるように質問を更新してください。 2年前に閉店。 一般に、数学者であるか、数学の背景を持つコンピュータープログラマーは、アルゴリズムとコンピュータープログラミング全般に関して非常に優れています。 私が言っていないこと: 優れたコンピュータープログラマーになるには数学が必要です。プログラミングには数学が必要です。優秀な数学者は優秀なプログラマーであり、その逆も同様です。 私が言っていること 数学を学びたいと思うのは、それが私をより良いプログラマーにすると信じているからです。数学のどの分野/トピックが私がより良いプログラマーになるのに役立ちますか?フォームの回答をmath topic - corresponding cs area歓迎します。 注意:トピック外と宣言されたStackOverflowでこれを尋ねました。暇なときに、コンピュータープログラミングでやっていた方法でそれを学びたいです。前もって感謝します。


7
NFAが非決定的と呼ばれるのはなぜですか?
この[おかしい]質問を念頭に置いています。入力の遷移を定義するときに、非決定的有限オートマトンが非決定的と呼ばれるのはなぜですか。まあ、複数のイプシロン遷移がありますが、それらは定義されています。つまり、マシンはそれらの遷移に対して決定論的です。つまり、決定論的です。

2
consのどのプロパティにより、末尾再帰モジュロconsを排除できますか?
私は、基本的な末尾再帰除去の考え方に精通しています。そこでは、呼び出し自体の直接の結果を返す関数を反復ループとして書き直すことができます。 foo(...): # ... return foo(...) また、特別な場合として、再帰呼び出しがの呼び出しでラップされている場合、関数を書き換えることができることも理解していconsます。 foo(...): # ... return (..., foo(...)) これをcons許可するプロパティは何ですか?cons再帰的な末尾呼び出しを繰り返し書き換える能力を損なうことなく折り返すことができる以外の機能は何ですか? GCC(Clangではない)は、この「末尾再帰モジュロ乗算」の例を最適化できますが、どのメカニズムがこれを発見できるのか、またはどのように変換するのかは不明です。 pow(x, n): if n == 0: return 1 else if n == 1: return x else: return x * pow(x, n-1)

3
配列なしのメモ化
Cormen et al。の「アルゴリズムの概要」のセクション15.3 動的プログラミングの要素では、メモ化について次のように説明しています。 メモ化された再帰アルゴリズムは、各サブ問題の解決策のエントリをテーブルに保持します。各テーブルエントリには、エントリがまだ入力されていないことを示す特別な値が最初に含まれています。再帰アルゴリズムが展開するときにサブ問題に最初に遭遇すると、その解が計算されてテーブルに保存されます。このサブ問題に遭遇するたびに、テーブルに保存されている値を検索して返します。 さらに、脚注として追加します。 このアプローチでは、考えられるすべてのサブ問題パラメーターのセットがわかっていること、およびテーブルの位置とサブ問題の間の関係が確立されていることを前提としています。別のより一般的なアプローチは、サブ問題パラメーターをキーとしてハッシュを使用してメモすることです。 メモした値を(多次元)配列ではなく辞書に保存する必要がある(または簡単にする)よく知られているDPの問題はありますか? 背景:これが何らかの用途であれば、この質問の理由は、動的プログラミングを見たばかりの人に(自己均衡型)バイナリ検索ツリーの概念を動機付けようとしているからです。

2
空の文字列のλの起源は何ですか?
私は通常、空の文字列(空の単語または空の文字列)にシンボルを使用します。しかし、一部の人々は代わりにを使用することを知っています。λ εεε\varepsilonλλ\lambdaεε\varepsilon は「空」という言葉から派生したと思います。ただし、起源はわかりません。λεε\varepsilonλλ\lambda オートマトン理論には、オートマトンのイプシロン遷移があり、ラムダ遷移とも呼ばれます。たとえば、JFLAPソフトウェアは、デフォルトでイプシロン遷移のラベルにを使用します。λλ\lambda オリジンをグーグルで検索してcs.stackexchangeを検索しましたが、見つかりませんでした。誰もこれを説明するリファレンスを知っていますか?

5
要素の最大のセットを見つける方法
アルゴリズムに問題があります。 TTTnnnSSSTTTA ∈ Sa∈Sa\in Sa⩾|S|a⩾|S|a\geqslant |S| 例えば: 場合 = [1、3、4、1、3、6]、その後、、[3,3]、[6]又は[3、4、6]又は[4、3、6]とすることができます。STTTSSS で = [7,5、1、1,7、4]、次いで [7、5,7、4]です。STTTSSS この再帰関数を試しました。 function(T): if minimum(T) >= length(T): return T else: return function(T\minimum(T)) 非再帰的なアルゴリズムはありますか?(再帰アルゴリズムをチェックしなかったため、いくつかの欠陥がある可能性があります。)

2
意味論的意味論では操作上の意味論ではできない質問に答えることができますか?
プログラミング言語を定義するための操作上のセマンティクス(小さなステップと大きなステップの両方)に精通しています。表記法のセマンティクスの学習にも興味がありますが、努力する価値があるかどうかはわかりません。異なる視点から同じ教材を学習しているだけでしょうか、それとも表示的意味論を理解することからしか得られない洞察はありますか?

1
難しい決定問題の数え方が自動的に難しくないのはなぜですか?
2-SATがPにあることはよく知られています。しかし、特定の2-SAT式の解の数を数えること、つまり#2-SATが#P-hardであることは非常に興味深いようです。つまり、決定は簡単ですが、カウントは難しい問題の例があります。 しかし、任意のNP完全問題(3-COLなど)を考えてください。カウントバリアントの硬さについてすぐに説明できますか? 本当に私が求めているのは、なぜ難しい決定問題のカウントバリアントが#P-hardであることを示すために別の証拠が必要なのですか?(ソリューションの数を保持するためのpar約的な削減などがあります)。つまり、カウントの問題が簡単であれば、決定の問題も自動的に解決できるということです。それでは、どうして難しくないのでしょうか?(OK、多分難しいかもしれませんが、ハードの定義はわかりません)。

2
バイナリ検索と補間検索の組み合わせの背後にある研究や理論はありますか?
私は読んで、このアルゴリズムはまだバイナリ検索アルゴリズムとみなすことができるの?数年前、ログファイルのインデクサー/検索を作成して、日付/時刻ウィンドウごとに大きなプレーンテキストファイル内のログエントリを見つけることを思い出しました。 これをしている間、私は補間検索を試すことにしました(それがそれが何であるかわからなかったので、自分でアイデアを見つけました)。その後、何らかの理由で、補間ステップとバイナリ分割ステップを交互に行うというアイデアを続けました。ステップ0では、テストポイントを決定するために補間し、ステップ1では正確な中間点などを取得します。 次に、純粋な補間検索、純粋なバイナリ検索、および組み合わせの試行を使用して、システムのベンチマークを行いました。交互アプローチは、時間とランダムに選択された時間のセットを見つける前に必要なテストの数の両方で明確な勝者でした。 リンクされた質問に触発されて、「代替補間検索とバイナリ検索」をすばやく検索したところ、何も見つかりませんでした。答えの1つに対するコメントで示唆されているように、「ヘッジ補間検索」も試しました。 既知のものにつまずいたことがありますか?特定の種類のデータに対して高速であるという理論的な正当性はありますか?通常、ログファイルはその間は大きく(たとえば、検索する1,000万行の1-2 GBのテキスト)、その中の日付/時間の広がりは、アクティビティの激しいバースト、一般的なピーク時間、および静かな時間で複雑でした。私のベンチマークテストは、検出するターゲット時間の均等な分布からサンプリングしました。

2
NANDゲートとチューリング完全性との接続
NANDゲートを使用して、すべての真理値表を実装する回路を作成できること、そして最新のコンピューターはNANDゲートで構築されていることを知っています。NANDゲートとチューリング完全性の間の理論的なリンクは何ですか?NANDゲート回路は、チューリングマシンよりも有限オートマトンに近いように思えます。私の直感では、フリップフロップを構築できるため、NANDゲートからレジスタとメモリを構築でき、無限メモリはチューリング完全システムの重要な特性です。もっと理論的または数学的な説明、または何を読むべきかの指針を探しています。

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