問題タブ [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.

0 投票する
32 に答える
67360 参照

theory - O(1/n) アルゴリズムはありますか?

O(1/n) アルゴリズムはありますか?

または、O(1) 未満のものはありますか?

0 投票する
1 に答える
1208 参照

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 つの連立一次方程式の解法 (別の方程式もあります) と転置。反転よりも少なくとも数値的に安定していると思いますか?

ありがとう。

0 投票する
18 に答える
9592 参照

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 の最適な表現方法がわかりません)。

0 投票する
3 に答える
405 参照

algorithm - アルゴリズムの実行時間をモデル化する方法は?

アルゴリズム実行時間のどのモデルが存在しますか?

私たちは皆、mergesort が bublesort よりも高速であることを期待しており、mergesort は O(n log n) の比較を行うのに対して、bublesort の場合は O(n 2 ) を行うことに注意してください。

他のアルゴリズムでは、ポインター逆参照、配列ルックアップ、固定サイズの整数の算術演算など、(比較とスワップ以外の) 他の操作をカウントします。

実行時間をモデル化する他の方法はありますか?

私自身が知っているのは、ディスクから読み取られ、ディスクに書き込まれたブロックの数を数えることです。Big-O表記が失敗するのはいつですか?に対する私の回答を参照してください。長い説明のために。

もう 1 つは、キャッシュ ミスの数を数えることです。これは、メモリ階層のすべてのレベルを調べることで、I/O モデルを拡張します。

分散アルゴリズム (安全なマルチパーティ計算など) の 3 つ目は、ネットワークを介して送信されたデータの量をカウントすることです (通常、通信のラウンドまたはメッセージ数で測定されます)。

アルゴリズムのパフォーマンスを予測するために数えるべき (そして数えない!) 他に興味深いものは何ですか?

また、これらのモデルはどれくらい優れていますか? 私が聞いた限りでは、キャッシュを無視するアルゴリズムは、ディスク上のデータに対する I/O 効率の高いアルゴリズムと競合しますが、インメモリ アルゴリズムでは競合しません。

具体的には、これらのモデルが相対的なパフォーマンスを誤って予測するのは、具体的にどのような場合ですか? 私自身の実験によると、データがメモリに収まるほど小さい場合、フィボナッチ ヒープは (バイナリ ヒープと比較して) Dijstra の最短パスを高速化しません。

0 投票する
2 に答える
588 参照

data-structures - 高速マージを可能にするマップ データ構造はありますか?

少なくともO(log n)挿入、削除、アクセス、およびマージを行うマップ データ構造はありますか?

AVL 木黒木などのほとんどの自己均衡二分木は、これらの特性のほとんどを備えていますが、それらには融合があると私は信じています。マージが高速なデータ構造はありますか?O(n log n)

編集:私は周りを見回しましたが、このようなものは見つかりません。そのようなデータ構造がない場合、なぜこれが不可能なのかについての洞察が欲しいです。

0 投票する
3 に答える
816 参照

big-o - これら 2 つの関数の big-Oh 表記法を使用した成長率の最小上限は?

Big Oh Notation で一番苦労しました。あなたが私を助けてくれないかと思っていました。これら 2 つの関数の big-Oh 表記法を使用した成長率の最小上限は?

0 投票する
8 に答える
875 参照

algorithm - diff は独自のゲームで打ち負かすことができますか?

2 つのファイルを比較するために使用する適切なアルゴリズムを探しています。diffいくつかの制約が追加されたため、より良いことができると思います。

私が持っているのは、それぞれファイルのリストを含む 2 つのテキスト ファイルです。これらは、2 つの異なる時点で取得された、システム上のすべてのファイルのスナップショットです。2 つのスナップショット間で追加または削除されたファイルを特定したいと考えています。

これらのファイルを比較するために使用できますdiffが、次の理由により使用しません。

  1. diffファイル内のどのチャンクが変更されたかを見つけて、変更をグループ化しようとします。変更された行のリストを探しているだけで、最長共通部分列などを見つけるよりもはるかに簡単な問題になるはずです。

  2. 一般化された差分アルゴリズムは、実行時または空間でO(mn)です。時間でO(m+n) 、空間でO(1)のようなものを探しています。

問題の制約は次のとおりです。

  1. ファイルのリストは、両方のファイルで同じ順序になっています。必ずしもアルファベット順ではありませんが、相対順序は同じです。

  2. ほとんどの場合、リスト間に違いはありません。違いがある場合、通常、新規/削除されたファイルはほんの一握りです。

  3. 「このディレクトリ全体が削除されました」や「100 ~ 200 行が新しい」など、結果をグループ化する必要はありません。異なる各行を個別にリストできます。

これは、並べ替えられた 2 つのリストがあり、2 つのリストの違いを見つけようとする問題と同じだと思います。問題は、リスト項目が必ずしもアルファベット順にソートされているとは限らないため、ある項目が別の項目より「大きい」かどうかわからないことです。両方のリストに存在するファイルが同じ順序になることがわかっているだけです。

参考までに、数年前にこの質問をAsk Metafilter投稿しました。事前にいくつかの潜在的な回答に回答させてください.

回答:この問題はLongest Common Subsequenceと呼ばれます。

応答:単純なアルゴリズムはO(mn)時間/空間で実行され、より優れたアルゴリズムは複雑で「ヒューリスティック」であるため、最長の一般的なサブシーケンスを回避しようとしています。私の直感では、追加された制約により線形時間アルゴリズムが存在することがわかります。

答え:アルファベット順に並べ替えてから比較してください。

応答:それはO(m log m+n log n)になり、 O(m+n)よりも悪くなります。

0 投票する
9 に答える
17926 参照

algorithm - 1 の phi(k) の計算

N が大きい場合、 1 < k < N となるようにすべての phi(k) を反復処理する必要があります。

  • 時間複雑度はO(N logN)
  • memory-complexity はサブでなければなりませんO(N)(N の値が約 10 12になるため)

出来ますか?もしそうなら、どのように?


WPF & MIME タイプ

レポートを生成するWPFアプリケーションについてです。

レポートの構造は単純です: byte[] m_Data, string m_Mime.

データ配列が作成され、MIME タイプが設定されました。ここで必要なのは、Web ブラウザーにあるのと同じ機能を持つダイアログを表示することです。応答の MIME タイプに応じて、適切なアプリケーションでファイルを開く [開く/保存/キャンセル] ダイアログです。

0 投票する
15 に答える
140577 参照

java - Javaハッシュマップ検索は本当にO(1)ですか?

SO re Java ハッシュマップとそのO(1)検索時間に関する興味深い主張を見てきました。誰かがなぜそうなのか説明できますか? これらのハッシュマップが、私が購入したハッシュ アルゴリズムのいずれかと大きく異なる場合を除き、衝突を含むデータセットが常に存在する必要があります。

その場合、ルックアップはO(n)ではなくO(1).

誰かがO(1) であるかどうかを説明できますか?もしそうなら、どうやってこれを達成したのでしょうか?