コンピュータサイエンス

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

1
文字列内の最長の繰り返し(散乱)サブシーケンス
非公式の問題声明: ACCABBABACCABBABACCABBABなどの文字列が与えられたとき、左から右に赤い文字のみを読むと、読むのと同じ結果が得られるように、いくつかの文字を赤、いくつかの文字を青に色付けします。青い文字のみ。 例では、次のように色を付けることができますACCABBABACCABBABA\color{blue}{C}\color{red}{CAB}B\color{blue}{AB} したがって、CABCABCABは繰り返しサブシーケンスであると言いACCABBABACCABBABACCABBABます。また、最長の繰り返しサブシーケンスです(確認しやすい)。 最長の繰り返しサブシーケンスを効率的に計算できますか? 正式な質問: 文字列といくつかのkkkについて、長さ繰り返し部分シーケンスがkkk文字列に存在するかどうかを決定するのはNP困難ですか? その場合:どの問題をこの問題に減らすことができますか? そうでない場合:効率的なアルゴリズムとは何ですか?(明らかに、このアルゴリズムを使用して、最長の繰り返しサブシーケンスを計算できます) ボーナス質問: アルファベットのサイズが定数で制限されている場合、それらは常に長さ繰り返し部分シーケンスになりn/2−o(n)n/2−o(n)n/2 - o(n)ますか? (これはバイナリアルファベットに当てはまることが知られています。) 編集2:ボーナス質問に対する否定的な答えは、少なくとも文字のアルファベットで既に知られています555。実際、サイズがアルファベットの場合、長さが単に最も長い繰り返しサブシーケンスを持つ文字列があります。これを表示するには、ランダムな文字列で十分です。結果はすでに存在していましたが、見落としていました。ΣΣΣO(n⋅Σ−1/2)O(n·Σ−1/2)O(n · Σ^{-1/2}) 編集: 注: 一部の人々は、「サブシーケンス」と言うときに「サブストリング」を意味します。しません。これは、サブストリングを2回見つける問題ではありません。

3
ビジュアルプログラミングツール、なぜASTと直接連携しないのですか?
Blocklyや友人などのオープンソースのビジュアルプログラミングツール、およびGithubでホストされている他のプロジェクトをいくつか見つけましたが、抽象構文ツリーで直接機能するものは見つかりませんでした。 何故ですか? 私が尋ねているのは、すべてのコンパイラがコンパイルプロセスにソースコードをASTに解析する段階があることを発見した後、いくつかの視覚的なプログラミングツールがこれを利用してプログラマに方法を与えることができることは明らかだったからですASTを視覚的な方法で直接編集し、ソースからノードグラフへのラウンドトリップを行い、必要に応じてソースに再び戻すこともできます。 たとえば、人は JavaScript AST Visualizerから実際のJavaSriptビジュアルプログラミングツールまで、それほど大きな違いはない。 だから、私は何が欠けていますか?

2
償却時間での検索、挿入、削除を伴うデータ構造?
償却時間で次の操作をサポートする順序付きリストを維持するためのデータ構造はありますか?O(1)O(1)O(1) GetElement(k):リストの番目の要素を返します。kkk InsertAfter(x、y):新しい要素yをリストのxの直後に挿入します。 Delete(x):リストからxを削除します。 最後の2つの操作では、xがデータ構造への直接のポインターとして与えられていると仮定できます。InsertElementは、yに対応するポインターを返します。InsertAfter(NULL、y)は、リストの先頭にyを挿入します。 たとえば、空のデータ構造から始めて、次の操作は順序付きリストを次のように更新します。 InsertAfter(NULL、a) [a]⟹⟹\implies InsertAfter(NULL、b) [b、a]⟹⟹\implies InsertAfter(b、c) [b、c、a]⟹⟹\implies InsertAfter(a、d) [b、c、a、d]⟹⟹\implies Delete(c) [b、a、d]⟹⟹\implies これらの5つの更新後、GetElement(2)はdを返し、GetElement(3)はエラーを返します。

4
停止する問題は、理想的なコンピューター上の純粋なプログラムで決定可能ですか?
停止する問題が不純なプログラム(つまり、I / Oやマシンのグローバル状態に依存する状態を持つプログラム)で決定できない理由を理解するのは非常に簡単です。しかし、直感的には、理想的なコンピューターでの純粋なプログラムの停止は、静的分析などによって決定できるように思われます。 これは事実ですか?そうでない場合、この主張を反証する反例や論文は何ですか?

4
停止問題の決定不能性の証明
停止問題の決定不能性の証拠を理解するのに苦労しています。 がプログラムが入力で停止するかどうかを返す場合、なぜと両方にのコードを渡す必要があるのですか?H(a,b)H(a、b)H(a,b)aaabbbPPPaaabbb にと任意の入力(などを入力できないのはなぜですか?H()H()H()PPPxバツx

6
2つの将軍の問題が解決できない場合、私たち人間はどのように物事に同意することができますか?
2つの将軍の問題が解決できない場合、私たち人間はどのように物事に同意することができますか? つまり、私たちは毎日コミュニケーションを取り、コンピューターサイエンスが扱うコミュニケーションの問題と同じ制限を持っています。なぜ私たちに影響しないのですか?

6
リバーシブルゲートが使用されないのはなぜですか?
私はKurzweilによって書かれた「The singularity is near」という本を読んでいて、彼は例えばFredkin gateのようなリバーシブルのゲートについて言及していました。このようなゲートを使用する利点は、ビットが熱に消える計算に関連する熱の無駄をなくすことができ、計算にエネルギー入力が必要ないことです。これらの仮定により、これらのゲートは奇跡の解決策のように聞こえます。したがって、問題は、どのような技術的ハードルが大規模な使用を依然として妨げているかです。 また、電気工学の学士号とドイツのトップ大学での修士課程のそれらのゲートについて聞いたことがないのは残念だと思います...


3
NP完全性の教育-チューリング削減対カープ削減
コンピューターサイエンス専攻にNP完全性を教えるのに最適な方法についての質問に興味があります。特に、Karp削減またはチューリング削減を使用してそれを教える必要がありますか? NP完全性と削減の概念は、すべてのコンピューターサイエンス専攻が学ぶべきものだと思います。しかし、NP完全性を教えるとき、カープ削減の使用にはいくつかの欠点があることに気付きました。 第一に、カープの削減は一部の学生にとって不必要に混乱させるようです。削減の直感的な概念は、「問題Xを解決するアルゴリズムがあれば、それを使用して問題Yも解決できます」です。これは非常に直感的ですが、カープの削減よりもチューリングの削減にはるかに良く対応します。その結果、NP完全性を証明しようとする学生は、直感に惑わされ、誤った証明を形成することがわかります。両方の種類の縮約を教えようと試み、カープ縮約のこの側面を強調することは、不必要な形式主義のように感じられ、不必要な授業時間と不必要な技術的詳細のように感じることに学生が注意を払うことがあります。このより制限された削減の概念を使用する理由は自明ではありません。 カープ削減とチューリング(クック)削減の違い、およびそれらがどのようにNP完全性の異なる概念につながるかを理解しています。カープの削減により、複雑さのクラス間の区別がより細かくなります。したがって、複雑性理論を真剣に研究するためには、カープ削減が明らかに正しいツールです。しかし、これを学んでいるだけで複雑性理論に進まないコンピューターサイエンスの学生にとって、この細かい区別が重要であるかどうかは、彼らがさらされるために重要です。 最後に、学生として、私は「トートロジー」のような問題に出くわしたとき戸惑っていたのを覚えています。たとえば、ブール式を与えられ、それがトートロジーであるかどうかを確認します。紛らわしいのは、この問題が明らかに難しいことです。そのための多項式時間アルゴリズムは、P=NPP=NPP=NP; この問題を解決することは、明らかにトートロジーの問題を解決するのと同じくらい難しいです。ただし、直感的にトートロジーは充足可能性と同じくらい困難ですが、トートロジーはNP困難ではありません。はい、今日これがなぜそうなのか理解していますが、当時私はこれに戸惑っていたことを覚えています。(結局、頭を突き抜けたのは、どうしてNPハードとコNPハードを区別するのかということです。とにかく、それは人為的なものであり、実践によってあまり動機付けられていないようです。実際の観点から見ると、co-NPの硬度はNPの硬度と本質的に同じ実際的な結果をもたらすように思われますが、なぜこの区別にすべてがこだわるのでしょうか?はい、私は知っています答えですが、学生として、私はこれが主題をより不可解でやる気が少ないと感じただけだったことを覚えています) だから、私の質問はこれです。NP完全性を生徒に教えるとき、カープ削減またはチューリング削減を使用して教える方が良いですか?チューリング縮約を使用してNP完全性の概念を教えようとした人はいますか?もしそうなら、それはどうでしたか?チューリング簡約を使用して概念を教え、カープ簡約に関連する概念上の問題をスキップした場合、非自明な落とし穴または欠点はありますか? 関連:こことここを参照してください。文献でKarpリダクションを使用する理由は、NP硬度とco-NP硬度を区別できるためです。ただし、この能力がすべてのCS専攻で取られるべきアルゴリズムクラスの学習目標にとって重要であるかどうかの教育学的観点に焦点を当てた答えを与えていないようです。同様の議論があるcstheory.SEのこちらも参照してください。

5
アンチブルームフィルターはありますか?
A ブルームフィルタは、効率的にさまざまな値がすでに処理中に遭遇したかどうかを追跡することが可能となります。データアイテムが多数ある場合、ブルームフィルターを使用すると、ハッシュテーブルのメモリを大幅に節約できます。ハッシュテーブルと共有するブルームフィルターの主な機能は、アイテムが新しいものではない場合は常に「not new」と表示することですが、アイテムに「not new」のフラグが立てられる確率はゼロではありません「新しい場合でも。 逆の動作をする「アンチブルームフィルター」はありますか? 言い換えれば、アイテムが新しい場合は「新しい」と言う効率的なデータ構造がありますが、新しいものではないアイテムについては「新しい」と言うこともありますか? 以前に表示されたすべてのアイテムを(たとえば、並べ替えられたリンクリストに)保持することは最初の要件を満たしますが、大量のメモリを使用する場合があります。緩和された2番目の要件を考えると、それも不要であることを願っています。 より正式な治療、書き込み好む人のためにb(x)=1b(バツ)=1b(x) = 1ブルームフィルタを考えればxバツx新しいもので、b(x)=0b(バツ)=0b(x) = 0それ以外の場合は、書き込みn(x)=1n(バツ)=1n(x) = 1ならばxバツx本当に新しいとされn(x)=0n(バツ)=0n(x) = 0それ以外の場合。 次に、Pr[b(x)=0|n(x)=0]=1Pr[b(バツ)=0|n(バツ)=0]=1Pr[b(x) = 0 | n(x) = 0] = 1 ; Pr[b(x)=0|n(x)=1]=αPr[b(バツ)=0|n(バツ)=1]=αPr[b(x) = 0 | n(x) = 1] = \alpha ; Pr[b(x)=1|n(x)=0]=0Pr[b(バツ)=1|n(バツ)=0]=0Pr[b(x) = 1 | n(x) = 0] = 0; Pr[b(x)=1|n(x)=1]=1−αPr[b(バツ)=1|n(バツ)=1]=1−αPr[b(x) = 1 | n(x) …

2
純粋に機能的な言語でプロローグインタープリターを実装する方法
純粋に関数型の言語でPrologインタープリターを実装する方法について、擬似コードに関する明確なリファレンスがありますか?私がこれまでに発見したのは、命令型言語のみを扱っているようで、Prolog自体の実装にすぎないか、解釈に使用する具体的なアルゴリズムを提供していません。私は答えにとても感謝しています。

2
SATソルバーの1-out-of-n制約のエンコード
私はSATソルバーを使用して問題をエンコードしていますが、SATインスタンスの一部として、ブール変数があります。 。(私はこれを「ワンホット」エンコーディングとして記述されるのを見たことがあります。)x1,x2,…,xnx1,x2,…,xnx_1,x_2,\dots,x_n SATで「うち正確に1つでなければならない」という制約をエンコードしたい。SATソルバーを可能な限り効率的に実行するために、この制約をエンコードする最良の方法は何ですか?x1,…,xnx1,…,xnx_1,\dots,x_n この制約をエンコードする方法はたくさんあります。 ペアごとの制約。すべてのに対してペアワイズ制約を追加して、最大で1つのが真であることを確認してから、を追加して、少なくとも1ことを確認できます。 iは、jはxはI X 1 ∨ X 2 ∨ ⋯ ∨ X N¬xi∨¬xj¬xi∨¬xj\neg x_i \lor \neg x_ji,ji,ji,jxixix_ix1∨x2∨⋯∨xnx1∨x2∨⋯∨xnx_1 \lor x_2 \lor \cdots \lor x_n これにより、句が追加され、追加のブール変数は追加されません。Θ(n2)Θ(n2)\Theta(n^2) バイナリエンコーディング。新しいブール変数 導入できますi 1、i 2、… 、i lg nlgnlg⁡n\lg ni1,i2,…,ilgni1,i2,…,ilg⁡ni_1,i_2,\dots,i_{\lg n}(バイナリ)の整数で表すためにそのようなその(ことを確実にするために、いくつかのブール制約の追加望ましい範囲内にあります)。次に、がツリーであり、他のすべてのがfalseであることを強制する制約を追加できます。つまり、ごとに、強制する句を追加します。1 ≤ iが≤ N I X I 、X 、J、J 、I = J ⇔ X Jiii1≤i≤n1≤i≤n1 …

6
プログラミング言語、正規表現、形式言語の関係は何ですか
この質問に対する答えをネットで探しましたが、私以外の誰もが暗黙のうちに答えを知っているようです。おそらくこれは、関心のある唯一の人がその主題について高等教育を受けた人だからです。一方、私は高校での宿題の最後に投げ込まれました。 私の質問は、プログラミング言語はどのくらい正確に正式言語に関連していますか?私が読むところはどこでも、「プログラミング言語の文法を定義するために形式言語が使用されている」という言葉があります。 今、私が集めたものから、正式な言語とは、特定の記号セット(言語のアルファベット)に適用される一連の生産規則です。これらの生産ルールは、次のような一連の変換を定義します。 b -> a aaa->c これは次のように適用できます。 abab->aaaa aaaa-> ca 補足として、正式な言語のアルファベットを{a、b、c}と定義すると、aとbは非終端であり、cは変換できないため終端です(間違っている場合は修正してください)それ)。 それを考えると、これはプログラミング言語にどのように当てはまるのでしょうか?また、正規表現を使用してテキスト形式の言語を解析し、文法が正しいことを確認することもよくあります。意味あり。その後、正規表現は正式な言語によって定義されると述べられています。正規表現は、正規表現を表す有限状態オートマトンがゴールポイントに到達したかどうかに応じて、(少なくとも私の経験では)trueまたはfalseを返します。私が見る限り、それは変換とは関係ありません*。 プログラム自体のコンパイルについては、正式な言語がコードを連続的に低レベルのコードに変換し、最終的にハードウェアが理解できる複雑なルールセットを介してアセンブリに到達できると思います。 だからそれは私の混乱した観点からのものです。おそらく、私が言ったことには根本的に間違っていることがたくさんあります。だから私は助けを求めています。 * (a|b)*b*c->trueプロダクションルールのようなものを検討しない限り、その場合、ルールには有限状態オートマトン(つまり、正規表現)が必要です。先ほど言ったように、これは意味がありません

3
無向グラフの最小カットを見つける
ここに私が解決しようとしている過去の試験からの質問があります: 無向グラフの 正の重みを有するW (E )≥ 0、Iは、最小カットを発見しようとしています。max-flow min-cut定理を使用する以外に、それを行う他の方法は知りません。しかし、グラフは無向であるため、どのように指示すればよいですか?両端にエッジを向けることを考えましたが、どの頂点がソースになり、どの頂点がシンクになりますか?または、最小カットを見つける別の方法はありますか?GGGw(e)≥0w(e)≥0w(e) \geq 0

7
アイテムを「均等に」配布するアルゴリズム
結果のリストが可能な限り「バランスの取れた」または「均等に分散」されるように、リストから値を分散するアルゴリズムを探しています(これらがそれを記述するための最良の方法であると確信していないため、引用符で...後で、結果が他の結果よりも良いかどうかを測定する方法を提供します)。 したがって、リストの場合: [1, 1, 2, 2, 3, 3] 値を再配布した後の最良の結果の1つは次のとおりです。 [1, 2, 3, 1, 2, 3] これと同じくらい良い結果が他にもあるかもしれません。もちろん、値のセットが不均一になると、より複雑になります。 これは、結果が他よりも優れているかどうかを測定する方法です。 各アイテムと同じ値を持つ次のアイテム間の距離を数えます。 その距離のセットの標準偏差を計算します。分散が低いほど、より良い結果が得られます。 観察: 距離を計算し、同じ値を持つアイテムを見つけることなくリストの最後に到達すると、リストの最初に戻ります。そのため、多くても同じアイテムが検出され、そのアイテムの距離はリストの長さになります。これは、リストが周期的であることを意味します。 典型的なリストには、さまざまな数量で最大15個の異なる値を持つ最大50個のアイテムがあります。 そう: 結果の[1, 2, 3, 1, 2, 3]場合、距離は[3, 3, 3, 3, 3, 3]であり、標準偏差は0;です。 結果の[1, 1, 2, 2, 3, 3]場合、距離は[1, 5, 1, 5, 1, 5]であり、標準偏差は2;です。 これにより、最初の結果が2番目の結果よりも良好になります(偏差が小さいほど良い)。 これらの定義を考慮して、どのアルゴリズムまたは戦略を検索すべきかの手がかりを求めます。

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