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

アルゴリズムは、問題に対する抽象的な解決策を定義する明確に定義された一連のステップです。このタグは、問題がアルゴリズムの設計と分析に関連している場合に使用します。

2
ブール行列の島を数える
ブール行列与えられた、0エントリは海を表し、1エントリは陸を表します。アイランドを垂直または水平に(ただし斜めではなく)隣接する1エントリとして定義します。X 0 1 1n×mn×mn \times mXX\mathrm X000111111 元の質問は、特定のマトリックス内の島の数を数えることでした。著者は再帰的な解決策(O(nm)O(nm)\mathcal{O}(nm)メモリ)について説明しました。 しかし、O(m)O(m)\mathcal{O}(m)またはO(n)O(n)\mathcal{O}(n)または\ mathcal {Oを使用してアイランドを動的にカウントするストリーミング(左から右、次に次の行まで)ソリューションを見つけることに失敗しました}(n + m)O(n+m)O(n+m)\mathcal{O}(n+m)メモリ(時間の複雑さに制限はありません)。それは可能ですか?そうでない場合、どうすればそれを証明できますか? count関数の特定の入力に対して期待される出力のいくつかの例: count⎛⎝⎜010111010⎞⎠⎟=1;count⎛⎝⎜101010101⎞⎠⎟=5;count⎛⎝⎜111101111⎞⎠⎟=1;count(010111010)=1;count(101010101)=5;count(111101111)=1; count\begin{pmatrix} 010\\ 111\\ 010\\ \end{pmatrix} = 1; % count\begin{pmatrix} 101\\ 010\\ 101\\ \end{pmatrix} = 5; % count\begin{pmatrix} 111\\ 101\\ 111\\ \end{pmatrix} = 1; count⎛⎝⎜⎜⎜1111100100010110100011011111⎞⎠⎟⎟⎟=2count(1111100100010110100011011111)=2 count\begin{pmatrix} 1111100\\ 1000101\\ 1010001\\ 1011111\\ \end{pmatrix} = 2 count(101111)=1count(101111)=1 count\begin{pmatrix} 101\\ …

1
最大化する方法
私は常にアルゴリズムの問​​題をたくさん見ています。それは常に次のような長い行に還元されます。 あなたが持っている整数配列の、あなたは見つける必要がある、このような最大化するで時間。h[1..n]≥0h[1..n]≥0h[1..n]\geq 0i,ji,ji,j(h[j]−h[i])(j−i)(h[j]−h[i])(j−i)(h[j]-h[i])(j-i)O(n)O(n)O(n) 明らかに時間解はすべてのペアを考慮することですが、プロパティについて他に何も知らなくても式を最大化できる方法はありますか?O(n2)O(n2)O(n^2)O(n)O(n)O(n)hhh 私が考えた1つのアイデアはを修正することです。それから、等しいからまでのを見つける必要がありますまたはあり、が固定されているため、。jjji∗i∗i^*111j−1j−1j-1argmaxi{ (h [j]−h[i])(j−i)}argmaxi{(h[j]−h[i])(j−i)}\text{argmax}_i\{(h[j]-h[i])(j-i)\}argmaxi{ h [ j ] j - h [ j ] i - h [ i ] j + h [ i ] i }argmaxi{h[j]j−h[j]私−h[私]j+h[私]私}\text{argmax}_i\{h[j]j-h[j]i-h[i]j+h[i]i\}jjjargmax私{ − h [ j ] i − j h [ i ] + i h [ i ] }argmax私{−h[j]私−jh[私]+私h[私]}\text{argmax}_i\{-h[j]i-jh[i]+ih[i]\} …

1
ペアワイズ問題を繰り返し解くよりも速くすべてのペア間のk最短経路を見つけることができますか?
グラフ内のすべてのペア間の最短パス(は10未満)を生成したいと思います。グラフは(実際には地下鉄の地図です):kkkkkk 正に重み付け 無向 疎 約100ノード 私の現在の計画は、各ペアに最短パスルーティングを適用することです。私は現在、より効率的な代替手段を探しています(おそらく動的プログラミングを使用)。kkk

1
最長の繰り返しサブシーケンスを見つける
文字列与えられた場合、最も長い繰り返し(少なくとも2回)のサブシーケンスを見つけたいと思います。つまり、私は、文字列検索したいwののサブシーケンスである(連続している必要はありません)のように、W = ワット" ⋅ ワットを"。つまり、wは半分が連続して2回現れる文字列です。wはsのサブシーケンスですが、必ずしもサブストリングではないことに注意してください。ssswwwsssw=w′⋅w′w=w′⋅w′w=w' \cdot w' wwwwwwsss 例: 「ababccabdc」の場合は「abcabc」になります。これは、「ababccabdc」に「abc」=「abc」と「abc」が(少なくとも)2回表示されるためです。 「addbacddabcd」の場合、「dd」は2回表示されるため、1つのオプションは「dddd」です(同じ文字を複数回使用することはできませんが、ここでは4つの「d」があるので問題ありません)。ただし、lebngth 4です。長さ8の場合: 'abcdabcd'は、 'abcd'が 'addbacddabcd'のサブストリングであるため、2回出現します。 最長の繰り返しサブシーケンスを見つけることに興味があります。これは「最長/最大の正方形を見つける」とも呼ばれますが、正方形が部分列ではなく部分列に対して定義されている多くの記事を読みました。 文字列のブレークポイントのすべてのオプションを反復することでを取るブルートフォースアルゴリズムを簡単に使用できます。次に、最大/最長の共通サブシーケンスを検索する2つの文字列を作成しますが、各チェックは動的プログラミング手法を使用してO (n 2)を取るため、全体の時間はO (n 3)になります。私はO (n 2をとる最も長い共通部分列のためのより効率的なアルゴリズムを見つけましたO(n3)O(n3)O(n^3)O(n2)O(n2)O(n^2)O(n3)O(n3)O(n^3)なので、実行時間はO(n3O(n2logn)O(n2log⁡n)O(\frac{n^2}{\log n})。O(n3logn)O(n3log⁡n)O(\frac{n^3}{\log n}) 私は最長の繰り返しサブシーケンス問題のためのより効率的なアルゴリズムを探しています。おそらく、すべてのブレークポイントを反復するという私の考えは、時間を浪費しすぎて、反復回数を減らすことができます。あるいは、異なる姿勢のアルゴリズムがこの問題を解決できるかもしれません。 私は多くのジャーナルや以前の質問で検索してきましたが、私が見つけた結果のほとんどは部分列ではなく部分文字列に関するものでした。 これはサフィックスツリーを使用して実行できることも読みましたが、これもサブストリングに関連しており、そのようなアイデアをサブシーケンスに拡張できるかどうかはわかりません。 時間で実行されるソリューションを探しています。時間の1が存在する場合にはO (nは⋅ ログn個)でも良くなる(そのようなものが存在する場合、私はわかりません)。O(n2)O(n2)O(n^2)O(n⋅logn)O(n⋅log⁡n)O(n \cdot \log n)

3
グラフ理論を使用してフランス国立公文書館の配置問題を解決する方法は?
こんばんは!フランスの国立公文書館で実際にインターンシップをしているときに、グラフを使って解決したい状況に遭遇しました... I.ほこりっぽい状況 アーカイブコストを最小限に抑えるために、図書館の本の高さに従って配置を最適化したいと考えています。本の高さと厚さはわかっています。書籍は、高さ昇順で既に配置されています(これが最善の方法であるかどうかはわかりませんが、それが私たちのやり方です)。各本の厚さがわかっているので、各H iクラスについて、それらの配置に必要な厚さを決定し、L iと呼びます(たとえば、H i = 23の本H1,H2,…,HnH1,H2,…,HnH_1,H_2,\dots,H_nHiHiH_iLiLiL_i高さ c mの合計厚さは L i = 300Hi=23cmHi=23cmH_i = 23\,\mathrm{cm})。Li=300cmLi=300cmL_i = 300\,\mathrm{cm} ライブラリは、希望の長さと高さを示す棚をカスタム製造できます(奥行きの問題はありません)。高さと長さx iの棚のコストは F i + C i x iです。ここで、F iは固定コストで、C iは長さ単位あたりの棚のコストです。HiHiH_ixixix_iFi+CixiFi+CixiF_i+C_ix_iFiFiF_iCiCiC_i なお、高さの棚高さは帳簿保存するために使用することができ、H 、J とJ ≤ Iを。コストを最小限に抑えたい。HiHiH_iHjHjH_jj≤ij≤ij\leq i 私の家庭教師は、この問題を経路探索問題としてモデル化することを提案しました。モデルには、0からnまでのインデックスが付けられた個の頂点が含まれる場合があります。私のメンターは、私は評価動作するように既存の条件、各エッジの意義と方法をうまく示唆したV (I 、J )のエッジに関連した(I 、Jを)。他の解決策や洞察も大丈夫です。n+1n+1n+1000nnnv (i 、j )v(i,j)v(i,j)(私、j )(i,j)(i,j) たとえば、私たちは条約(フランスの歴史の暗黒期)に次のような配列を持っています。 iHiLiFiCi112cm100cm1000€5€/cm215cm300cm1200€6€/cm318cm200cm1100€7€/cm423cm300cm1600€9€/cmi1234Hi12cm15cm18cm23cmLi100cm300cm200cm300cmFi1000€1200€1100€1600€Ci5€/cm6€/cm7€/cm9€/cm\begin{array}{|c|rr} i & 1 & …

1
Welch-Berlekampアルゴリズムのエラー数をどのように決定しますか?
リードソロモンコードをデコードするウェルチベルレカンプアルゴリズムでは、不明な場所のb iにeエラーがあるメッセージを表す点のリストが与えられます(eはアルゴリズムに与えられます)。出力は、エラーが発生した点を除く、指定されたすべての点を通過する多項式です。(ai,bi)(ai,bi)(a_i, b_i)eeebibib_ieee この方法には、次の形式の線形方程式系を解くことが含まれます。 biE(ai)=Q(ai)biE(ai)=Q(ai)b_i E(a_i) = Q(a_i) Eの次数がeでQの次数が最大でe + kであるすべてのiiiについて。変数はEおよびQの係数です。EEEeeeQQQe+ke+ke+kEEEQQQ EEE次数があることを確認するにeeeは、通常、の係数xexex^eが1 であるという制約を上記の線形システムに追加します。ただし、実際にはは必ずしもわかりませんeee。これに対処する1つの非効率的な(ただし多項式時間の)方法は、解が見つかるまで(n + k − 1 )/ 2 − 1で始まるすべての値に対してを試すことです。eee(n+k−1)/2−1(n+k−1)/2−1(n+k-1)/2 - 1 私の質問は:eを決定するより効率的な方法はありますか?eeeまたは、正確な値の代わりに上限を使用できるようにする線形システムに変更はありますか?eee 特に、この特定のデコーダーをリードソロモンコードに使用したいのですが、他の手法に基づく完全に異なるアルゴリズムではありません。 DWの答えに応えて、これが私の実際の例です。すべてが7を法として行われます。 plain message is: [2, 3, 2] polynomial is: 2 + 3 t^1 + 2 t^2 encoded message is: [[0, 2], [1, 0], [2, 2], …

1
最も重い平面サブグラフ
次の問題を考えてください。 与えられた:エッジに実際の非負の重みを持つ完全なグラフ。 タスク:最大重量の平面サブグラフを見つけます。(可能なすべての平面サブグラフの中で「最大」。) 注:最大重みサブグラフは三角形分割になります。完全なグラフが個の頂点にある場合、m = 3 n − 6のエッジになります。nnnm=3n−6m=3n−6m=3n-6 質問:この問題に最適なアルゴリズムは何ですか?その時間の複雑さは何ですか?

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 しかし、ハッシュは巨大であり、それを使用するのに十分なメモリがありません。 私が使用できるより良いアルゴリズムはありますか?ルックアップテーブルを使用してキーを生成することで問題を解決できますか?

2
高校の科学教師にSATを説明する
私はコンピュータサイエンスに興味のある高校2年生です。#SATのクールなアルゴリズムを開発し、それを使ってscience fairプロジェクトを実装および実行しています。私の学校で最高の理科教師であり、AP Comp Sci教師でもある私のアドバイザーは、彼女が私のプロジェクトについて何も知らないこと、そして#SATがなぜであるのか簡単に説明できるようにする必要があると私に言った5分未満で重要です。私は彼女のSATが#SATに減少することを伝え、SATが重要である理由を説明しようとした:私は彼女にNP問題のいくつかの例を与え、NPの問題がどのようにSATに減少するかを説明し、バイナリ検索で特定の最適化問題をSATに減らす方法を説明した、タンパク質を折りたたみ、強力なAIモデルを作成できます。残念ながら、彼女は私をまったく理解していませんでした。いくつかのポイントを教えていただけますか? PS私の顧問は、SATに還元されない便利な問題が#SATに還元されることを尋ねました(#Pのいくつかの問題が対応するNPバージョンよりも難しいと仮定)。私が思いつくことができたのは、特定のデータセットのモデルが特定のモデルよりも優れていることを見つけることだけでした(モデルの各パラメーターが特定のビット数よりも小さいと仮定)。ウェブ上で他のものを探しましたが、理解できることは何も見つかりませんでした。他に良いアプリケーションはありますか?

4
要素の一意性は決定論的な線形時間で解決できますか?
次の問題を検討してください。 入力:整数のX,YX,YX,Yをリストします 目標:両方のリストに整数が存在するかどうかを判断しxxxます。 両方のリストのサイズがます。この問題の確定的な線形時間アルゴリズムはありますか?言い換えれば、ランダム性を使用せずに、この問題を時間で決定論的に解決できますか?X,YX,YX,YnnnO(n)O(n)O(n) 残念ながら、リストの要素がすべて小さいとは限りません。 ランダム化されたアルゴリズムを使用して予想時間でそれを解決する方法を見ることができます:2つのユニバーサルハッシュ関数ランダムに選択し、の要素をハッシュテーブルに格納し(ハッシュ関数としてを使用)、次にルックアップします各要素を調べて、それがハッシュテーブルにあるかどうかを確認します。予想される実行時間はO (n )になります。しかし、O (n )の実行時間で決定論的アルゴリズムを見つける方法がわかりません。これをランダム化解除して単一の特定のハッシュ関数を修正しようとすると、最悪の場合の入力が存在し、このプロシージャがΘ (nO(n)O(n)O(n)hhhXXXhhhYYYO(n)O(n)O(n)O(n)O(n)O(n)Θ(n2)Θ(n2)\Theta(n^2)時間。私が見つけることができる最良の決定論的アルゴリズムは、値をソートすることですが、それは線形時間ではありません。線形実行時間を達成できますか? また、すべてのリスト要素が範囲整数であると仮定すれば、線形時間でそれを解決する方法を見ることができます[1,n][1,n][1,n](基本的に、ソートのカウントを行います)-しかし、一般的に何が起こるかに興味がありますそれが想定できない場合。 答えが計算モデルに依存している場合、RAMモデルは思い浮かびますが、合理的な計算モデルの結果に興味があります。私はを知ってるの要素の一意性のための決定木アルゴリズムの下限がある場合でも、時には我々は線形時間アルゴリズムを見つけることができるように、これは決定的ではありませんΩ (nはログN )にバインド決定木モデル。Ω(nlogn)Ω(nlog⁡n)\Omega(n \log n) Ω(nlogn)Ω(nlog⁡n)\Omega(n \log n)

1
動的グラフの関連コンポーネント情報を維持するための最も効率的なアルゴリズムとデータ構造は何ですか?
無向有限スパースグラフがあり、次のクエリを効率的に実行できる必要があるとします。 私sCo n n e c te d(N1、N2)私sCoんんected(N1、N2)IsConnected(N_1, N_2) -戻るとの間の経路がある場合と、そうでなければN 1 N 2 FTTTN1N1N_1N2N2N_2FFF Co n n e c t e dNo de s (N)CoんんectedNodes(N)ConnectedNodes(N)から到達可能なノードのセットを返しますNNN これは、グラフの接続されたコンポーネントを事前に計算することで簡単に実行できます。どちらのクエリも時間で実行できます。O (1 )O(1)O(1) エッジを任意に追加できるようにする必要がある場合A ddEdge (N1、N2)あddEdge(N1、N2)AddEdge(N_1, N_2) -次に、コンポーネントを分離セットデータ構造に格納できます。エッジが追加されるたびに、異なるコンポーネントの2つのノードを接続する場合、それらのコンポーネントをマージします。これが追加されますO (1 )O(1)O(1)のコストA ddEdgeあddEdgeAddEdgeとO (私nverseAckermann(|Nodes|))O(InverseAckermann(|Nodes|))O(InverseAckermann(|Nodes|))へのコストIsConnectedIsConnectedIsConnectedとCo n n e ctedNode sCoんんectedNodesConnectedNodes(同様かもしれませんO (1 )O(1)O(1))。 エッジを任意に削除できるようにする必要がある場合、この状況を処理するのに最適なデータ構造は何ですか?知っていますか?要約すると、次の操作を効率的にサポートする必要があります。 私s Co n n e …

2
任意精度の整数平方根アルゴリズム?
nビット整数の平方根のフロアを計算するための既知のサブ二次アルゴリズムはありますか? 素朴なアルゴリズムは次のようなものです def sqrt(x): r = 0 i = x.bit_length() // 2 while i >= 0: inc = (r << (i+1)) + (1 << (i*2)) if inc <= x: x -= inc r += 1 << i i -= 1 return r これにはO(n)反復が必要であり、各反復にはO(n)時間である加算が含まれるため、O(n^2)全体として時間です。もっと速いものはありますか?乗算の場合、2次時間よりも優れた特別なアルゴリズムがあることは知っていますが、平方根については何も見つかりません。

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) これを「すべてのペアの部分文字列テスト」などと呼ぶことができると思います。 私の最終的な目標は、コレクション内の何かの部分文字列である各文字列を削除することにより、コレクションをプルーニングして文字列が他の文字列の部分文字列にならないようにすることです。

1
問題の名前は何ですか?(グラフを3つのカバーに分割)
この問題に名前があるかどうか疑問に思いました: その縁、赤、青、緑に着色されている、単純なグラフ所与、頂点着色あるそのようなすべてのエッジすなわち同じ色の端点がありますか?G=(V,B∪R∪G)G=(V,B∪R∪G)G=(V,B\cup R\cup G)c:V→{B,R,G}c:V→{B,R,G}c:V\to \{B,R,G\} また、これはNP完全であることがわかっていますか? これは、CSP(または2SATの一般化)の特殊​​なケースと見なすこともできます。各制約は、3つの値のいずれかを取る2つの変数の分離であり、同じ変数ペアに2つの制約はありません。

1
自然数のセットの最大ペアワイズGCDを効率的に見つける
次の問題を検討してください。 ましょは自然数の有限サブセットです。S={s1,s2,...sn}S={s1,s2,...sn}S = \{ s_1, s_2, ... s_n \} ましょうgでのCのD (sはI、S J) | sのiが、S J ∈ S 、S I ≠ S J } 、G 、C 、D (X 、Yは)の最大公約数であり、X及びYG={G={G = \{ gcd(si,sj)gcd(si,sj)gcd(s_i, s_j)si,sj∈S,si,sj∈S,s_i, s_j \in S, si≠sj}si≠sj} s_i \neq s_j \}gcd(x,y)gcd(x,y)gcd(x,y)xxxyyy の最大要素を求めます。GGG この問題は、ユークリッドのアルゴリズムを使用して各ペアの最大公約数を取り、最大のものを追跡することで解決できます。 これを解決するより効率的な方法はありますか?

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