コンピュータサイエンス

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

3
レイトレーシングとオブジェクトベースのレンダリング
通常、イントログラフィックコースには、シーンをレンダリングするレイトレーサーを構築するように求めるプロジェクトがあります。大学院に入学する多くのグラフィックス学生は、レイトレーシングに取り組みたいと言っています。それでも、レイトレーシングはSIGGRAPHなどの会場ではデッドフィールドのようです。 レイトレーシングは、必要なすべての照明などを使用してシーンを正確にレンダリングするための本当に最良の方法ですか?また、レイトレーサーのパフォーマンスが低下する(非インタラクティブな読み取り)だけで、面白くなりますか?
19 graphics 

1
配列の初期化を保存する
私は最近、初期化する必要のない配列を持つことができる、つまり、各メンバーをデフォルト値に設定しようとする時間を費やすことなく使用できることを読みました。つまり、初期化せずにデフォルト値で初期化されたかのように配列の使用を開始できます。(申し訳ありませんが、これをどこで読んだか覚えていません)。 たとえば、なぜそれが驚くべきことなのかについて: 範囲の整数の最悪のケースハッシュテーブル(各挿入/削除/検索用)をモデル化しようとしているとします 。O(1)O(1)\mathcal{O}(1)[1,n2][1,n2][1, n^2] サイズビットの配列を割り当て、個々のビットを使用してハッシュテーブル内の整数の存在を表すことができます。注:メモリの割り当てはO(1 )時間と見なされます。n2n2n^2O(1)O(1)\mathcal{O}(1) これで、この配列をまったく初期化する必要がなかった場合、このハッシュテーブルでの操作のシーケンスは、最悪の場合O(n )になります。nnnO(n)O(n)\mathcal{O}(n) したがって、実際には、「完全な」ハッシュ実装があります。これは、操作に対して Θ (n 2)スペースを使用しますが、O(n )時間で実行されます。nnnΘ(n2)Θ(n2)\Theta(n^2)O(n)O(n)\mathcal{O}(n) 通常、ランタイムは少なくともスペース使用量と同じくらい悪いことが予想されます! 注:上記の例は、スパースセットまたはスパースマトリックスの実装に使用される可能性があるため、理論的に興味深いだけではありません。 質問は次のとおりです。 初期化ステップをスキップできるデータ構造のような配列を持つことはどのように可能ですか?

1
3SATからハミルトニアンパス問題への簡単な削減
Sipserの著書「計算理論の紹介」の286ページに、3SATからハミルトニアンパス問題への縮小があります。 より簡単な削減はありますか? 簡単に言うと、(学生にとって)理解しやすい削減を意味します。 変数の線形数を使用する削減はありますか? Sipserの削減では、変数を使用します。ここで、kは節の数、nは変数の数です。つまり、サイズをsからO (s 2)に縮小することができます。縮小の出力のサイズが入力のサイズに対して線形である単純な縮小がありますか?O (k n )O(kn)O(kn)kkknnnsssO (s2)O(s2)O(s^2) それが不可能な場合、理由はありますか?それは、複雑さ/アルゴリズムの未知の結果を意味しますか?

3
すべての計算可能な関数
すべての計算可能な関数についてfff、Θ(f(n))Θ(f(n))\Theta(f(n))時間で最大で解決できる問題が存在するか、またはO (f (n ))で解決できるすべての問題ができるような計算可能な関数がありますo (f (n ))時間で解けるか?fffO(f(n))O(f(n))O(f(n))o(f(n))o(f(n))o(f(n)) この質問は昨日私の頭に浮かびました。少し前から考えていましたが、理解できません。どうやってこれをグーグルで検索するかわからないので、ここで質問します。ここに私が思いついたものがあります: 私の最初の考えは答えがイエスだということでした:すべての計算可能な関数についてfff、問題「出力f(n)f(n)f(n)ドット」(またはf(n)f(n)f(n)ドットなどで文字列を作成する)は明らかにo(f(n))o(f(n))o(f(n))時間。したがって、O(f(n))O(f(n))O(f(n))時間で解けることを示す必要があります。問題ありません。次の擬似コードを使用してください。 x = f(n) for i from 1 to x: output(".") 明らかに、このアルゴリズムは前述の問題を解決します。そして、ランタイムは明らかにΘ(f(n))Θ(f(n))\Theta(f(n))なので、問題は解決しました。簡単でしたね?いいえを除いて、最初の行のコストを考慮する必要があるからではありません。上記のアルゴリズムの実行時のみであるΘ(f(n))Θ(f(n))\Theta(f(n))を計算するために必要な時間あればf(n)f(n)f(n)であるO(f(n))O(f(n))O(f(n))。明らかに、すべての機能1に当てはまるわけではありません。 そのため、このアプローチでは私はどこにも行きませんでした。これを適切に理解するために正しい方向に私を指し示している人に感謝します。 1例として機能するために検討して。明らかにO (p (n ))= O (1 )ですが、時間でpを計算するアルゴリズムはありません。p(n)={12if n is primeotherwisep(n)={1if n is prime2otherwisep(n) = \cases{1 & \text{if $n$ is prime} \\ 2 & \text{otherwise}}O(p(n))=O(1)O(p(n))=O(1)O(p(n)) = O(1)pppO(1)O(1)O(1)

2
ユニパシーグラフはいくつのエッジを持つことができますか?
ユニパシーグラフは、1つの頂点から他の頂点への単純なパスが最大1つであるような有向グラフです。 ユニパシーグラフにはサイクルがあります。たとえば、二重にリンクされたリスト(円形のリストではありません!)は単一パスのグラフです。リストに要素がある場合、グラフには長さ2のサイクル、合計ます。nnnn−1n−1n-12(n−1)2(n−1)2(n-1) 個の頂点を持つユニパシーグラフのエッジの最大数はいくつですか?漸近的な境界があります(例:または)。O (n )Θ (n 2)nnnO(n)O(n)O(n)Θ(n2)Θ(n2)\Theta(n^2) 計量された単一経路グラフで最短経路を見つけることに触発されました。で、私の証明、私は当初、エッジの数があったと主張したかったが、その後のサイクル数を境界とすることは十分であったことに気づきました。O(n)O(n)O(n)

3
タイプ 'a->' bのML関数
私たちの教授は、型を持つOCamlの関数を考えるように頼みました。 'a -> 'b つまり、何でもかまいませんが、異なるものを返すことができる1つの引数の関数です。 raise引数を無視する関数で使用することを考えました: let f x = raise Exit しかし、教授は、標準ライブラリの機能を必要としないソリューションがあると述べました。私は混乱'bしています。最初に持っていない場合、どうやって作ることができますか? 何が起こっているのかを理解したいので、スタックオーバーフローではなくここで質問しています。説明のないプログラムを見たくありません。

3
ド・モーガンの法則を説明し理解する直観的な方法は何ですか?
De Morganの法則は、コンピューターサイエンスコースの入門数学でしばしば導入されます。用語を否定することで、ステートメントをANDからORに変換する方法としてよく見ます。 真理値表を覚えているだけでなく、これが機能する理由について、より直感的な説明はありますか?私にとってこれは黒魔術を使うようなもので、数学的にあまり傾いていない人にとって意味があるようにこれを説明するより良い方法は何ですか?

2
型検査アルゴリズム
型チェックアルゴリズムに関する個人の書誌研究を始めていますが、いくつかのヒントが必要です。最も一般的に使用されるタイプチェックアルゴリズム、戦略、および一般的な手法は何ですか? 特に、C ++、Java 5 +、Scalaなどの広く知られている強力な静的型付け言語で実装された複雑な型チェックアルゴリズムに興味があります。IE、基礎となる言語(Java 1.4以下など)の非常に単純なタイピングのために非常に単純ではないタイプチェックアルゴリズム。 私は、X、Y、またはZの特定の言語自体には興味がありません。ターゲット言語に関係なく、型チェックアルゴリズムに興味があります。「聞いたことのない言語Lで強く型付けされており、型付けが複雑な言語には、アルゴリズムZを使用してXとYをチェックすることでA、B、Cを実行する型チェックアルゴリズムがあります」または「 Scalaで使用されるストラテジーXとY、およびC#で使用されるAのバリアントZは、R、S、Tの機能がそのように機能するためクールです」と答えがあります。

4
TCSを理解する上で立ち往生するための戦略
私は大学院生であり、計算理論のコースを受講しており、求められるとコンテンツを作成するのが大変です。教科書(マイケル・シプサーによる計算理論入門)と講義をフォローできます。しかし、何かを証明するか、特定のTMの正式な説明を考え出すように求められたとき、私はただ窒息します。 そのような状況で私は何ができますか?私の問題は、抽象概念を実際に使用できる程度まで完全に理解することだと思います。新しい抽象的な概念にアプローチし、最終的に直感を構築するための構造化された方法はありますか?

4
協調スケジューリングは、I / O操作を実行するときにプロセスを一時停止しますか?
多くのオペレーティングシステムのリファレンスでは、協調的な(プリエンプティブとは対照的な)マルチタスクでは、プロセスがCPUを明示的に自発的に中断するまで保持します。実行中のプロセスがすぐに満たされないI / O要求を実行する(たとえば、まだ利用できないキーストロークを要求する)場合、スケジューラはそれを中断しますか、それとも要求が処理されるまでCPUを本当に保持しますか? [「I / Oのブロック」を「すぐに満たすことができないI / O要求を実行する」に置き換えるように編集しました。]

2
「差分」操作は、「結合」をすでに含むクエリ言語に表現力を追加しますか?
集合差演算子(たとえば、EXCEPT一部のSQLバリアント)は、関係代数の多くの基本的な演算子の1つです。ただし、差集合演算子を直接サポートしていないデータベースもありますがLEFT JOIN(外部結合の一種)、実際には同じ効果を得るために差集合操作の代わりにこれを使用できます。 これは、LEFT JOIN演算子が維持されている限り、クエリ言語の表現力が集合差演算子がなくても同じであることを意味しますか?この事実をどのように証明しますか?

5
動的プログラミングの事例の区別:例が必要です!
私はしばらくの間、動的プログラミングに取り組んできました。動的プログラミングの再帰を評価する標準的な方法は、必要なすべての値のテーブルを作成し、行ごとに入力することです。たとえば、Cormen、Leiserson et al: "Introduction to Algorithms"を参照してください。 2次元のテーブルベースの計算スキーム(行ごとの塗りつぶし)に焦点を当て、セルの依存関係の構造、つまり、別のセルを計算する前にどのセルを実行する必要があるかを調べます。セルiが依存するセルのインデックスのセットを示します。Γはサイクルフリーである必要があることに注意してください。Γ(i)Γ(i)\Gamma(\mathbf{i})ii\mathbf{i}ΓΓ\Gamma 計算された実際の関数から抽象化し、その再帰構造に集中します。正式には、次の形式の場合、繰り返しは動的プログラミングであると考えます。ddd d(i)=f(i,Γ˜d(i))d(i)=f(i,Γ~d(i))\qquad d(\mathbf{i}) = f(\mathbf{i}, \widetilde{\Gamma}_d(\mathbf{i})) 、〜Γ D(I)= { (J、D (J))| J ∈ Γ D(I)}とFしないいくつかの(計算)関数使用D経由以外の〜Γの dは。i∈[0…m]×[0…n]i∈[0…m]×[0…n]\mathbf{i} \in [0\dots m] \times [0\dots n]Γ˜d(i)={(j,d(j))∣j∈Γd(i)}Γ~d(i)={(j,d(j))∣j∈Γd(i)}\widetilde{\Gamma}_d(\mathbf{i}) = \{(\mathbf{j},d(\mathbf{j})) \mid \mathbf{j} \in \Gamma_d(\mathbf{i}) \}fffdddΓ˜dΓ~d\widetilde{\Gamma}_d 粒度制限すると(現在のセルの左、左上、上、右上、...に)粗い部分に1が有効の3例(アップ対称性及び回転)は、本質的に存在していることを観察しますテーブルへの入力方法を通知する動的プログラミングの再帰:ΓdΓd\Gamma_d 赤い領域は(過剰近似)を示します。ケース1と2はサブセットを認め、ケース3は最悪の場合です(インデックス変換まで)。赤い領域全体がΓで覆われている必要はないことに注意してください。テーブルのすべての赤い部分の一部のセルは、それを赤く塗るのに十分です。白い領域には、必要なセルが含まれないようにする必要があります。ΓΓ\GammaΓΓ\Gamma ケース1の例は、編集距離と最長共通サブシーケンスであり、ケース2はBellman&FordおよびCYKに適用されます。あまり明らかではない例には、提案されたケースに合うように回転できるため、行(または列)ではなく対角線で機能するものが含まれます。例については、ジョーの回答を参照してください。 ただし、ケース3の(自然な)例はありません!だから私の質問は:ケース3の動的プログラミングの再帰/問題の例は何ですか?

6
動的プログラミングとブルートフォースの違い
次の引用に出会ったとき、私はダイナミックプログラミングを読んでいました 動的プログラミングアルゴリズムは、問題を解決するために考えられるすべての方法を調べ、最適なソリューションを選択します。したがって、ダイナミックプログラミングは、インテリジェントなブルートフォースの方法であるとおおまかに考えることができます。これにより、考えられるすべてのソリューションを選択して、最良のソリューションを選択できます。問題の範囲がすべての可能なソリューションを通過することが可能であり、十分に高速である場合、動的プログラミングは最適なソリューションを見つけることを保証します 次の例を示しました たとえば、ラッシュアワー中に特定の都市で、できるだけ早くポイントAからポイントBに移動しなければならないとしましょう。ダイナミックプログラミングアルゴリズムは、トラフィックレポート全体を調べて、考えられるすべての道路の組み合わせを調べて、どちらの方法が最も速いかを示します。もちろん、アルゴリズムが終了するまでしばらく待たなければならない場合があり、そうして初めて運転を開始できます。あなたが進む道は最速のものになります(外部環境で何も変わらないと仮定すると) ブルートフォースは、最善の解決策を決定する前に、考えられるあらゆる解決策を試みています。 それがまたあればどのように動的ブルートフォースは異なるプログラミングされて最適なものを選ぶ前に、すべての可能な解決策を通過し、私が見る唯一の違いは、動的プログラミングは、アカウントに追加の要因(この場合は交通状況を)取ることです。 動的計画法はブルートフォース法のサブセットであると言ってもいいですか?

4
セット交差点のデータ構造?
次の操作をサポートするセットの集合を保持するデータ構造はありますか?準線形の実行時間はありがたいですか? 空のセットを初期化します。 セットに要素を追加します。 2つのセットを指定して、それらが交差するかどうかを報告します。


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