問題タブ [big-o]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
theory - O(1/n) アルゴリズムはありますか?
O(1/n) アルゴリズムはありますか?
または、O(1) 未満のものはありますか?
matrix - 行列を逆にするか、右辺が複数ある 3 つの連立一次方程式を解くか、どちらがより高速で安定していますか?
各再帰ラウンドで解いている2つの方程式があります。
X = A - inv(B) * Y * inv(B), X = X + A' * inv(B) * A,
私はこのように問題を解決します:
C = inv(B) Y <=> BC = Y、C を解く D = C inv(B) <=> DB = C <=> B'D' = C'、D' を解く
E = inv(B)*A <=> BE = A、E を解きます。
すべての行列は時間の経過とともに変化するため、再帰のたびにこれ (または反転) を行う必要があります。N は通常 1 ~ 10 程度、場合によってはそれ以上ですが、通常はその程度です。B は正定なので、コレスキーを因数分解に使用して、複数の右辺の方程式を解くことができます。
これは、単に B を反転してから行列の乗算を行うよりもはるかに遅いですか、それとも速いですか? 1 つの反転と 3 つの連立一次方程式の解法 (別の方程式もあります) と転置。反転よりも少なくとも数値的に安定していると思いますか?
ありがとう。
algorithm - Big-O 記法が失敗するのはいつですか?
Big-O記法[1]が実際に失敗する例は何ですか?
つまり、アルゴリズムの Big-O 実行時間から、アルゴリズム A がアルゴリズム B よりも高速であると予測されるのはいつで、実際にアルゴリズム B を実行するとアルゴリズム B の方が高速になるのでしょうか?
もう少し広い: アルゴリズムのパフォーマンスの不一致に関する理論的予測で実行時間が観察されるのはいつですか? Big-O 以外の予測は、検索ツリーの平均/予想回転数、または並べ替えアルゴリズムの比較数に基づく場合があり、係数と要素数の積として表されます。
明確化:
一部の回答が述べていることにもかかわらず、Big-O 表記はアルゴリズムのパフォーマンスを予測することを目的としています。とはいえ、これは欠陥のあるツールです。漸近的なパフォーマンスについてのみ話し、定数要因をぼやけさせます。これには理由があります。アルゴリズムを実行するコンピューターに関係なく、アルゴリズムのパフォーマンスを予測するためです。
私が知りたいのはこれです: このツールの欠陥はいつ現れますか? Big-O 記法はそれなりに便利ですが、完璧にはほど遠いことがわかりました。落とし穴、エッジケース、落とし穴は何ですか?
私が探しているものの例: バイナリ ヒープの代わりにフィボナッチ ヒープを使用してダイクストラの最短パス アルゴリズムを実行すると、n に対して O(m + n log n) 時間と O((m+n) log n) 時間が得られます。頂点と m 個の辺。遅かれ早かれ、フィボナッチ ヒープによる速度の向上を期待するでしょうが、私の実験では速度の向上は実現しませんでした。
(証明なしの実験的証拠は、一様にランダムなエッジの重みで動作するバイナリ ヒープが O(log n) 時間ではなく O(1) 時間を費やすことを示唆しています。 DecreaseKey の呼び出し回数)。
[1] 実際、失敗するのは表記法ではなく、表記法が表す概念と、アルゴリズムのパフォーマンスを予測するための理論的アプローチです。</反ペダントリー>
受け入れられた答えについて:
私が望んでいた種類の回答を強調する回答を受け入れました。同じくらい良い多くの異なる答えが存在します:)私が答えについて気に入っているのは、Big-O表記が「失敗」するとき(キャッシュミスが実行時間を支配するとき)の一般的なルールを示唆していることです。これにより、理解が深まる可能性があります(ある意味でATM の最適な表現方法がわかりません)。
algorithm - アルゴリズムの実行時間をモデル化する方法は?
アルゴリズム実行時間のどのモデルが存在しますか?
私たちは皆、mergesort が bublesort よりも高速であることを期待しており、mergesort は O(n log n) の比較を行うのに対して、bublesort の場合は O(n 2 ) を行うことに注意してください。
他のアルゴリズムでは、ポインター逆参照、配列ルックアップ、固定サイズの整数の算術演算など、(比較とスワップ以外の) 他の操作をカウントします。
実行時間をモデル化する他の方法はありますか?
私自身が知っているのは、ディスクから読み取られ、ディスクに書き込まれたブロックの数を数えることです。Big-O表記が失敗するのはいつですか?に対する私の回答を参照してください。長い説明のために。
もう 1 つは、キャッシュ ミスの数を数えることです。これは、メモリ階層のすべてのレベルを調べることで、I/O モデルを拡張します。
分散アルゴリズム (安全なマルチパーティ計算など) の 3 つ目は、ネットワークを介して送信されたデータの量をカウントすることです (通常、通信のラウンドまたはメッセージ数で測定されます)。
アルゴリズムのパフォーマンスを予測するために数えるべき (そして数えない!) 他に興味深いものは何ですか?
また、これらのモデルはどれくらい優れていますか? 私が聞いた限りでは、キャッシュを無視するアルゴリズムは、ディスク上のデータに対する I/O 効率の高いアルゴリズムと競合しますが、インメモリ アルゴリズムでは競合しません。
具体的には、これらのモデルが相対的なパフォーマンスを誤って予測するのは、具体的にどのような場合ですか? 私自身の実験によると、データがメモリに収まるほど小さい場合、フィボナッチ ヒープは (バイナリ ヒープと比較して) Dijstra の最短パスを高速化しません。
big-o - これら 2 つの関数の big-Oh 表記法を使用した成長率の最小上限は?
Big Oh Notation で一番苦労しました。あなたが私を助けてくれないかと思っていました。これら 2 つの関数の big-Oh 表記法を使用した成長率の最小上限は?
algorithm - diff は独自のゲームで打ち負かすことができますか?
2 つのファイルを比較するために使用する適切なアルゴリズムを探しています。diff
いくつかの制約が追加されたため、より良いことができると思います。
私が持っているのは、それぞれファイルのリストを含む 2 つのテキスト ファイルです。これらは、2 つの異なる時点で取得された、システム上のすべてのファイルのスナップショットです。2 つのスナップショット間で追加または削除されたファイルを特定したいと考えています。
これらのファイルを比較するために使用できますdiff
が、次の理由により使用しません。
diff
ファイル内のどのチャンクが変更されたかを見つけて、変更をグループ化しようとします。変更された行のリストを探しているだけで、最長共通部分列などを見つけるよりもはるかに簡単な問題になるはずです。一般化された差分アルゴリズムは、実行時または空間でO(mn)です。時間でO(m+n) 、空間でO(1)のようなものを探しています。
問題の制約は次のとおりです。
ファイルのリストは、両方のファイルで同じ順序になっています。必ずしもアルファベット順ではありませんが、相対的な順序は同じです。
ほとんどの場合、リスト間に違いはありません。違いがある場合、通常、新規/削除されたファイルはほんの一握りです。
「このディレクトリ全体が削除されました」や「100 ~ 200 行が新しい」など、結果をグループ化する必要はありません。異なる各行を個別にリストできます。
これは、並べ替えられた 2 つのリストがあり、2 つのリストの違いを見つけようとする問題と同じだと思います。問題は、リスト項目が必ずしもアルファベット順にソートされているとは限らないため、ある項目が別の項目より「大きい」かどうかわからないことです。両方のリストに存在するファイルが同じ順序になることがわかっているだけです。
参考までに、数年前にこの質問をAsk Metafilterに投稿しました。事前にいくつかの潜在的な回答に回答させてください.
回答:この問題はLongest Common Subsequenceと呼ばれます。
応答:単純なアルゴリズムはO(mn)時間/空間で実行され、より優れたアルゴリズムは複雑で「ヒューリスティック」であるため、最長の一般的なサブシーケンスを回避しようとしています。私の直感では、追加された制約により線形時間アルゴリズムが存在することがわかります。
答え:アルファベット順に並べ替えてから比較してください。
応答:それはO(m log m+n log n)になり、 O(m+n)よりも悪くなります。
java - Javaハッシュマップ検索は本当にO(1)ですか?
SO re Java ハッシュマップとそのO(1)
検索時間に関する興味深い主張を見てきました。誰かがなぜそうなのか説明できますか? これらのハッシュマップが、私が購入したハッシュ アルゴリズムのいずれかと大きく異なる場合を除き、衝突を含むデータセットが常に存在する必要があります。
その場合、ルックアップはO(n)
ではなくO(1)
.
誰かがO(1) であるかどうかを説明できますか?もしそうなら、どうやってこれを達成したのでしょうか?