タグ付けされた質問 「runtime-analysis」

入力サイズの増加に伴うアルゴリズムのランタイムの増加を推定する方法に関する質問。

1
ブルートフォースドローネ三角形分割アルゴリズムの複雑
Mark de Berg等の著書「Computational Geometry:Algorithms and Applications」には、ドロネー三角形分割を計算するための非常に単純なブルートフォースアルゴリズムがあります。このアルゴリズムは、無効なエッジの概念を使用します。有効なドローネ三角形分割では表示されず、他のエッジに置き換える必要があるエッジです。各ステップで、アルゴリズムはこれらの不正なエッジを検出し、不正なエッジがなくなるまで必要な変位(エッジフリップと呼ばれる)を実行します。 アルゴリズムLegalTriangulation(TTT) 入力。いくつかの三角TTT点セットのPPP。 出力。法的三角形分割PPP。 一方、 違法なエッジが含まれているP I 、P jの DOTTTpipjpipjp_ip_j \quadしてみましょうとP I 、P J P lは隣接する2つの三角形ことのp のi のp J。pipjpkpipjpkp_i p_j p_kpipjplpipjplp_i p_j p_lpipjpipjp_ip_j \quadTから削除し、代わりにp k p lを追加します。Tを返します。pipjpipjp_ip_jTTTpkplpkplp_kp_l TTT このアルゴリズムは最悪の場合O(n2)O(n2)O(n^2)時間で実行されると聞きました。ただし、この記述が正しいかどうかは明確ではありません。はいの場合、この上限をどのように証明できますか?

3
DFA最小化のためのBrzozowskiのアルゴリズム
BrzozowskiのDFA最小化アルゴリズムは、以下によってDFA 最小DFAを構築GGGします。 内のすべてのエッジ反転GGG、初期状態を作るAN状態を受け入れ、NFA取得するには、初期状態を受け入れるN′N′N'逆言語に対して、 パワーセット構造を使用して、逆言語のを取得しG′G′G'ます。 のエッジを反転(および初期受け入れスワップ)して、元の言語のG′G′G'NFA を取得します。NNN GminGminG_{\min} もちろん、一部のDFAには指数関数的な大きな逆DFAがあるため、このアルゴリズムは入力のサイズに関して最悪の場合指数関数的に実行されるため、逆DFAのサイズを追跡できます。 場合は入力DFAのサイズは、最小限DFAの大きさで、かつ最小限逆DFAの大きさを、その後の面でBrzozowskiのアルゴリズムの実行時間何であるN、N、およびmは? nは mはNNNnnnmmmNNNnnnmmm 特に、Brzozowskiのアルゴリズムは、とmのどの関係で、HopcroftまたはMooreのアルゴリズムよりも優れていますか?nnnmmm Practice / Applicationの典型的な例では、Brzozowskiのアルゴリズムが他のアルゴリズムよりも優れていると聞いています。非公式には、これらの典型的な例はどのようなものですか?

4
セットの中央値を見つける必要があるアルゴリズムまたはデータ構造はありますか?
私のクラスであるRandomized Algorithmsのためにこの本を読んでいます。この特定の本では、ランダム選択を使用して配列の中央値を見つけることに専念するセクション全体があり、より効率的なアルゴリズムにつながります。今、私は、理論の改善に加えて、コンピューターサイエンスの領域で、このアルゴリズムの実用的なアプリケーションがあるかどうかを知りたかったのです。配列の中央値を見つける必要があるアルゴリズムまたはデータ構造はありますか?

2
アルゴリズム時間分析「入力サイズ」対「入力要素」
アルゴリズムの無症候性の上限を分析および説明するために使用するとき、「入力長」および「入力サイズ」という用語とまだ混同されています アルゴリズムの入力長は、多くの種類のデータとあなたが話しているアルゴリズムに依存しているようです。 一部の著者は、入力の長さを入力の表現に必要な文字のサイズに言及しているため、アルゴリズムの入力セットとして使用する場合の「abcde」は6文字の「入力長」になります。 文字の代わりに数字(たとえば整数)がある場合、文字の代わりにバイナリ表現が使用される場合があるため、「入力長」は(入力セットの最大数Lである)として計算されます。 。N∗log(L)N∗log(L)N*log(L) 数字であっても、入力設定されている場合、それらは「決定変数」として「入力長さ」を記述することを他の課題は、範囲内の数値を有する長さNの入力セットに対してので、ある(入力の長さがちょうどNでありますたとえば、サブセットの合計)、または問題を述べるために必要なバイナリの場所の値の数をさらに複雑にします(N ∗ l o g (L )とまったく同じだと思います)0−2320−2320-2^{32}N∗log(L)N∗log(L)N*log(L) そう: アルゴリズムに依存しますか? 各入力長「バージョン」を使用する意味とタイミング 使用するルールを決定するために使用できるルールはありますか?

1
Knuthの線形時間乗算アルゴリズムが「カウント」されないのはなぜですか?
乗算アルゴリズムに関するウィキペディアのページには、Donald Knuthによる興味深いものが記載されています。基本的には、フーリエ変換の乗算と対数サイズの乗算の事前計算テーブルを組み合わせることを含みます。線形時間で実行されます。 この記事は、このアルゴリズムのように機能し、「真の」乗算アルゴリズムとは見なされません。さらに重要なことは、乗算を均等なO(n lg n)時間で行えるかどうかは未解決の問題であると考えられていることです! このアルゴリズムのどの詳細が、「真の」乗算アルゴリズムとしてカウントすることを不適格にしますか? 私の推測は次のとおりです。 テーブルの事前計算には、線形時間以上の時間がかかります。一方、それはまだn lg n間に合うようにできるので、それでも印象的なように思えます。 ランダムアクセスはどういうわけか許可されていません。しかし、他のアルゴリズムがハッシュテーブルやポインターなどを使用できるのはなぜですか? 単一の命令で256ビットの乗算を行う256ビットマシンを使用している場合、2 ^ 256を超える要素が存在するまでこのアルゴリズムには意味がありません。一方、union-findでは逆アッカーマン因子に悩まされます。 「線形時間乗算アルゴリズムはありますか?」質問は、より弱いマシンという点で密かにですが、これはほのめかされるだけです。

2
Aho-CorasickアルゴリズムとRabin-Karpアルゴリズムの比較
複数のパターン検索をサポートする文字列検索アルゴリズムに取り組んでいます。実行時間の点で最も強力な候補のように見える2つのアルゴリズム、すなわちAho-CorasickとRabin-Karpを見つけました。しかし、2つのアルゴリズムの包括的な比較は見つかりませんでした。どのアルゴリズムがより効率的ですか?また、並列計算と複数パターン検索にはどちらが適していますか?最後に、必要なハードウェアリソースが少ないのはどれですか。 ACアルゴリズムの場合、検索フェーズは時間かかりますが、RKの場合はO (n m )です。ただし、RKの実行時間はあり、ACに類似しています。私の暫定的な結論は、RKはACほど多くのメモリを必要としないため、RKは実質的に優れているように見えるということです。あれは正しいですか?O (n + m )O(n+m)O(n+m)O (n m )O(nm)O(nm)O (n + m )O(n+m)O(n+m)

2
nマルチ選択kの複雑さを簡素化
私は繰り返しでnからk要素を選択することに相当する時間の複雑さを持つ再帰的アルゴリズムを持っています、そして私はより単純化されたbig-O式を得ることができるかどうか疑問に思っていました。私の場合、はよりも大きく、独立して成長します。kkknnn 具体的には、明示的な指数式を期待します。これまでに見つけた中で最高のものは、スターリングの近似に基づいているので、それを使用できますが、もっと良いものが得られるかどうか疑問に思いました。O(n!)≈O((n/2)n)O(n!)≈O((n/2)n)O(n!) \approx O((n/2)^n) O((n+k−1k))=O(?)O((n+k−1k))=O(?)O\left({{n+k-1}\choose{k}}\right) = O(?)

2
リストの代わりに検索ツリーを使用したハッシュ
私はハッシュと二分探索木資料と格闘しています。そして、同じハッシュ値を持つエントリを格納するためにリストを使用する代わりに、バイナリサーチツリーを使用することも可能だと私は読んだ。そして、私は操作の最悪の場合と平均の場合の実行時間を理解しようとします insert、 find そして delete 価値があります。平均的なケース。リストに関しては改善されますか?

2
ランタイムを実験的に比較するための標準はありますか?
私の状況 私が開発したソフトウェアモジュールを紹介する論文を書いており、そのランタイムを同じタスクの他のモジュールと比較したいと思います。ランタイムテストの欠点を認識していますが、私の場合は回避策がないと考えてください。(私は理論的にいくつかの特性を推定することができますが、それだけでは十分ではありません。) ベンチマークに使用したい特定のシナリオには、2つのパラメーターがあります。問題の複雑度 と、詳細な問題を決定するランダムシード です。主に私はへの依存を示したいです 。予備調査と理論によると、ランタイムへのの影響は小さいか無視できます。1つのタスクが完了するまでに最大で10分かかります。んんnrrrんんnrrr 実際の質問 私は、そのような実験を実行する上で一般的に受け入れられているか公開されている手順、または少なくとも一般的な落とし穴のリスト(理想的には公開)を探しています。 これまでに見つけたもの 何もない。インターネット検索は、あらゆる種類の無関係な結果を表示しますが、その場合、正しい用語を使用していない可能性があります。私が良い基準であることがわかっているキーワードの最小値を含めること(下記を参照)も役に立ちませんでした。 どうやってやるの すべての実験を、GUIなどの干渉する可能性のあるソフトウェアを可能な限り無効にして、同じマシンで実行します。 すべてのモジュールに同じ選択シナリオ、つまり同じおよび ます。んんnrrr シナリオごとに、さまざまなモジュールをランダムな順序で直接続けてテストします。つまり、さまざまなモジュールのループが最も内側のループです。これにより、マシンのパフォーマンスのゆるやかな変動(温度変化など)によるさまざまなモジュールへのバイアスを回避できます。ランダムな順序は、キャッシュや、同じモジュールの後に常にテストされる1つのモジュールなどの影響によるバイアスを回避する必要があります。 各について、ベンチマークとして異なるシードを使用して、いくつかのシナリオで最小ランタイムを取得します。これにより、マシンのパフォーマンスが短時間変動して、個々の実行が非常に悪くなるため、さまざまなモジュールへのバイアスが回避されます。んんn

2
乗算で
私が探していたここで、と私は2つの乗算のための最高の実行時に気づいたの数字を-bitsすることであるO (nは⋅ ログインN ⋅ 2 O (ログ* nで)が、私は簡単にその中に実行するアルゴリズムに気づくことができますO (N ⋅ log n )。んnnO (N ⋅ ログN ⋅ 2O (ログ∗n)O(n⋅log⁡n⋅2O(log∗⁡n)O(n\cdot \log n \cdot 2^{O(\log^* n)}O (N ⋅ ログn)O(n⋅log⁡n)O(n\cdot \log n) すべての後、我々は度から2つの多項式を乗算する方法を知っているにO (N ログN )実行時。しかし、多項式を乗算することは、2つのnビット数を乗算することと同じです。したがって、O (n log n )の 2つのnビット数を乗算するアルゴリズムがあります。発生する可能性のある唯一の問題はキャリーですが、各フェーズでO (n )時間でそれを修正でき、最後まで右端のビットとその左隣に移動します。つまり、私たちのランタイムが残っているものとO (N ⋅ ログのnんnnO (n ログn)O(nlog⁡n)O(n \log n)んnnんnnO (n ログn)O(nlog⁡n)O(n \log …

1
最長のフィボナッチ部分文字列を見つけるための単純なアルゴリズムの複雑さ
2つの記号と与えられた場合、番目のフィボナッチ文字列を次のように定義してみましょう:aa\text{a}bb\text{b}kkk F(k)=⎧⎩⎨baF(k−1)⋆F(k−2)if k=0if k=1elseF(k)={bif k=0aif k=1F(k−1)⋆F(k−2)else F(k) = \begin{cases} \text{b} &\mbox{if } k = 0 \\ \text{a} &\mbox{if } k = 1 \\ F(k-1) \star F(k-2) &\mbox{else} \end{cases} 文字列の連結を示します。⋆⋆\star したがって、次のようになります。 F(0)=bF(0)=bF(0) = \text{b} F(1)=aF(1)=aF(1) = \text{a} F(2)=F(1)⋆F(0)=abF(2)=F(1)⋆F(0)=abF(2) = F(1) \star F(0) = \text{ab} F(3)=F(2)⋆F(1)=abaF(3)=F(2)⋆F(1)=abaF(3) = F(2) \star F(1) = \text{aba} …

1
ポテンシャル関数バイナリヒープ抽出最大O(1)
最大ヒープが償却時間で完了するように、最大​​ヒープの潜在的な関数を理解する手助けが必要です。潜在的な方法をよく理解していないことを付け加えておきます。O (1 )O(1)O(1) 抽出のコストを削減するために、挿入関数はさらに「支払う」必要があることを知っています。これは、ヒープの高さに関するものでなければなり(if log (n )⌋がヒープの高さを与える場合挿入は2 log (n )または∑ n k = 1 2 log (k ))⌊ ログ(n )⌋⌊log⁡(n)⌋ \lfloor \log(n) \rfloor 2 ログ(n )2log⁡(n)2\log(n)Σんk = 12 ログ(k )∑k=1n2log⁡(k) \sum_{k=1}^n 2\log(k)

3
CLRSのd-aryヒープ問題
次の問題(質問1〜3)を解決しているときに混乱しました。 質問 D進ヒープは、バイナリヒープ似ているが、(一つの可能な例外を除いて)は、非リーフノードが有するD子供の代わりに、2人の子供。 配列のd- aryヒープをどのように表現しますか? n要素とd要素のd- aryヒープの高さは、nとdで何ですか? d -ary max-heap でのEXTRACT-MAXの効率的な実装を提供します。実行時間をdおよびnで分析します。 d -ary max-heap でのINSERTの効率的な実装を提供します。実行時間をdおよびnで分析します。 INCREASE-KEY(A、i、k)の効率的な実装を提供します。これは、k <A [i] = kの場合にエラーにフラグを立て、d進行列のヒープ構造を適切に更新します。実行時間をdおよびnで分析します。 私の解決策 配列A [ a1。。aん]あ[a1。。aん]A[a_1 .. a_n] ルートレベル1レベル2レベルk:a1:a2… a2 + d− 1:a2 + d… a2 + d+ d2− 1⋮:a2 + ∑i = 1k − 1d私… a2 + ∑i = 1kd私− 1ルート:a1レベル1:a2…a2+d−1レベル2:a2+d…a2+d+d2−1⋮レベルk:a2+Σ私=1k−1d私…a2+Σ私=1kd私−1\qquad …

4
アルゴリズムの自動ランタイム分析の方法はありますか?
私は疑問に思っています、少なくともアルゴリズムの関連するサブセット(分析可能なアルゴリズム)で機能する自動ランタイム分析の方法はありますか? 私は私に与えた「自動アルゴリズム分析」ググこれを、それはあまりにもMathyさんです。私が理解できるpsuedocodeの簡単な例が欲しいだけです。具体的すぎるかもしれませんが、一見の価値があると思いました。

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間隔と同様)に分割して、象限セグメントツリーを構築してサブ行列の合計を見つけることを考えることができますが、その証拠は私にはわかりません。

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