タグ付けされた質問 「efficiency」

問題を解決しながら、できるだけ少ないリソース(時間、スペースなど)を使用します。質問が具体的にリソースの使用に関するものであり、実行時間についてたまたま発生する一般的なアルゴリズムの質問ではない場合は、このタグを使用します。

2
動的プログラミングを使用して再帰アルゴリズムの時間の複雑さを軽減できるのはいつですか?
動的プログラミングは、再帰アルゴリズムの実行に必要な時間を短縮できます。動的プログラミングは、アルゴリズムの時間の複雑さを軽減するのに役立つことを知っています。再帰的アルゴリズムで満たされた場合、動的計画法を使用するとアルゴリズムの時間の複雑さが軽減されるという一般的な条件はありますか?動的プログラミングはいつ使用する必要がありますか?

2
指数関数的ではあるがPである問題
私は、「例外的に有用」なアルゴリズム/問題のリストを作成しようとしています。たとえば、本質的に非常に指数関数的であるように見えますが、最終的にそれらを解決するいくつかの特に賢いアルゴリズムを持っています。意味の例: 線形計画法(シンプレックスアルゴリズムは指数時間です。多項式時間解を見つけるのに長い時間がかかりました!) より一般的には、半正定値プログラミング 素数テスト 2-SATおよびHORNSAT 行列式の計算(これが難しいと思われない場合は、恒久的と考えてください) 完全に一致するものを見つける 有限単純群の分類を使用して達成できるさまざまなハードグループ理論の問題 複雑なForbidden Minorキャラクタリゼーション(任意の表面への埋め込み可能性、ツリー幅とブランチ幅の境界、デルタワイ還元可能グラフ)を使用して達成できるさまざまなハードグラフの問題 有界グループでの指数の計算(つまり、繰り返しの2乗によって達成されるように、\ log bステップでaを計算)abモッドkabモッドka^b \mod kログbログ⁡b\log b LLLアルゴリズムに依存する計算。(特別な場合:ユークリッドアルゴリズム。より一般的な場合:PSLQまたはHJLSアルゴリズム。) テイラー項のない制約問題(?)。私はこれを完全には理解していませんが、おそらく上記の2-SAT / HORNSATのケースと有限体上の線形代数を包含しているように聞こえます。長い投稿についてはこちらをご覧ください ホログラフィック縮小を介して計算可能な問題。 尊敬すべき言及として、私はグラフ同型も言及します。それはまだ非常に簡単()であり、他の多くの同型問題と同等だからです:nログ2nnログ2⁡nn^{\log^2 n} Digraphs / multigraphs / hypergraphs(一種の「より難しい」問題) 有限オートマトン/ CFG 明らかに、これらにはさまざまな困難がありますが、少なくとも一部の人々は、問題は難しいように聞こえるが扱いやすいという意味で「驚き」の感覚を持ちます。LPは比較的簡単に聞こえるかもしれませんが、実際のソリューションを構築するにはかなりの時間がかかりました。繰り返し二乗または2-SATを解くことは、学部生が独力で思いつく可能性がありますが、HORNSATを見ずにNP-Completeの問題のみを学んだ場合、NP-Completenessの自然な候補のように聞こえるかもしれません。CFSGを解くか、デルタワイ還元可能性をチェックする多項式の方法を持つことは、平均的な偉業ではありません。 これが理にかなっていることを願っています。ここには明らかに多くの主観的な属性がありますが、他の人が「明らかに難しい」問題に対する効率的な解決策であると思うものを聞いてみたいです。

2
すべてのコンテキストフリー言語と通常言語は効率的に決定可能ですか?
この図に出くわしたのは、コンテキストフリー言語と通常言語が効率的な問題の(適切な)サブセット(おそらく)であることを示しています。効率的な問題は決定可能なすべての問題のサブセットであることを完全に理解しています。なぜなら、それらを解決することはできますが、非常に長い時間がかかる可能性があるからです。PP\mathrm{P} コンテキストフリー言語と標準言語がすべて効率的に決定できるのはなぜですか?それらを解決するのに時間がかからないということですか?

3
逐次乗算よりも効率的な並列行列指数アルゴリズムはありますか?
実数の行列の累乗(正の整数)を見つけるために1つ必要です。効率的な行列乗算アルゴリズムはたくさんありますが(たとえば、一部の並列アルゴリズムはCannonのDNSです)、行列の能力を正確に見つけることを目的としたアルゴリズムであり、行列乗算の逐次実行よりも効率的ですか?特に並列アルゴリズムに興味があります。

3
量子コンピューターが古典的なコンピューターよりも効率的であるという証拠はありますか?
ショアーのアルゴリズムはしばしば引数として使用されます。因数分解の問題は、古典的なコンピューターの既知のアルゴリズムよりも速く解決できます。それでも、古典的なコンピューターが整数を効率的に因数分解できないことの証明はありません。 古典的なコンピュータよりも速くいくつかの問題を解決できる実際の証明量子コンピュータはありますか?

2
多数の副問題を伴う動的プログラミング
多数の副問題がある動的プログラミング。だから私はインタビューストリートからこの問題を解決しようとしています: グリッド・ウォーキング(50点のスコア) あなたはに位置しているの位置に次元グリッド。グリッドの次元は)です。1つのステップで、次元のいずれかを1つ前または後ろに歩くことができます。(したがって、常に可能な異なる動きがあります)。どの時点でもグリッドを離れないように、ステップをいくつ実行できますか?あなたは、任意のためならば、グリッドを離れる、どちらかまたは。(X 1は、xは2、... 、xはN)(D 1、D 2、... 、D N N 2 N M X I 、X I ≤ 0 X I > DのIをNNN(x1,x2,…,xN)(x1,x2,…,xN)(x_1,x_2,\dots,x_N)(D1,D2,…,DN(D1,D2,…,DN(D_1,D_2,\dots,D_NNNN2N2N2NMMMxixix_ixi≤0xi≤0x_i \leq 0xi>Dixi>Dix_i > D_i 私の最初の試みは、このメモ化された再帰的な解決策でした: def number_of_ways(steps, starting_point): global n, dimensions, mem #print steps, starting_point if (steps, tuple(starting_point)) in mem: return mem[(steps, tuple(starting_point))] val = 0 if …

1
絞り込みタイプの推測
職場では、動的言語に関する型情報を推論する必要があります。次のように、ステートメントのシーケンスをネストされたlet式に書き換えます。 return x; Z => x var x; Z => let x = undefined in Z x = y; Z => let x = y in Z if x then T else F; Z => if x then { T; Z } else { F; Z } 一般的なタイプ情報から始めて、より具体的なタイプを推測しようとしているので、自然な選択は絞り込みタイプです。たとえば、条件演算子は、trueブランチとfalseブランチの型の和集合を返します。単純なケースでは、非常にうまく機能します。 ただし、次のタイプを推測しようとしたときに、思わぬ障害に遭遇しました。 function …
11 programming-languages  logic  type-theory  type-inference  machine-learning  data-mining  clustering  order-theory  reference-request  information-theory  entropy  algorithms  algorithm-analysis  space-complexity  lower-bounds  formal-languages  computability  formal-grammars  context-free  parsing  complexity-theory  time-complexity  terminology  turing-machines  nondeterminism  programming-languages  semantics  operational-semantics  complexity-theory  time-complexity  complexity-theory  reference-request  turing-machines  machine-models  simulation  graphs  probability-theory  data-structures  terminology  distributed-systems  hash-tables  history  terminology  programming-languages  meta-programming  terminology  formal-grammars  compilers  algorithms  search-algorithms  formal-languages  regular-languages  complexity-theory  satisfiability  sat-solvers  factoring  algorithms  randomized-algorithms  streaming-algorithm  in-place  algorithms  numerical-analysis  regular-languages  automata  finite-automata  regular-expressions  algorithms  data-structures  efficiency  coding-theory  algorithms  graph-theory  reference-request  education  books  formal-languages  context-free  proof-techniques  algorithms  graph-theory  greedy-algorithms  matroids  complexity-theory  graph-theory  np-complete  intuition  complexity-theory  np-complete  traveling-salesman  algorithms  graphs  probabilistic-algorithms  weighted-graphs  data-structures  time-complexity  priority-queues  computability  turing-machines  automata  pushdown-automata  algorithms  graphs  binary-trees  algorithms  algorithm-analysis  spanning-trees  terminology  asymptotics  landau-notation  algorithms  graph-theory  network-flow  terminology  computability  undecidability  rice-theorem  algorithms  data-structures  computational-geometry 

3
効率的な計算の概念
多項式時間のチューリングマシンアルゴリズムは、最悪の場合の実行時間が入力サイズの多項式関数によって制限されている場合に効率的であると見なされます。私は強い教会チューリング論文を知っています: Turingマシンで合理的な計算モデルを効率的にシミュレーションできます しかし、私は -calculusのアルゴリズムの計算の複雑さを分析するための確かな理論を知りません。λλ\lambda 既知のすべての計算モデルについて、計算効率の概念はありますか?計算可能性の質問だけに役立つが、計算の複雑さの質問には役に立たないモデルはありますか?

3
整数の範囲を効率的に格納するデータ構造はどれですか。
コレクションを0から65535の範囲の整数で保持する必要があるため、次のことをすばやく実行できます。 新しい整数を挿入する 連続する整数の範囲を挿入する 整数を削除する 整数以下のすべての整数を削除します 整数が存在するかどうかをテストします 私のデータには、コレクションに整数の実行が含まれることが多いという特性があります。たとえば、ある時点でのコレクションは次のようになります。 { 121, 122, 123, 124, 3201, 3202, 5897, 8912, 8913, 8914, 18823, 18824, 40891 } 最も単純なアプローチは、C ++ std :: setのようなバランスのとれたバイナリツリーを使用することですが、それを使用して、私はしばしば数値の実行があるという事実を利用していません。おそらく、範囲のコレクションを格納する方が良いでしょうか?しかし、これは、範囲内の整数が削除された場合、または2つの範囲間のスペースが埋められた場合に結合された場合、範囲を分割できる必要があることを意味します。 この問題に適している既存のデータ構造はありますか?

4
5つの小さい整数のうち最大の2つをできるだけ早く見つける
小さな組み込みシステムの画像データに5クロスメディアンフィルターのバリエーションを使用します。 x x x x x アルゴリズムは本当にシンプルです。5つの符号なし整数値を読み取り、最高の2を取得し、それらについていくつかの計算を行い、符号なし整数の結果を書き戻します。 5つの整数入力値がすべて0〜20の範囲にあるのはすばらしいことです。計算された整数値も0〜20の範囲です。 プロファイリングを通じて、最大の2つの数値を取得することがボトルネックであることを理解したので、この部分を高速化したいと思います。この選択を実行する最も速い方法は何ですか? 現在のアルゴリズムは、5つの数値とHWがサポートするCLZ関数によって指定された位置に1を持つ32ビットマスクを使用します。 CPUは専有のCPUであり、社外では利用できません。私のコンパイラはGCCですが、このCPU用にカスタマイズされています。 ルックアップテーブルを使用できるかどうかを確認しようとしましたが、使用できるキーを生成できませんでした。 入力には組み合わせがありますが、順序は重要ではありません。つまり、と同じです。21521521^5[5,0,0,0,5][5,5,0,0,0] 以下のハッシュ関数が衝突することなく完全なハッシュを生成することが起こります! def hash(x): h = 0 for i in x: h = 33*h+i return h しかし、ハッシュは巨大であり、それを使用するのに十分なメモリがありません。 私が使用できるより良いアルゴリズムはありますか?ルックアップテーブルを使用してキーを生成することで問題を解決できますか?

1
n個の文字列が与えられた場合、それらの1つは別の部分文字列ですか?
nnn文字列のコレクションが与えられたとしますS1,…,SnS1,…,SnS_1,\dots,S_n。これらの文字列のいずれかがコレクション内の他の文字列の部分文字列であるかどうかを知りたいのですが。つまり、次のタスクのアルゴリズムが必要です。 入力:S1,…,SnS1,…,SnS_1,\dots,S_n 出力:i,ji,ji,jようなSiSiS_iの部分文字列であるSjSjS_jとi≠ji≠ji\ne j、またはNoneがない場合は、このようなi,ji,ji,jが存在 これのための効率的なアルゴリズムはありますか? 「部分文字列」を「接頭辞」で置き換える場合、効率的なアルゴリズムがあります(文字列を並べ替えてから、線形スキャンを実行して隣接する文字列を比較します。並べ替えにより、部分文字列が確実に隣接します)。しかし、文字列が他の文字列の部分文字列であるかどうかをテストすることは、より困難に思えます。単純なアルゴリズムは、すべてのペアを反復処理することですが、これにはΘ (n 2)サブストリングテストが必要です。より効率的なアルゴリズムはありますか?i,ji,ji,jΘ(n2)Θ(n2)\Theta(n^2) これを「すべてのペアの部分文字列テスト」などと呼ぶことができると思います。 私の最終的な目標は、コレクション内の何かの部分文字列である各文字列を削除することにより、コレクションをプルーニングして文字列が他の文字列の部分文字列にならないようにすることです。

2
少ないメモリフットプリントでセット実装を探す
セットデータタイプの実装を探しています。つまり、 サイズuのユニバースU = \ {0、1、2、3、\ dots、u – 1 \}からの動的サブセットSSS(サイズnnn)を維持します。U={0,1,2,3,…,u–1}U={0,1,2,3,…,u–1}U = \{0, 1, 2, 3, \dots , u – 1\}uuu 操作insert(x)(要素xをSに追加SSS)およびfind(x)(要素xがSのメンバーかどうかをチェックSSS) 他の操作は気にしません。オリエンテーションについては、私が使用しているアプリケーションでu≈1010u≈1010u \approx 10^{10}ます。 時間O(1)O(1)O(1)で両方の操作を提供する実装を知っているので、主にデータ構造のサイズを心配します。何十億ものエントリを期待していますが、できるだけスワッピングを避けたいです。 必要に応じて、ランタイムを犠牲にしてもかまいません。O(\ log n)の償却実行時間O(logn)O(log⁡n)O(\log n)は、私が認めることができるものです。予想されるランタイムまたは\ omega(\ log n)のランタイムω(logn)ω(log⁡n)\omega(\log n)は許可されません。 私の考えの1つは、SSSを範囲の和集合として表すことができれば[xmin, xmax]、パフォーマンスがいくらか低下する代わりに、ストレージサイズを節約できるということです。また、など、他のいくつかのデータパターンも可能[0, 2, 4, 6]です。 そのようなことを行うことができるデータ構造を私に教えてもらえますか?

3
文字列が回文の連結であるかどうかをチェックするアルゴリズムはありますか?
文字のシーケンスが回文の連結であることを確認する線形時間アルゴリズムはありますか?私の頭に浮かぶのは、単純な解決策だけです。 1. k = 1 2. Split string into k substrings (all possibilities) and check 3. k++ 4. repeat 注:長さ1の文字列が回文であると定義されている場合、答えは自明です。これはそうではないと仮定しましょう。

3
割り切れないペアごとの最大サブセット
数値のセットがあり、その要素の任意の2つの要素の合計が整数割り切れないように最大サブセットを計算したいと考えています。この問題を解決しようとしましたが、効率的な応答ではない2次の解を見つけました。。ここで、は要素の数、は定数です。二次解より良いですか?K &lt; 100 、N &lt; 10000 N KKKK K&lt;100,N&lt;10000K&lt;100,N&lt;10000K < 100, N < 10000NNNKKK

4
大きなデータにアルゴリズムを適用する
大きなデータ(つまり、メインメモリに完全にロードできないデータ)に一般的なアルゴリズム(並べ替え、検索など)を効率的に適用する方法と、それらのアルゴリズムのコストを考慮してアルゴリズムを効率的に適用する方法を教える本またはチュートリアルはありますか?外部メモリからのブロック転送?たとえば、ほとんどすべてのアルゴリズムの教科書では、BおよびB +ツリーを使用してデータをディスクに格納できるとされています。ただし、実際にこれを行う方法、特にデータがディスク上に存在する場合のポインタの処理については説明されていません。同様に、多くの本は検索技術を教えていますが、二次記憶に存在するデータを考慮していません。 クヌースの本をチェックしました。これらのアイデアについて説明していますが、実際にそれらを高級言語に適用する方法はまだわかりませんでした。これらの詳細について説明している参考資料はありますか?

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