コンピュータサイエンス

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

2
Map-Reduceモデルの時間複雑度分析
Hadoop / MapReduceパラダイムで実行するようにアルゴリズムを再設計しようとしています。ビッグデータプラットフォームのアルゴリズムの時間の複雑さを測定するための全体的なアプローチがあるかどうか疑問に思っていました。 簡単な例として、n(= 10億)の数の平均を取ることは、O(n)+ Cで実行できます(除算が一定時間演算であると仮定)。Map Reduceのこの大規模な並列化可能なアルゴリズムを壊すと、データをk個のノードに分割することで、時間の複雑さは単にO(n / k)+ C + C 'になります。ここで、C 'は、開始ジョブの計画時間のオーバーヘッドとして想定できます。関与するシャッフルはなく、レデューサーの仕事はほとんど取るに足らないことに注意してください。 データに対する反復ループを使用したアルゴリズムのより完全な分析に興味があり、重いシャッフルとリデューサー操作を含みます。可能であれば、I / O操作とデータのネットワーク転送を組み込みたいです。

2
MSTの更新
無向、接続、加重グラフが与えられた場合 G=(V、E、w)G=(V,E,w)G = (V,E,w) どこ www 重み関数です w:E→Rw:E→Rw: E \to \mathbb{R}そして最小スパニングツリー(MST)の。 今、私たちは減少によって重量をエッジのんではないに属し。 TTTGGGkkkeeeTTT を効率的に更新してMST(と表記)にする方法TTTT』T′T')の G』=(V、E、w』)G′=(V,E,w′)G'=(V,E,w')、 どこ w』w′w' と同じです www それ以外で w』(e)=w(e)−kw′(e)=w(e)−kw'(e) = w(e) - k? 更新のアルゴリズムTTT に T』T′T' 簡単です:追加 eee に TTT サイクルを作成します CCC に TTT。しましょうe』e′e' サイクルの最大加重エッジになる CCC。もしw(e』)>w』(e)w(e′)>w′(e)w(e') > w’(e)、その後 T』=T∪{e}−{e』}T′=T∪{e}−{e′}T' = T \cup \{e\} - \{e'\}必要に応じてMSTを指定します。さもないと、T』=TT′=TT' = T。 私は矛盾によってその正しさを証明するのが難しい。と思いますT″T′′T'' …

1
ノードにポートがあるグラフの用語
グラフは、数学、コンピュータサイエンス、エンジニアリングの分野で明確に定義された概念であり、それらに依存しています。ただし、特定のドメインまたはアプリケーションで(有向)グラフを実際に実装するには、エッジが頂点を接続するだけでなく、これらの頂点に存在するポートを接続する必要がある場合があります。有向グラフでは、これは入力ポートと出力ポートの分離を意味します。通常、エッジは出力ポートから始まり、入力ポートに到達します。 例は簡単に見つけることができます:シェーダーデザインツール、コンパイラ理論のシグナルフローグラフ、電子スキーマ、高レベルETLスクリプト...これらのツールはすべて、頂点に名前付きまたは異なる入力と出力が必要です。 さて、私の質問です。これらの種類のグラフに理論と命名法はありますか、またはこれは工学科学の「実装問題」と見なされていますか?私の質問からお気づきのように、私はこのようなもの(「ノードポート付きのグラフ」)が何であるかを正確に特定することはできません。その答えが知りたいです。

4
ライスの定理の意味
ライスの定理の意味を理解するたびに、自分を混乱させる反例を見つけます。多分誰かが私が間違っていると思っているところを教えてくれるかもしれません。 計算可能な関数のセットのいくつかの重要なプロパティを取りましょう。たとえば、。明らかに、可算無限であると計算機能の可算無限の数ではありませんでもあります。L = { f:N → N|fは計算可能な合計関数です}L={f:N→N|fは計算可能な合計関数です}L = \{ f : \mathbb{N} \to \mathbb{N} \;|\; \text{f is a computable and total function} \}LLLLLL 今命令の有限集合のオーバーチューリング完全なプログラミング言語考えることができますと構文的に正しいプログラムのセットと、。私の言語のセマンティクスを好きなように選択できる場合は、プログラムに自由に番号を付けることもできます。そのため、プログラムの一部が計算可能な関数の任意の一部を正確に計算するようなプログラミング言語を設計できるはずです。カーディナリティが一致する限り。たとえば、であり、各プログラムは合計関数を計算します。以降 、そのような言語が存在する必要があります。ΣΣ\SigmaP⊆Σ∗P⊆Σ∗P \subseteq \Sigma^*| P| = | N ||P|=|N||P| = |\mathbb{N}|Pp a l= { W ∈Σ∗|w は回文です}Ppal={w∈Σ∗|w 回文です}P_{pal} = \{ w \in \Sigma^* \;|\; w\text{ is a …

10
コンピュータプログラムとアルゴリズム
プログラムにはアルゴリズムが含まれていると言われていますが、その定義を参照すると、アルゴリズムは特定のタスクを実行するために記述された一連の命令であり、コンピュータープログラムはコンピューターで(一部の)タスクを実行するための一連の命令でもあります。 では、プログラムとアルゴリズムの違いは何ですか?これも一種のアルゴリズムですか? 実際、私はアルゴリズムとコンピュータープログラムの正式な定義を探しているので、それらを互いに区別したり、プログラム内でアルゴリズムを識別したりできます。 更新:私はウィキペディアで非公式な定義(少なくとも構文的には)によってプログラムがアルゴリズムであることに気付きました。 非公式の定義は、「一連の操作を正確に定義する一連のルール」とすることができます。これには、数値計算を実行しないプログラムを含むすべてのコンピュータプログラムが含まれます。一般に、プログラムは最終的に停止する場合のアルゴリズムにすぎません。

3
コストを過小評価している場合でも、A *検索ヒューリスティックが最適なのはなぜですか?
A *検索は、ヒューリスティックが許容可能である限り、問題の最適な解決策を見つけます。つまり、特定のノードからへのパスのコストを過大評価することは決してありません(そして、一貫性がありますが、現時点では許容可能であることに焦点を当てましょう)。 しかし、ヒューリスティックが過小評価している場合、なぜ最適なソリューションが常に見つかるのでしょうか。たとえば、最適な経路を過小評価するよりも、非最適な経路を過小評価する場合、それは過大推定と同等ではありませんか?

2
Schönhage–Strassenの乗算アルゴリズムの変換が安価なのはなぜですか?
Schönhage-Strassenの乗算アルゴリズムは、サイズの乗算を回すことによって動作しますNNN サイズの多くの乗算に l g(N)lg(N)lg(N)数論変換と再帰を使用します。少なくとも私はそれがそうであると思います。他にいくつかの賢さがあるからです。正確に要約するのに十分理解していません。それで終わりますO (N⋅ リットルG(N)⋅ リットルG(l g(N)))O(N⋅lg(N)⋅lg(lg(N)))O(N \cdot lg(N) \cdot lg(lg(N))) 時間。 数論変換は、有限体で行われることを除いて、離散フーリエ変換とまったく同じです。F2N+ 1F2N+1F_{2^N+1} 整数を法として 2N+ 12N+12^N+1。これにより、フーリエ変換には1の根の乗算が多くなるため、演算が大幅に安価になります。F2N+ 1F2N+1F_{2^N+1}の結束のルーツはすべて2の累乗なので、シフトするだけです!また、整数は、浮動小数点の複素数よりもはるかに扱いやすいです。 とにかく、私を混乱させるのは F2N+ 1F2N+1F_{2^N+1}とても大きいです。からランダムな要素を与えるとF2N+ 1F2N+1F_{2^N+1}、 それはとります O (N)O(N)O(N)それを指定するビット。したがって、2つの要素を追加するにはO (N)O(N)O(N)時間。そして、DFTは多くの追加を行います。 Schönhage–Strassenは入力を Nl g(N)Nlg(N)\frac{N}{lg(N)} とのグループ l g(N)lg(N)lg(N)ビット。これらのグループは、F2N+ 1F2N+1F_{2^N+1}それが変形することを。DFTの各パスにはO (Nl g(N))O(Nlg(N))O(\frac{N}{lg(N)}) 足し算/引き算、そして O (l g(Nl g(N)))O(lg(Nlg(N)))O(lg(\frac{N}{lg(N)}))パス。だから加算加算に基づいてO (N)O(N)O(N) これらのすべての追加のコストは O(NNlg(N)lg(Nlg(N)))O(NNlg(N)lg(Nlg(N)))O(N \frac{N}{lg(N)} lg(\frac{N}{lg(N)}))、これは漸近的に同じです O(N2)O(N2)O(N^2)。 それより少し上手くいくことができます...値が非常に小さいため、追加は非常にまばらです。最初のパスの追加は本当にコストがかかりますO(lg(N))O(lg(N))O(lg(N)) それぞれ、2番目のパスのコスト 21O(lg(N))21O(lg(N))2^1 …

1
Rabin–Karpでハッシュを計算するために使用される基底が常に素数であるのはなぜですか?
Rabin–Karp文字列照合アルゴリズムには、迅速に計算できるハッシュ関数が必要です。一般的な選択は h(x0…xn)=∑i=0nbixi,h(x0…xn)=∑i=0nbixi, h(x_0\ldots x_n) = \sum_{i=0}^n b^i x_i, どこ bbbあるプライム(すべての計算は、モジュールです2w2w2^w、 どこ wwwマシンワードの幅です)。なぜそれが重要なのかbbb プライムになるには?

7
基本的なプログラミングを教えるための言語
私は中学生にプログラミングを教えることに興味があります。次の基準を備えたプログラミング言語が欲しいのですが。 シンプル -コードを多用せずに高度なプログラミングをサポートするために必要な最低限の数にまで削減。そのため、この言語では、ポインターには興味がなく、オブジェクト指向にうんざりしています(関数は優れていますが)。 パワフル -グラフィックス、ネットワーキング、分散処理など、21世紀の要素をプログラミングできるようになりたいです。 デバッグ可能 -人間が読めるデバッガを備えたエレガントな統合開発環境が必要です(つまり、スタックトレース付きの奇妙なエラーメッセージではなく、平均的な中学生がコードの何が悪いのかを判断するために使用できる明確な説明) 。 標準プログラミング言語(C、C ++、C#、Java)は、最初の基準を満たしていません。Scratchなどの基本的なプログラミング言語は、2番目(場合によっては3番目)の基準を満たしていません。スクリプト言語(perl、python、php)は最後の基準を満たしていません。 誰かがそのような獣を知っているかどうか知りたいのですが、座る前に自分で作ります。


1
言語が(ir)regularであることの証明(標準的な方法は失敗しました)
私は現在、(個人的な娯楽のために)正規の言語を証明しようとしています。言語は次のとおりです。 バイナリでエンコードされたときにビットパリティさえも持つ3進数のすべての数値を含む言語。 現在、私はいくつかの異なるアプローチを試しましたが、成功しませんでした。私はポンピングレンマ(ポンピングできるものが見つからなかった)、Myhill-Nerode(同様)を使用してみましたが、ステートメントが真である各長さの文字列の数を数えました(私の直感は、確率論的議論)。 ここで役立つかもしれない他のアプローチはありますか、または役立つかもしれない直感はありますか?この時点で、私はおそらくその言語は規則的ではないと思いますが、私は説明をすることができないようです。

2
最大でで停止するすべてのチューリングマシンのセットを決定する ステップ
してみましょうL={<M>|ML={<M>|ML = \{ | Mはすべての入力xxxで最大200 * | x |で停止します 200∗|x|200∗|x|200 * |x|手順}}\}。 あるLLL決定可能では?認識できる? メンバーシップことを考えると何かについて主張する列の無限集合上での行動を、その私には非常に考えにくいどちらかである可能性があります。私はコことが示されているあなたは、各テストの列挙子加えることができます(私は思う)チューリング認識可能である各して放出する、それはいくつか受け入れない場合は中を最大ステップ。LLLMMMLLLLLLM1,M2,…,M1,M2,…,M_1, M_2, \dots, s1,s2,…s1,s2,…s_1, s_2, \dotsMMMsss200|x|200|x|200|x| 共のでLLLのいずれかで、認識可能であるLLL認識できない、またはそれが決定可能です。LLLが決定可能だとは思えない。ただし、それは停止問題に完全に還元することはできません。また、ライスの定理を適用することもできません(問題の品質は特定のステップ数で停止する品質であるため、それを決定できても他の決定はできません。任意のプロパティ)。 それが解決する唯一の問題は、文字列の無限のセットで実行する必要がある問題であるため、LLLが認識できない何かを認識させることを示すことが、最良の方法になると私には思われます。しかし、私はこれが何であるかを考えることができません。おそらくco-HALTが機能すると思いましたが、TMがある入力で停止しないことを証明することはできません。 行き詰まっています。私はどの方向に行くべきですか?

2
DAGの各ノードの子孫の数
1)DAGの各頂点の子孫の数を計算するために、単純なO(| E |。| V |)よりも優れたアルゴリズムはありますか? 2)ノードが1つずつ追加され、既存のノードの空でないサブセットに接続すると想定して、これを行うオンラインアルゴリズムはありますか? コンテキスト:m = O(n)、何百万もの頂点、通常は数千万のエッジの場合に興味があります。または、シンクでもある子孫の数を数えると便利です。 すべてのノードの子孫のセットを表す方法として、確率論的アプローチはmin-hashingです。min-hash構造の和集合は取るに足らないものであり、un-hashの一致の数から和集合の基数を推定できます。 ただし、DAGを伝播するときの動作がどの程度かはわかりませんが、直感的には、エラーがかなり速く複合するように見えます。 非常に関連:https : //cstheory.stackexchange.com/questions/553/what-bounds-can-be-put-on-counting-reachable-nodes-in-a-dag そして実際には:https:// cstheory.stackexchange.com/questions/18787/what-is-the-fastest-deterministic-algorithm-for-incremental-dag-reachability

3
TSPの3-optアルゴリズムはどのように機能しますか?
巡回セールスマン問題を解決するための3-Optヒューリスティックは、グラフから3つのエッジを削除し、さらに3つ追加してツアーを再完了することを理解しています。ただし、3つのエッジが削除された場合、ツアーを再結合する方法は2つしか残っていないことを指摘する多くの論文を見てきました。これは私には意味がありません。 たとえば、次のような論文[1]を見つけました。 3-optアルゴリズムも同様に機能しますが、2つのエッジを削除する代わりに、3つのエッジを削除します。つまり、3つのパスを有効なツアー1に再接続する方法は2つあります(図2と図3)。3 optの移動は、実際には2つまたは3つの2 optの移動と見なすことができます。 ただし、ツアーを再接続するには3つの方法があります。ここで何が欠けていますか? また、誰かが可能であれば3 optのアルゴリズムにリンクしてもらえますか?私はそれを理解しようとしているだけですが、まだ明確なアルゴリズムに遭遇していません。見つけたすべてのリソースは、「3つのエッジを削除し、それらを再接続する」と言うだけです。それだけで、あいまいです。 これは、3つのエッジを削除した後、3つのオプトムーブであるように思える3つのツアーです。 C.ニルソンによる巡回セールスマン問題のヒューリスティック

2
関数型プログラミングは、変装した命令型プログラミングではありませんか?
私が見ていたYouTubeビデオでは、命令型プログラミングと関数型プログラミングの違いについて、JavaとHaskellでそれぞれ1to からtoまでの数を10合計する方法を説明することで説明しました。 Javaでは、各ステップを明示的に記述し、各ステップの結果を変数に割り当てる必要があります-次のようなもの int total = 0; for (int i = 1; i <= 10; i++){ total = total + i; } return total; Haskellでは、次のように簡単に言うことができます。 sum(1..10) 私の質問は次のとおりです。関数型言語のバックグラウンドで何かが起こっていることは明らかであり、その何かはある種の命令型プロセスでなければなりません。関数型言語は、実際には一種の命令型言語のAPIのようです。たとえばsum(int start, int end)、Javaでメソッドを定義することにより、関数型言語の一部を作成できます。私は本当に新しいタイプの言語をすぐに作成しましたか、それとも命令命令をユーザーから隠す一連の命令メソッド呼び出しを定義しただけですか? 私が理解するのに苦労していることがはっきりしているといいのですが。

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