コンピュータサイエンス

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

1
範囲合計問題のセグメントツリー実装の時間の複雑さの証明
のサブ配列の合計を見つけるためにセグメントツリーを使用できることを理解しています。そして、ここのチュートリアルによれば、これはO(log n )時間で実行できます。あAAO(ログn )O(log⁡n)\mathcal{O}(\log n) ただし、クエリ時間が実際にことを証明することはできません。このリンク(および他の多くのリンク)は、各レベルで処理されるノードの最大数が4であることを証明できるため、O(4 log n )= O(log n )であると述べています。O(ログn )O(log⁡n)\mathcal{O}(\log n)444O(4ログn )= O(ログn )O(4log⁡n)=O(log⁡n)\mathcal{O}(4 \log n) = \mathcal{O}(\log n) しかし、おそらく矛盾によって、どうやってこれを証明するのでしょうか? もしそうなら、もし私たちがより高次元の配列の範囲の合計にセグメントツリーを使うとしたら、証明はどのように拡張されるでしょうか? たとえば、元の行列を4つの象限(線形配列の2分の1間隔と同様)に分割して、象限セグメントツリーを構築してサブ行列の合計を見つけることを考えることができますが、その証拠は私にはわかりません。


2
変数とポインターの違いは何ですか?
OOと関数型プログラミングの違いを概説する記事を読んでいた私は、関数ポインターに出くわしました。コンピュータサイエンスの学位(2003年)を修了してからしばらく経っています。そのため、ポインタを調べて記憶を更新しました。 ポインタは、メモリアドレスへの参照を含む変数です。それらは、そのようなデータが存在する場合、そのメモリアドレスに含まれているデータを指すと見なすことができます。または、記事の場合のように、コードのセクションへのエントリポイントを示し、そのコードを呼び出すために使用できます。 なぜこれが変数と異なるのですか?変数はメモリアドレスの記号名であり、コンパイラは名前を実際のアドレスに置き換えます。これは、変数がメモリ位置への参照を含み、そのようなデータが存在する場合、そのアドレスのデータを指すと見なすことができることを意味します。 違いが動作にある場合(おそらく、ポインターを実行時に再割り当てできない、または他の値ではなくシンボリック変数名のみを割り当てることができます)は、それが特定の型の変数、つまりポインター型であることを意味していませんか?同じように、整数型であると宣言された変数は、それが使用できる目的でコンパイルによって制限されます。 ここで何が欠けていますか?

1
範囲更新+バイナリインデックスツリーを使用した範囲クエリ
範囲のクエリと範囲の更新の両方を処理するためにバイナリインデックス付きツリー(fenwickツリー)をどのように変更できるかを理解しようとしています。 次のソースを見つけました: http://kartikkukreja.wordpress.com/2013/12/02/range-updates-with-bit-fenwick-tree/ http://programmingcontests.quora.com/Tutorial-Range-Updates-in-Fenwick-Tree http ://apps.topcoder.com/forums/?module = Thread&threadID = 756271&start = 0&mc = 4#1579597 しかし、それらすべてを読んでも、2番目のバイナリインデックス付きツリーの目的や、それが何をするのか理解できませんでした。 誰かがバイナリインデックス付きツリーがこれらを処理するためにどのように変更されるかを私に説明してもらえますか?

1
2つの再帰呼び出しによる再帰関係の解決
私はそれは決してしないだろうという条件の下でクイックソートの最悪のランタイムを勉強して、非常の定義を変更するためのアンバランスパーティションを非常に。 これを行うために、私は自分自身に、ランタイム何質問をクイックソート常にそうになりますが、いくつかの画分にパーティションに起こるよう要素は左側のパーティションにあり、は右側のパーティションにあります(要素、ピボット、中央に残ります)。T(n,p)T(n,p)T(n, p)0&lt;p≤120&lt;p≤120 < p \leq {1\over 2}⌊p(n−1)⌋⌊p(n−1)⌋\lfloor{p(n-1)}\rfloor⌈(1−p)(n−1)⌉⌈(1−p)(n−1)⌉\lceil(1 - p)(n - 1)\rceil111 が最悪の場合の上限を与えることを確認することは難しくありません。ここで、は最大不均衡許容パーティションです。フラクションパーティションはよりバランスがとれており、実行時間が短くなります。端数許可されていません。T(n,p)T(n,p)T(n, p)ppp&gt;p&gt;p> p&lt;p&lt;p<p が最良のケースであり、がクイックソートの最悪のケースであることは明らかです。どちらにも、あらゆる教育リソースで見られる簡単な再発関係があります。しかし、私はを一般的にどのように研究するかについての手がかりはありません。明らかな関係は次のとおりです。T(n,12)T(n,12)T(n, {1 \over 2})T(n,0)T(n,0)T(n, 0)T(n,p)T(n,p)T(n, p) T(n,p)=n+T(⌊p(n−1)⌋,p)+T(⌈(1−p)(n−1)⌉,p)T(n,p)=n+T(⌊p(n−1)⌋,p)+T(⌈(1−p)(n−1)⌉,p)T(n, p) = n + T(\lfloor{p(n-1)}\rfloor, p) + T(\lceil(1 - p)(n - 1)\rceil, p) ここで行き詰まっています。私は周りを検索してみましたが、分割統治アルゴリズムについて理解できるすべての文献は、文字通り「分割」を行い、パーティションのサイズが常に等しいという事実を使用して分析を「だまし」、用語を1回にマージしました。絶え間ない。 2つの再帰呼び出しを処理する方法がわかりません。丸めを削除しても安全かどうかはわかりません。これは分析的に解決することは可能ですか?はいの場合、どのように? PS:私は漸近論には興味がありません(定数に対してを示すのは簡単です)。が小さくなるにつれて、クイックソートがどのくらい遅くなるかに興味があります。たとえば、の比率に興味があります。p p T (n 、0.25 )Θ(nlogn)Θ(nlog⁡n)\Theta(n \log n)ppppppT(n,0.25)T(n,0.5)T(n,0.25)T(n,0.5)T(n, 0.25) \over T(n, 0.5) PPS:学部生として、明白なことを長くしすぎたり、説明が不十分であったりすれば、すさまじいことをお詫びします。ここで他のSEサイトほど見下されているかどうかはわかりませんが、これは宿題ではなく個人的な関心事であることに注意します。


1
この関数が
私の教科書は言う:「我々は、関数定義f:N→Nf:N→Nf\colon \mathbb{N}\to\mathbb{N}次のように及び注意を与えていること、我々時間でがと間に挟まれるような数を簡単に見つけることができます。 "f(1)=2f(1)=2f(1)=2f(i+1)=2f(i)1.2f(i+1)=2f(i)1.2f(i+1)=2^{f(i)^{1.2}}nnnO(n1.5)O(n1.5)O(n^{1.5})iiinnnf(i)f(i)f(i)f(i+1)f(i+1)f(i+1) 実際に簡単に時間でを見つけることができると自分に納得させるにはどうすればよいですか?再帰的に定義され、私たちは計算にあると思うまでの。これらの計算にかかる時間を見つけるには、依存する適切な上限を見つける必要があると思います。また、関数の実行時間の上限を見つける必要があります。。最後に、うまくいけば引用された命題を示すことができます。残念ながら、どちらも見えません。iiiO(n1.5)O(n1.5)O(n^{1.5})ffff(1),f(2),f(3)…f(j)f(1),f(2),f(3)…f(j)f(1),f(2),f(3)\dots f(j)f(j)≥nf(j)≥nf(j)\geq niiinnnx→2x1.2x→2x1.2x\to2^{x^{1.2}} 私が言及するのを忘れていました:私たちは非決定的なコンテキストにいることに注意してください。したがって、はで非決定性チューリングマシンによって計算可能であると主張されています。fffO(n1.5)O(n1.5)O(n^{1.5}) かなりの数の人がすでにこの質問を読んでおり、一部の人もそれが有用で興味深いと感じていますが、今のところ誰も回答していないので、私はコンテキストについていくつかの情報を提供したいと思います:引用された主張は証拠の不可欠な部分です非決定論的な時間階層定理。証明(主張付き)は、たとえばAroraとBarakの本にありますが、同じ証明を提供するWeb上の他のリソースもかなりたくさん見つかりました。それらのそれぞれは、クレームを簡単または些細なものと呼んでおり、を見つける方法については詳しく説明していませんiii時間で。したがって、これらすべてのリソースがAroraとBarakからコピーされたか、その主張は実際にはそれほど難しくありません。O(n1.5)O(n1.5)O(n^{1.5})

5
ダイグラフを可逆的な方法で無向グラフに変換する
私は、有向グラフ(有向グラフ)を無向グラフに可逆的に変換するアルゴリズムを探しています。つまり、無向グラフが与えられれば、有向グラフは再構築可能でなければなりません。これは無向グラフの頂点が増えることで発生することを理解していますが、気にしません。 これを行う方法を知っているか、参照を提案できますか?前もって感謝します。 更新:以下のAdrianNの回答について。それは良い出発点かもしれませんが、それが現在の形で機能するとは思いません。これが私がそうではないと思う理由の画像です: DWのコメントの後に更新:グラフの頂点はラベル付けされていないと見なします。解決策が頂点のラベル付けを伴う場合(AdrianNのように)、ラベル付けがどのように行われても、同じ(同形)無向グラフが得られるはずです。ラベル付けされた頂点を持つグラフの「同形」の私の定義は、2つのグラフに関連するラベル付けの順列があるということですが、ラベル付けされていないグラフの正確な定義はわかりません...

2
Coqの定理証明
バックグラウンド 私はCoqだけで支援を学んでいます。これまでのところ、急いでイヴベルトットのコックを読み終えました。現在、私の目標は、いわゆる除算アルゴリズムで終わる、自然数に関するいくつかの基本的な結果を証明することです。しかし、私はその目標に向かう途中でいくつかの後退に遭遇しました。特に、次の2つの結果は、私が最初に想像したよりもCoqで証明するのが難しいことを示しています(しゃれた意図)。実際、多くの実りのない試みの後、私はそれらを手動で証明する手段を講じました(以下に示すように)。これは明らかに、私がCoqの処理に習熟するのに役立つわけではありません。これが私がこのフォーラムを利用する理由です。私の希望は、このサイトの誰かが有能で喜んでいることです下記の証明をCoqが受け入れる証明に変換するのに役立ちます。すべての助けに心から感謝しています! 定理A すべてのための証明:x,y∈Nx,y∈Nx,y \in N x&lt;S(y)⊂x&lt;y∨I(N,x,y)x&lt;S(y)⊂x&lt;y∨I(N,x,y)\begin{equation} x < S(y) \subset x < y \lor \text{I}(N,x,y) \end{equation} と仮定します。したがって、と ため、(Peano 1bおよび3)x&lt;S(y)x&lt;S(y)x < S(y)z∈Nz∈Nz \in NI(N,x+S(z),S(y))(*)(*)I(N,x+S(z),S(y))\begin{equation} \text{I}(N,x+S(z),S(y)) \tag{*}\end{equation}I(N,x+z,y)I(N,x+z,y)\begin{equation} \text{I}(N,x+z,y) \end{equation} 述語を定義しQ(u):=(I(N,x+u,y)⊂x&lt;y∨I(N,x,y)Q(u):=(I(N,x+u,y)⊂x&lt;y∨I(N,x,y)\begin{equation} Q(u):=(\text{I}(N,x+u,y) \subset xy¬I(N,x,y)¬I(N,x,y)\neg \text{I}(N,x,y)x&gt;yx&gt;yx>y y&gt;xy&gt;xy>xI(N,x,y)I(N,x,y)\text{I}(N,x,y) 我々は維持上に固定し、入会を。場合我々は全てに対して基本ケースを証明します。次に、定理がについて成立するとします。ここで、定理を証明したいと思います。のトリコトミーから、と 3つのケースがあり。もし、次いで明確。もし、次いで、(ASのためのすべて)。最後に、yyyxxxI(N,0,y)I(N,0,y)\text{I}(N,0,y)0&lt;y∨I(N,0,y)0&lt;y∨I(N,0,y)0 < y \lor \text{I}(N,0,y)yyyxxxS(x)S(x)S(x)xxxx&lt;y,I(N,x,y)x&lt;y,I(N,x,y)xyx&gt;yx&gt;yx>yS(x)&gt;yS(x)&gt;yS(x) >yI(N,x,y)I(N,x,y)\text{I}(N,x,y)S(x)&gt;yS(x)&gt;yS(x) >yS(x)&gt;xS(x)&gt;xS(x) >xx∈Nx∈Nx\in \mathbb{N}x&lt;yx&lt;yx <y次に、定理Aによってまたはが得られ、どちらの場合も完了です。 S(x)&lt;yS(x)&lt;yS(x) < yI(N,S(x),y)I(N,S(x),y)\text{I}(N,S(x),y)(□)(◻)\begin{equation} \tag{$\square$} \end{equation} …

2
それ自体でプログラミング言語をコンパイルする
私はコンピュータサイエンスの学生です。独自のプログラミング言語(命令の少ない基本言語)を作成したい。 私は構文解析を行う方法を知っています。すでにPerlでそれを行いました。記事では、コンパイラーについて何かを読みました。コンパイラーはそれ自体で行われます。 たとえば、CコンパイラはCで書かれています。それはどのように可能ですか?自分の言語を作ることはできますが、どうすれば実行できるのかわかりません。何か案が? それは本当に良い質問で、ブログでプロジェクトを書くことができます。

1
図の交差するエッジの数を減らす方法は?
ダイアグラムエディターの作業をしています。ダイアグラムは、コネクター(エッジ)で接続された2D形状(ノード)を表示します。 ノードを選択して、それらを「解きほぐす」操作を追加したいと思います。可能であれば、交差するエッジの数を減らすためにノードを再配置します(また、エッジをベンドポイントで描画する必要がある場合は問題ありません)。 。 したがって、(トポロジ)グラフの埋め込みとそのノードのサブセットを前提として、交差するエッジの数を最小限に抑えるために、それらのノードのみの埋め込み(そのトポロジ)を変更するグラフアルゴリズムが必要です。 頂点グラフについて読んだり、CabelloとMohar(2013)を閲覧したりすると、この問題はNP困難であると思います。そのため、任意のパラメーター値に対して既知の多項式の時間複雑性を持つパラメーター化されたアルゴリズム(たとえば、交差するエッジの数)に満足します。これは実現可能に思えますが、自分でそのようなアルゴリズムを思いつくのは簡単ではありません。 質問: そのようなアルゴリズムはどこにありますか? 存在しますか? 既存のソフトウェアでは? そのような手術での重要な実務経験はありますか?(理論的には見た目が良いものは実際にはそれほど良くないかもしれませんし、逆もまた同様です。) (私はこの質問をするのに最適な場所がわかりません:ここ、StackOverflow、またはMathOverflowで?)

3
マルチプログラミングとマルチタスクの違いは何ですか
マルチプログラミングとマルチタスクを明確に区別するのは難しいと感じています。 私の主な情報源はWikipediaでしたが、WPの記事は、評判の低い情報源(大学の教授など)とは少し矛盾しているようです。 私がWPを読んだとき、マルチプログラミングは、プロセスがI / Oを待機しているときにコンテキストを切り替えることにより、CPUスループットを向上させる基本的な方法です。 マルチプログラミングでは、プログラムがタイムリーに実行されるという保証はありません。実際、最初のプログラムは、周辺機器へのアクセスを必要とせずに何時間も実行することができます。 協調時分割と同義で、協調マルチタスクは、(それは同義ではないしている)マルチプログラミング上の改良です。CPUは定期的にコンテキストを切り替えて同時実行の印象を与えますが、プロセスは引き続き生成される必要があり、設計が不十分なプログラムはシステムの残りの部分を使い果たす可能性があります。 プリエンプティブマルチタスクは、スケジューリングをより積極的に制御し、一部のプロセスを他のプロセスよりも優先させます。 この概要は正しいですか?そうでない場合は、WPが正しくないためか、WPを誤って読み取ったためですか? 一部のソースがマルチプログラミングとマルチタスクを混同しているように見えるのはなぜですか?

5
効率的なアルゴリズムとは何ですか?
漸近的な振る舞いの観点から、何が「効率的な」アルゴリズムと考えられていますか?その時点で線を引く基準/理由は何ですか?個人的に、ようなように、私が単純に「サブ多項式」と呼ぶものはすべて効率的であり、は「非効率的」になります。しかし、多項式次数で効率的と呼ばれるものは何でも聞いています。理由は何ですか?f(n)=o(n2)f(n)=o(n2)f(n) = o(n^2)n1+ϵn1+ϵn^{1+\epsilon}Ω(n2)Ω(n2)\Omega(n^2)

2
Knuth-Morris-PrattアルゴリズムがBoyer-Mooreよりも速い例?
Knuth-Moriss-PrattアルゴリズムとBoyer-Mooreとの比較に関するこのページでは、Koyer-Mooreアルゴリズムがスキップ距離が短いためにKMPのパフォーマンスが向上する可能性があるケースについて説明します。 このケースを明確に示すことができる良い例(テキスト、パターン)を探しています。

3
数学/ CS記法の辞書を探しています
数学やCSの論文では、時々目まいがする記号の配列が使用されています。しかし、多くの人は、1か所ではめったに教えられないような基本的な知識を前提としています。特にCSの観点から、次のような辞書を探しています。 すべての基本的な数学記号をリストし、それらの意味と例を示します。同等の方法で時々使用されるシンボルについて話します。初心者のよくある間違いに気づくでしょう。 それは、単一の記号の異なる意味を取り巻く微妙さについて話します(辞書の同じ単語の複数の定義のように)。 これは、「サブセット」のような1つの単語の説明など、各シンボルの非常に簡潔な説明ではありません。 シンボルが時々「オーバーロード」される方法を示します。たとえば、はを整数として持つことができますが、がこの表記のセットになることもあり、このセットから要素を選択することを意味します。は、整数のセット1 \ ldots nを意味することもあれば、1要素の配列を意味することもあります。( xy)(バツy)\binom{x}{y}zzzzzz[ n ][ん][n]1 … n1…ん1 \ldots n さまざまな種類の「オブジェクト」をさまざまなシンボルまたはそれらを参照する同等の方法(ただしより明確)で記述する方法と、それらのオブジェクトで可能な操作について説明する場合があります。つまり、数学オブジェクトのAPIのようなものです。 すなわち、それは時々、数学的記述をどのように提示するかについてのさまざまなニュアンスの「スタイルマニュアル」になることもあります。これは、数学のスタック交換で質問を書く人にとって非常に役立つリソースです。ここで、多くの質問は、トリッキーな数学の慣習に適合しないことに基づいて意味をなさないものです。 いくつかの本の紹介には、これらの機能の多くがあります。しかし、理想的にはそれは別の治療になるでしょう。また、理想的にはもちろんそれはオンラインであるでしょう。ラテックスシンボルの表がありますが、実際には上記の基準の多くを満たしていません。 これらの機能に一致する「シンボルの辞書」を見た人はいますか? (または、このような適切な参照が存在しない場合、優れたwikiまたはFAQプロジェクトのように見えます。)

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