タグ付けされた質問 「search-algorithms」

特定のデータ構造(最も一般的にはツリー)内の要素を見つけるためのアルゴリズム。

2
O(k)メモリO(n)時間のみを使用して、指定されたシーケンスからk番目に小さい要素を見つける
一連のnnn数値を1つずつ読み取るとします。O (k )セルメモリを使用して線形時間(O (n ))でkkk番目に小さい要素を見つける方法。私たちは最初に保存すべきだと思うk個のシーケンスの条件をして取得するときのk + 1番目の用語を、私たちは必ずそれができないことを期削除のk番目に小さい要素[保存" のk + 1番目の用語を。したがって、各ステップでこの使用できない用語を示すインジケーターが必要であり、このインジケーターは各ステップですばやく更新される必要があります。「マックス」から始めましたO(k)O(k)O(k)O(n)O(n)O(n)kkkk+1k+1k+1kkkk+1k+1k+1; しかし、迅速に更新することはできません。つまり、maxを考慮した場合、最初の削除ではmaxを逃し、線形ではないO(k)O(k)O(k)とその原因(n−k)×O(k)(n−k)×O(k)(n-k)\times O(k)時間でmaxを検索する必要があります。おそらく、シーケンスの最初のkkk項をよりインテリジェントに保存する必要があります。 この問題を解決するにはどうすればよいですか?

1
プロセッサーを使用して
n 2台のコンピューターで時間の複雑さで並列に配列の最大値を見つけるアルゴリズムをクラスで提示されました。O (1 )O(1)O(1)ん2n2n^2 アルゴリズムは: 長さnの配列Aがあるとします。 長さnのフラグ配列Bを作成し、台のコンピューターでゼロで初期化します。んnn 最小値のインデックスでB内のすべての2つの要素とライト1を比較するのコンピュータ。ん2n2n^2 台のコンピューターを持つAで0のインデックスを見つけます。んnn 講師はnでそれができるかもしれないと私たちにからかった台のコンピューターとlogn時間の複雑さ。んログんnlog⁡n\frac{n}{\log n}ログんlog⁡n\log n たくさん考えた後、どうすればいいのかわからなかった。何か案が?

1
指示されたunion-find
エッジを動的に追加して特定のクエリを実行できる有向グラフについて考えGGGます。 例:分離セットフォレスト 次の一連のクエリについて考えてみます。 arrow(u, v) equiv(u, v) find(u) 最初のものは、矢印追加場合は、2番目の一方が決定し、グラフにしU ↔ * V、最後の一つはの同値クラスの正規代表見つけ↔ *を、すなわちA R (U )、その結果、U ↔ * V r (v )= r (u )を意味します。u→vu→vu→vu↔∗vu↔∗vu↔^*v↔∗↔∗↔^*r(u)r(u)r(u)u↔∗vu↔∗vu↔^*vr(v)=r(u)r(v)=r(u)r(v)=r(u) これらのクエリを準定数の償却済みの複雑さで実装する分離セットフォレストデータ構造を使用したよく知られたアルゴリズム、つまります。この場合、を使用して実装されていることに注意してください。O(α(n))O(α(n))O(α(n))equivfind より複雑なバリアント 今、私は方向が重要であるより複雑な問題に興味があります: arrow(u, v) confl(u, v) find(u) 最初は矢印追加し、秒はと両方から到達可能なノード、つまりがあるかどうかを決定します。最後のものは、が意味するようなオブジェクトを返す必要があり、は簡単に計算できるはずです。(たとえば、計算するために)。目標は、これらの操作が高速になるような適切なデータ構造を見つけることです。u→vu→vu→vwwwuuuvvvu→∗←∗vu→∗←∗vu→^*←^*vr(u)r(u)r(u)u→∗←∗vu→∗←∗vu→^*←^*vr(u)∙r(v)r(u)∙r(v)r(u) \bullet r(v)∙∙\bulletconfl サイクル グラフにはサイクルを含めることができます。 主要な問題のDAGのみを考慮するために、強連結成分を効率的かつ増分的に計算する方法があるかどうかはわかりません。 もちろん、DAGの解決策もありがたいです。これは、最も一般的でない祖先の増分計算に対応します。 素朴なアプローチ disjoint-setフォレストのデータ構造は、エッジの方向を無視するため、ここでは役に立ちません。そのノート、グラフがコンフルエントでない場合には、単一のノードにすることはできません。r(u)r(u)r(u) 一つは、定義することができと定義することがとして場合。しかし、これを段階的に計算する方法は?r(u)={v∣u→∗v}r(u)={v∣u→∗v}r(u)=\{v ∣ u→^*v\}∙∙\bulletS1∙S2S1∙S2S_1\bullet S_2S1∩S2≠∅S1∩S2≠∅S_1 ∩ S_2≠∅ おそらく、そのような大きなセットを計算することは役に立たないでしょうが、通常のunion-findアルゴリズムのように、小さなセットはより興味深いはずです。

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 

2
時間と空間の特定の数の決定(最悪の場合)
\newcommand\ldotd{\mathinner{..}}と仮定する整数であるようにすべてに対して、それぞれの出現特定の数を除く数は奇数です。発生が偶数である番号を見つけてください。A[1..n]A[1..n]A[1\ldotd n]0≤A[k]≤m0≤A[k]≤m0\le A[k]\le m1≤k≤n1≤k≤n1\le k\le nA[1..n]A[1..n]A[1\ldotd n] あり私たちはソート:アルゴリズムに、ブレーク要素の値がある多くの部分、には、同じため、各要素の出現回数を数えることができます。Θ(nlogn)Θ(nlog⁡n)\Theta(n\log n)A[1..n]A[1..n]A[1\ldotd n]B[1..n]B[1..n]B[1\ldotd n]B[1..n]B[1..n]B[1\ldotd n] 最悪の場合 -time-and- -spaceアルゴリズムを見つけたい。O(n)O(n)O(n)O(n)O(n)O(n) するとおよび、したがって、基数ソート許容されません。 ように、バイナリビット演算がます。m=Ω(n1+ϵ)m=Ω(n1+ϵ)m=\Omega(n^{1+\epsilon})ϵ>0ϵ>0\epsilon>0\DeclareMathOperator{\xor}{xor}A[1]xorA[2]A[1]xor⁡A[2]A[1]\xor A[2]

1
幅優先検索が時間実行されると言うのはなぜですか?
グラフの幅優先検索(BFS)の実行時間はO(| V | + | E |)であると(Wikipediaなどで)よく言われます。ただし、接続されたグラフには| V | \ leq | E | +1があり、接続されていないグラフであっても、BFSは開始頂点を含むコンポーネントの外側の頂点を決して見ません。そのコンポーネントには最大で| E |が含まれます エッジなので、最大で| E | +1個の頂点が含まれ、それらの頂点のみがアルゴリズムがアクセスします。G=(V,E)G=(V,E)G=(V,E)O(|V|+|E|)O(|V|+|E|)O(|V|+|E|)|V|≤|E|+1|V|≤|E|+1|V|\leq |E|+1|E||E||E||E|+1|E|+1|E|+1 これは、|V|+|E|≤2|E|+1|V|+|E|≤2|E|+1|V|+|E|\leq 2|E|+1であることを意味するので、実行時間はO(|E|)O(|E|)O(|E|)だけであると言ってみませんか? これは、Disjkstraのアルゴリズムの実行時間に関する質問へのコメントで生じました。

1
現代の正規表現の表現力
私は最近、主に単語のグループを特別なプロパティと照合する正規表現の課題を提案するWebサイトについて友人と話し合いました。彼は||||||||、数|が素数であるような文字列に一致する正規表現を探していました。そのような言語は、通常であれば、補題をポンプの翻訳が素数のためにあるという事実与えますので、私はすぐにそれが今まで動作しません彼に言われた十分な大きさ、それが存在するのk ≤ pがあるようP + N kは、すべての主要ですN ≥ - 1、よく、これは全くケースしにくい(素数の配分、そのような未知の自明とプロパティを破砕、...)pppk≤pk≤pk \leq pp+nkp+nkp + nkn≥−1n≥−1n \geq -1 しかし、誰かが解決策に付属している:一致しない(||+?)\1+ キャプチャグループに一致するように、この表現しようとする(つまりすることができ||、|||、||||などの上の出現箇所)のn ≥ 2回。一致する場合、文字列で表される数はkで割り切れるので、素数ではありません。それ以外の場合です。k≥2k≥2k \geq 2|n≥2n≥2n \geq 2kkk そして、グループ化と後方参照により、正規表現が理論的な意味で...正規表現よりも実際にはるかに表現力豊かになることが明らかになったので、私は愚かに感じました。今では、実際の正規表現を実行するときに私が知らなかったルックアラウンドやその他の演算子も追加されました。 ウィキペディアによると、文脈自由文法によって生成された言語よりもさらに表現力があります。だからここに私の質問があります: 現代の正規表現エンジンを使用して、(文脈自由文法から生成された)代数言語を表現できますか より一般的な説明、または現代の正規表現で説明できる言語の種類の複雑さの少なくとも上限はありますか? より実用的には、その背後に深刻な理論がありますか、それとも有限オートマトンに基づく実際の正規表現の最初のブロックに実装可能と思われるたびに新しい機能を追加するだけですか? 「モダンな正規表現」は質問が具体的ではないことを知っていますが、少なくとも後方参照を使用することを意味します。もちろん、この「現代の正規表現」言語に対する特定の制限を想定している部分的な回答者がいる場合は、遠慮なく投稿してください。

4
並べ替えなしで、並べ替えられていないリストでK番目に小さい値を見つける最も速い方法は何ですか?
私の初期アルゴリズム: 要素0を他のすべての要素と比較し、それより少ない要素の数を追跡します。 正確に(k-1)要素より大きい要素が見つかるまで、各要素について繰り返します。 最悪の場合、これはになると思います。リストをソートせずに実行時間を短縮できますか?O(n2)O(n2)O(n^2)

1
プレフィックスパリティ問題のアルゴリズム
プレフィックスパリティの問題は、次のように定義できます。長さ文字列が与えられ、最初はすべての文字がです。次に、次のような更新をサポートできるデータ構造を構築します。n 0SSSんnn000 特定のについて、をまたは変更しますS [ i ] 0 1私iiS[ 私]S[i]S[i]000111 与えられたに対して、のパリティを見つけます。S [ 1 ] + S [ 2 ] + 。。。+ S [ i ]私iiS[ 1 ] + S[ 2 ] + 。。。+ S[ 私]S[1]+S[2]+...+S[i]S[1]+S[2]+...+S[i] 私の頭の上から、データ構造を構築するために線形空間と線形前処理時間のみを使用しながら、時間でこれらのタイプのクエリをサポートできるソリューションがあり。葉が個々の文字に対応する文字列の上に完全なバイナリ検索ツリーを構築し、すべての内部ノードに、そのノードで定義されたサブツリーで葉であるすべての文字の合計を格納するという考え方です。このようにして、両方の更新を時間で簡単にサポートできます。S O (log n )O (ログn )O(log⁡n)O(\log n)SSSO (ログn )O(log⁡n)O(\log n) しかし、私はこの問題の下限を証明する論文を見つけました。更新についてはよりも優れているとは言えず、次の論文も見つけましたhttp://link.springer.com/chapter/10.1007%2F3-540-51542-9_5、およびpdfへの直接リンク。その範囲を達成するアルゴリズムを提供するため、最適です。O (ログんログログん)O(log⁡nlog⁡log⁡n)O(\frac{\log n}{\log \log n}) …


3
コストを過小評価している場合でも、A *検索ヒューリスティックが最適なのはなぜですか?
A *検索は、ヒューリスティックが許容可能である限り、問題の最適な解決策を見つけます。つまり、特定のノードからへのパスのコストを過大評価することは決してありません(そして、一貫性がありますが、現時点では許容可能であることに焦点を当てましょう)。 しかし、ヒューリスティックが過小評価している場合、なぜ最適なソリューションが常に見つかるのでしょうか。たとえば、最適な経路を過小評価するよりも、非最適な経路を過小評価する場合、それは過大推定と同等ではありませんか?

1
Rabin–Karpでハッシュを計算するために使用される基底が常に素数であるのはなぜですか?
Rabin–Karp文字列照合アルゴリズムには、迅速に計算できるハッシュ関数が必要です。一般的な選択は h(x0…xn)=∑i=0nbixi,h(x0…xn)=∑i=0nbixi, h(x_0\ldots x_n) = \sum_{i=0}^n b^i x_i, どこ bbbあるプライム(すべての計算は、モジュールです2w2w2^w、 どこ wwwマシンワードの幅です)。なぜそれが重要なのかbbb プライムになるには?

1
いくつかのノード間の有向グラフで指定された長さ未満のすべてのパス
有向グラフまたは無向グラフ内のいくつかのノード間のすべての可能なパス、または指定された長さのすべての可能なパスをカウントすることは、古典的な問題です。可能性のサイクルにより、すべての意味に注意を払う必要があります。 この質問は少し異なる、または少なくとも私は思います。 INPUT: してG有向グラフ。Gは、サイクルと自己接続ノードを持つことができます。してみましょうA(G)はの隣接行列もG(中1とG I、J Iからjに行くリンクとそうでない場合は0があります場合)。Gのノードの2つのサブセットであるTとBを定義します。 結果:Tの 1つのノードからBの 1 つのノードに向かう、最大で k のすべてのパスのリスト。パスは、ソースノードからターゲットノードに厳密にk + 1ステップ未満で進む限り、同じエッジを複数回含むことができます。 質問:このタスクで最適なアルゴリズムを知りたいのですが。隣接行列のn乗がシンボリックに計算された場合(1の代わりに各エントリに異なる変数を使用)、このすべてのパス(およびエントリに1を使用して数値で計算された場合、パスのカウントに減少します)。しかし、これがタスクを実行する最も速い方法であるかどうかは本当にわかりません(おそらくそうではありません)。 警告:私はカウントの問題や最短のパスを求めているのではありません。パスの長さは、使用されるエッジの数として定義されています(繰り返しをカウントしています)。私はRを使用していますが、他の言語で考えたい場合は、質問がすでに提起され、解決されていたら本当に申し訳ありません。親切に助けてくれてありがとう! 追加情報:行列べき級数アプローチ(A ^ 3は3つの長いパスをすべて提供します...)とdfs / bfsを試しました。後者の2つは、ソースとターゲットのセットで作業していることを考慮に入れておらず、したがって多くの冗長な作業を行うため、最適性には程遠いと思います...

1
ガリルの法則はボイヤー・ムーアアルゴリズムでどのように機能しますか?
ガリルのルールを使用したボイヤー・ムーアのテキスト検索アルゴリズムがどのように機能するかを知りたいのですが。検索を試みましたが、このWikipediaページなど、見つけた情報を理解できませんでした。そして、なぜこのルールで線形時間の複雑さを実現するのでしょうか?

2
ブルートフォース検索の戦略はありますか?
エレガントな表現方法はわかりませんが、基本的にはブルートフォース検索アルゴリズムを実装したいのですが、検索スペースを列挙する方法はたくさんあります。これは私には世間知らずかもしれませんが、検索スペースを列挙する方法を選択すると、アルゴリズムが実際にうまく機能するかどうかに大きく影響すると思います。 簡略化した例として、次の決定問題を考えます。 入力:多項式p(x)p(x)p(x)整数係数と自然数ます。kkk 質問:ようなは存在しますか?i∈[k]i∈[k]i \in [k]p(i)=0p(i)=0p(i) = 0 現在、この問題を解決するためのさまざまなアルゴリズムが存在する可能性がありますが、私はブルートフォースアプローチを選択することにしました。サーチスペースを列挙するには、次の方法を検討してください。 昇順戦略:私はかどうかを確認でき、その後、0であるその後、私が見つけるまで、...、ようにまたは私はすべて試す。p(1)p(1)p(1)p(2)p(2)p(2)p(3)p(3)p(3)iiip(i)=0p(i)=0p(i) = 0i∈[k]i∈[k]i \in [k] 降順戦略:場合、私がチェックすることができ、その後、0である、その後、、···、私が見つけるまで、このようなことまたは私がしてみてくださいすべての。p(k)p(k)p(k)p(k−1)p(k−1)p(k-1)p(k−2)p(k−2)p(k-2)iiip(i)=0p(i)=0p(i) = 0i∈[k]i∈[k]i \in [k] 人気戦略:最も人気のあるソリューションの小さなリストを保存し、数値を試す前にそれらを最初に試すことができます。LLL[k]−L[k]−L[k] - L ふるい戦略:私は一種のふるい列挙を行うことができました。私はすべて2で割り切れる番号試みる、その後数が3で割り切れる次いで次いで、5、7、11、13、などを。(事前計算されたいくつかの素数のリストにアクセスできると仮定します。)[k][k][k][ k ][k][k] ランダム性戦略:ランダムなビットの大きな文字列を利用する興味深い列挙戦略があるかもしれません。 基本的に、私はブルートフォース検索アルゴリズムに関する次の質問に答えたいと思っています。 質問A:特定の列挙戦略を選択するメリットはありますか? 質問B:実際に興味深い列挙戦略を選択する検索問題の例はありますか?人気戦略のバリエーションが実際に効果的に機能する検索問題があるかもしれません。

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