コンピュータサイエンス

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

1
CNFからDNFへの変換がNPハードであることの証明
この質問は、Computer Science Stack Exchangeで回答できるため、Stack Overflowから移行されました。 7年前に移行され ました。 CNFからDNFへの変換がNPハードであることをどのように証明できますか? 私は答えを求めているのではなく、それを証明する方法についていくつかの提案をしています。

1
コルモゴロフ複雑性定義の同等性
Kolmogorov-Complexityを定義するには多くの方法があり、通常、これらすべての定義は加法定数まで同等です。場合であることをK 1K1K_1及びK 2は、K2K_2コルモゴロフ複雑機能である(別の言語又はモデルを介して定義された)、その後一定存在Cccようにそのすべての文字列のためのXxx、| K 1(x )− K 2(x )| &lt; c|K1(x)−K2(x)|&lt;c|K_1(x) - K_2(x)| < c。これは、すべてのコルモゴロフ複雑度関数KKKおよびxごとにxx、K (x )≤ | x | + c(定数 cの場合)。K(x)≤|x|+cK(x) \le |x| +ccc チューリングマシンに基づいたKの次の定義に興味がありますKK 状態の数:q状態のTMが空の文字列でxを出力するように、K 1(x )を最小数qとして定義します。K1(x)K_1(x)qqqqxx プログラムの長さ:定義:K 2(xは)出力がその最短「プログラム」されるようにxは。つまり、TMをバイナリ文字列にエンコードする方法を修正します。マシンのMは、のようにコードの(バイナリ)を示す⟨ M ⟩。 K 2(x )= 分| ⟨ M ⟩ | ここで、最小値は、空の入力でxを出力するすべてのMのものです。K2(x)K_2(x)xxMM⟨M⟩\langle M \rangleK2(x)=min|⟨M⟩|K_2(x) = \min |\langle M \rangle|MMxx …

3
キャプチャするSQLの拡張
Immermanによると、SQLクエリに関連付けられた複雑度クラスは、(一次クエリとカウント演算子)の安全なクエリのクラスです。SQLは安全なクエリをキャプチャします。(換言すれば、すべてのSQLクエリはで複雑性を有する、そして内のすべての問題 SQLクエリとして表現することができます。)Q (F O (C O U N T ))Q (F O (C O U N T )))Q (F O (C O U N T ))Q(FO(COUNT))\mathsf{Q(FO(COUNT))}Q (F O (C O U N T ))Q(FO(COUNT))\mathsf{Q(FO(COUNT))}Q (F O (C O U N T ))Q(FO(COUNT))\mathsf{Q(FO(COUNT))} この結果に基づいて、理論的な観点から、効率的に解決できるがSQLでは表現できない興味深い問題が数多くあります。したがって、まだ効率的なSQLの拡張は興味深いようです。だからここに私の質問があります: をキャプチャするSQLの拡張機能(業界で実装および使用)があり(つまり、すべての多項式時間の計算可能なクエリを表現でき、他のクエリは表現できません)。PP\mathsf{P} 3つの条件をすべて満たすデータベースクエリ言語が必要です。SQLを拡張してをキャプチャする拡張機能を定義するのは簡単です。しかし私の質問は、そのような言語が実際的な観点から理にかなっているかどうかであるので、実際に使用されている言語が欲しいです。これが当てはまらず、そのような言語がない場合、実用的な観点からそのような言語を面白くしない理由があるかどうかを知りたいですか?たとえば、実際に発生するクエリは、通常、そのような言語を必要としないほど単純ですか?PP\mathsf{P}

2
ユニバーサルタイプは、実存タイプのサブタイプ、または特別な場合ですか?
この質問は、Computer Science Stack Exchangeで回答できるため、Software Engineering Stack Exchangeから移行されました。 7年前に移行され ました。 Iは、普遍的に定量タイプかどうかを知りたい:T = ∀ X :{ ∈ X 、F :X → { T 、Fは} }、存在、定量化を、サブタイプ、又は特別なケースでありますタイプTのEを同じ署名で:TのE = ∃ X :{ ∈ X 、F :X → { T 、F } }TaTaT_aTa=∀X:{a∈X,f:X→{T,F}}Ta=∀X:{a∈X,f:X→{T,F}}T_a = \forall X: \left\{ a\in X,f:X→\{T, F\} \right\}TeTeT_eTe=∃X:{a∈X,f:X→{T,F}}Te=∃X:{a∈X,f:X→{T,F}}T_e = \exists X: \left\{ a\in …

7
P≠NPの証明は、P = NPの証明より難しいでしょうか?
P対NP問題の2つの可能性を検討してください:P = NPおよびP NP。≠≠\neq Qを既知のNPハード問題の1つとします。P = NPを証明するには、Qに対して単一の多項式時間アルゴリズムAを設計し、AがQを正しく解くことを証明する必要があります。 P NP を証明するには、Qを解く多項式時間アルゴリズムがないことを示す必要があり ます。つまり、すべての多項式時間アルゴリズムを除外する必要があります。≠≠\neq これは2番目のタスクをより困難なものにするという人々の意見を聞いたことがあります(本当に真実だと仮定して)。 証明P = NPがPを証明するよりも容易になるだろう(P = NPがあると仮定)と考える理由がある NPが(Pと仮定すると、 NP)?≠≠≠\neq≠≠\neq

2
最大フロー計算または他のアプリケーションのために、実際にリンクカットツリーは使用されていますか?
私がよく実装する多くの最大フローアルゴリズム、ダイニックのアルゴリズム、プッシュ再ラベルなどでは、動的ツリー(リンクカットツリーとも呼ばれます)を使用することで漸近的な時間コストを改善できます。 プッシュ再ラベルは、通常またはまたはますが、動的ツリーO (V 3)O (V 2 √O (V2E)O(V2E)O(V^2E)O (V3)O(V3)O(V^3)O(VElog(V2/E))O (V2E−−√)O(V2E)O(V^2\sqrt{E})O (VEログ(V2/ E))O(VElog⁡(V2/E))O(VE \log(V^2/E)) Dinicのアルゴリズムはで実行されますが、動的ツリーO (V E log (V ))O (V2E)O(V2E)O(V^2E)O (VEログ(V))O(VElog⁡(V))O(VE\log(V)) ただし、ほとんどのライブラリでのmax-flowアルゴリズムの実用的な実装では、このデータ構造を使用していないようです。ダイナミックツリーは、実際には最大フロー計算に使用されていますか?または、実際の問題のサイズに役立つにはオーバーヘッドが大きすぎますか? リンクカットツリーが使用される他の問題ドメインはありますか? この質問は、cstheoryで私が尋ねた質問に関連しています。最先端のMaximum Flowアルゴリズムは実用的ですか?

7
浮動小数点表現が負の数を示すために2の補数ではなく符号ビットを使用する理由
浮動小数点数の縮退したケースと見なすことができる固定小数点表現を検討してください。負の数に2の補数を使用することは完全に可能です。しかし、浮動小数点数に符号ビットが必要なのはなぜですか。仮数ビットが2の補数を使用してはいけませんか? また、指数ビットは、符号付きの大きさの表現(仮数ビットに類似)や2の補数表現の代わりにバイアスを使用するのはなぜですか? 更新:明確にしないとすみません。浮動小数点表現がどのように形作られるのかの理由を探していました。選択肢間に強力な実装のトレードオフがない場合、誰かが浮動小数点表現の歴史的な側面を説明できますか?

7
Big Oで定数因子を無視する理由
多くの場合、複雑性に3nなどの定数がある場合、この定数を無視し、O(3n)ではなくO(n)と言います。このような3倍の変化をどうすれば無視できるのか理解できません。あるものは他のものよりも3倍速く変化しています!なぜこの事実を無視するのですか?

1
疎グラフの周囲を見つけるための最適なアルゴリズム?
疎な無向グラフの周囲をどのように見つけるか疑問に思います。スパースとは。最適とは、時間の複雑さが最も低いことを意味します。|E|=O(|V|)|E|=O(|V|)|E|=O(|V|) 無向グラフのためのTarjanのアルゴリズムの変更について考えましたが、良い結果が見つかりませんでした。実際、で2連結成分を見つけることができれば、最初の部分から達成できる何らかの誘導により、胴回りを見つけることができると考えました。ただし、間違った方向に進んでいる可能性があります。Θ (| V | 2)(つまりo (| V | 2))よりも漸近的に優れたアルゴリズムを歓迎します。O(|V|)O(|V|)O(|V|)Θ(|V|2)Θ(|V|2)\Theta(|V|^2)o(|V|2)o(|V|2)o(|V|^2)

4
一般的にどのスレッドが共有しますか?
さて、これは一般的な質問です。そして、もし誰かがそれを実装固有にしたいなら、私はUnix関連のものを好むでしょう。しかし、まず一般的に次の問題を知る必要があります。 私は単一のプロセスが複数のスレッドを持つことができると読みました。同じプロセスの複数のスレッドは、それらの間で物事を共有します。彼らが何を共有し、何を共有していないのか知りたい。プロセスがアドレス空間、スタック、ヒープ、グローバル変数、コード、データ、OSリソースで構成されていることを考慮して、スレッド間で共有されるものは何ですか?私は次の推測を持っています: グローバル変数-スレッド共有グローバル変数を読み取りました。また、JavaとC#でプログラミングしているときに、クラスレベルの変数を共有するスレッドを作成しました。したがって、スレッドはグローバル変数を共有すると信じています(ただし、高レベルのプログラミング言語の概念がそのまま低オペレーティングシステムレベルの事実に変換されるかどうかはわかりません)。 ヒープ-グローバル変数はヒープに格納されるため、ヒープはスレッド間で共有されます。 スタック-各スレッドは独自の実行シーケンス/コードを持つことができるため、プログラムカウンターの内容をプッシュ/ポップする独自のスタックを持っている必要があります(関数呼び出しと戻りが発生した場合)。したがって、同じプロセスのスレッドはスタックを共有しません。 今、私は次のものの共有について確信が持てない アドレス空間-アドレス空間で何が正確にカウントされるのかわからない。しかし、アドレス空間は一般的にスレッドではなくプロセスのコンテキストで使用されると思います。また、同じプロセスのすべてのスレッドは親プロセスと同じアドレス空間に存在するため、スレッドはアドレス空間を共有すると言われています。(しかし、それらは同じアドレス空間内で異なるスタックを維持しますか?) OSリソース-これは非常に実装固有であると思います。たとえば、親プロセスは、すべてではなくそのスレッドの一部に同じファイルのハンドルを選択的に与えることができます。または私は誤解しており、OSリソースはファイル以外のものを意味しますか? コード-スレッドは異なるコードを持つことができるため、コードの共有が常に当てはまるわけではありません。 データ-データの下で何を考慮すべきかわからない。ただし、グローバル変数がスレッド間で共有されていることを確認してください。そして、ローカル変数が同様に共有されていないことを確認してください。 全体的に、あいまいな用語、オペレーティングシステムの書籍で行われている超一般化、およびオンラインで提供される実装固有の詳細により、かなり混乱しています。だから私は私を満足させることができるいくつかの答えを見つけようとしています。


7
時間複雑度アルゴリズムの特徴は何ですか?
アルゴリズムの時間の複雑さを慎重に調べることで、簡単に特定できる場合があります。 2つのネストされたループを持つアルゴリズムは、明らかにN 2です。2つの値のNグループのすべての可能な組み合わせを探索するアルゴリズムは、明らかに2 Nです。NNNN2N2N^2NNN2N2N2^N しかし、複雑さを持つアルゴリズムを「見つける」方法はわかりません。たとえば、再帰的なマージソートの実装は1つです。mergesortまたは他のΘ (N log N )アルゴリズムの一般的な特性は、分析するときに手がかりになりますか?Θ (NログN)Θ(Nlog⁡N)\Theta(N \log N)Θ (NログN)Θ(Nlog⁡N)\Theta(N \log N) アルゴリズムが複雑ななる方法は複数あると思いますので、ありとあらゆる答えがありがたいです。ところで、厳密な証拠ではなく、一般的な特性とヒントを探しています。Θ (NログN)Θ(Nlog⁡N)\Theta(N \log N)

3
DOES
この質問は、コンピューターサイエンススタック交換で回答できるため、理論的コンピューターサイエンススタック交換から移行されました。 6年前に移行され ました。 あり、PのカーディナリティがN Pのカーディナリティと同じである可能性はありますか?または、P ≠ N Pは、PとN Pが異なるカーディナリティを持たなければならないことを意味しますか?P≠NPP≠NP\mathsf{P} \not = \mathsf{NP}PP\mathsf{P}NPNP\mathsf{NP}P≠NPP≠NP\mathsf{P} \not = \mathsf{NP}PP\mathsf{P}NPNP\mathsf{NP}

7
ランダムなスーツレストランプデータを圧縮して、エントロピーエンコーディングストレージにアプローチ、マッチング、またはビートすることさえできますか?もしそうなら、どのように?
シミュレートされたカードゲームに使用している実際のデータがあります。スーツではなく、カードのランクにのみ興味があります。ただし、標準のカードデッキであるため、このデッキでは各ランクのうちしか使用できません。デッキは各ハンドでうまくシャッフルされ、その後、デッキ全体をファイルに出力します。そのため、出力ファイルには、シンボルが個しかありません。( = 10ランク)。したがって、もちろん、シンボルごとにビットを使用してこれらをビットパックできますが、可能なエンコードのうちを無駄にしています。一度にシンボルをグループ化してから圧縮すると、より良い結果が得られます。4 13 2 、3 、4 、5 、6 、7 、8 、9 、T 、J 、Q 、K 、A T 45252524441313132,3,4,5,6,7,8,9,T,J,Q,K,A2,3,4,5,6,7,8,9,T,J,Q,K,A2,3,4,5,6,7,8,9,T,J,Q,K,ATTT44416 4 13 433316161644413413413^4 =あり、代わりにビットにかなり「」収まることができます。理論的なビットパッキングの制限は、可能なカードごとにランダムシンボルを持つデータの場合、log()/ log()=です。しかし、このデッキには、たとえば王を置くことはできません。各デッキには各ランクがしかないため、エントロピーエンコーディングはシンボルごとに約0.5ビット、約低下します。28,56128,56128,5611515151616161313132223.700443.700443.700441313135252524443.23.23.2 わかりましたので、ここに私が考えていることです。このデータは完全にランダムではありません。枚のカード(シャッフルデッキと呼ばれる)の各ブロックには各ランクがあることがわかっているため、いくつかの仮定と最適化を行うことができます。そのうちの1つは、最後のカードをエンコードする必要はありません。何をすべきかがわかるからです。別の節約は、単一のランクで終了する場合です。たとえば、デッキの最後の枚のカードが場合、デコーダーはその時点までカードをカウントし、他のすべてのランクが満たされていることを確認し、を想定するため、それらをエンコードする必要はありません。行方不明」カードはすべてです。444525252333777777777333777 このサイトへの私の質問は、このタイプのデータでさらに小さな出力ファイルを得るために他にどのような最適化が可能か、そしてそれらを使用する場合、シンボルあたりビットの理論的な(単純な)ビットパッキングエントロピーを打ち負かすことはできますか、または平均でシンボルあたり約ビットの究極のエントロピー制限に近づきますか?もしそうなら、どのように?3.700443.700443.700443.23.23.2 ZIPタイプのプログラム(たとえばWinZip)を使用すると、圧縮のみが表示されます。これは、ビットに対して「遅延」ビットパックを実行しているだけであることがわかります。独自のビットパッキングを使用してデータを「事前圧縮」すると、zipプログラムで実行すると少し超える圧縮が行われるため、その方が良いようです。私が考えているのは、なぜ自分ですべての圧縮をしないのですか(Zipプログラムよりもデータの知識が豊富だからです)。log()/ log()=のエントロピー「制限」にことができるかどうか疑問に思っています。2:12:12:14442:12:12:11313132223.700443.700443.70044。私は、私が言及したいくつかの「トリック」と、おそらくさらに見つけることができるいくつかのトリックでできると思います。もちろん、出力ファイルは「人間が読める」ものである必要はありません。エンコーディングがロスレスである限り、有効です。 万の人間が読めるシャッフルデッキ(行にへのリンクを次に示します。誰でもこれらの行の小さなサブセットを「練習」してから、ファイル全体をリッピングできます。このデータに基づいて、最適な(最小の)ファイルサイズを更新し続けます。333111 https://drive.google.com/file/d/0BweDAVsuCEM1amhsNmFITnEwd2s/view ちなみに、このデータがどのタイプのカードゲームに使用されているかに興味がある場合は、ここに私のアクティブな質問へのリンクがあります(ポイントの賞金付き)。大量のデータストレージスペースが必要になるため、(厳密に)解決するのは難しい問題であると言われています。ただし、いくつかのシミュレーションはおおよその確率と一致しています。(まだ)純粋に数学的な解決策は提供されていません。難しすぎると思います。300300300 /math/1882705/probability-2-player-card-game-with-multiple-patterns-to-win-who-has-the-advant サンプルデータの最初のデッキをエンコードするためにビットを示す優れたアルゴリズムがあります。このデータは、Fisher-Yatesシャッフルアルゴリズムを使用してランダムに生成されました。それは本当のランダムデータなので、新しく作成されたアルゴリズムは非常にうまく機能しているようで、私は幸せです。168168168 圧縮の「チャレンジ」については、現在、デッキあたり約160ビットです。おそらく158まで下げることができると思います。はい、試しましたが、デッキあたり158.43ビットを得ました。アルゴリズムの限界に近づいていると思うので、デッキあたり166ビットを下回ることに成功しましたが、カードあたり3ビットである156ビットを取得できませんでしたが、楽しい練習でした。おそらく将来的には、各デッキを平均で2.43ビット以上削減する何かを考えます。

2
2つの2x2行列の行列乗算が7回未満の乗算でできないことを証明するにはどうすればよいですか?
Strassenの行列乗算では、2つの2 x 2の行列乗算に7つの乗算が必要であるという奇妙な(少なくとも私には)事実を述べています。 質問: 2つの2 x 2行列を6回の乗算で乗算できないことを証明するにはどうすればよいですか? 行列は整数を超えていることに注意してください。

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