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

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

1
SATローカル検索のデータ構造のサポート
WalkSATとGSATは、ブール充足可能性問題を解決するためのよく知られたシンプルなローカル検索アルゴリズムです。GSATアルゴリズムの擬似コードは、質問「GSATアルゴリズムの実装-反転するリテラルの選択方法」からコピーされています。以下に示します。 procedure GSAT(A,Max_Tries,Max_Flips) A: is a CNF formula for i:=1 to Max_Tries do S <- instantiation of variables for j:=1 to Max_Iter do if A satisfiable by S then return S endif V <- the variable whose flip yield the most important raise in the number of satisfied clauses; S …

1
移動するターゲットを追跡するアルゴリズム
クエリとリセットが可能なブラックボックスfffあるとします。我々がリセットするとfff、状態fSfSf_Sのfff集合から一様にランダムに選択された要素に設定されている{0,1,...,n−1}{0,1,...,n−1}\{0, 1, ..., n - 1\}ここで、は固定され、指定された既知です。を照会するには、要素(推測)が提供され、返される値はです。また、状態F_SのF F X { 0 、1 、。。。、n − 1 } (f S − x )nnnffffffxxx{0,1,...,n−1}{0,1,...,n−1}\{0, 1, ..., n - 1\}f S f(fS−x)modn(fS−x)modn(f_S - x) \mod nfSfSf_Sfffは値f′S=fS±kfS′=fS±kf_S' = f_S \pm kに設定されます。ここで、kkkは\ {0、1、2、...、\ lfloor n / 2 \ rfloor-((f_S-x)\ modからランダムに選択され{0,1,2,...,⌊n/2⌋−((fS−x)modn)}{0,1,2,...,⌊n/2⌋−((fS−x)modn)}\{0, 1, 2, ..., \lfloor n/2 \rfloor - …

2
自己順序付けバイナリツリーの作成
バイナリ検索ツリーを使用して自己アクセス順序に変更する必要がある割り当てがあり、最もアクセスされる(優先度が高い)アイテムがツリーの最上部にあり、ルートが最もアクセスされるノードです。 教授は私にBSTとノード構造体を提供してくれましたが、挿入中にツリーを更新するアルゴリズムに頭を悩ませようとすると混乱します。 挿入が発生すると、現在のノードのデータが現在のノードより少ないか大きいかをチェックし、nullポインターを見つけてそこに挿入するまで再帰的に正しい方向に進みます。挿入された後、優先度が1増加します。 template <class Type> void BinarySearchTree<Type> :: insert( const Type & x, BinaryNode<Type> * & t ) { if( t == NULL ) t = new BinaryNode<Type>( x, NULL, NULL ); else if( x < t->element ) insert( x, t->left ); else if( t->element < x ) insert( …

2
可能な限り多くのスペースをカバーするように画面上の(サイズ変更可能な)ウィンドウを配置するアルゴリズムを考案する方法は?
一連のウィンドウ(幅+高さ)と画面解像度を受け入れ、ウィンドウが最大のスペースを占めるように画面上のそれらのウィンドウの配置を出力する単純なプログラムを作成したいと思います。したがってoutput size >= initial size、アスペクト比を維持しながら、ウィンドウのサイズを変更できます 。したがって、ウィンドウiii場合、アルゴリズムがタプルを返すようにします(x,y,width,height)(x,y,width,height)(x, y, width, height)。 これは2Dナップザックのバリエーションかもしれません。私はウェブ上の結果を調べてみましたが、それらはほとんど私が従うことを困難にした多くのバックグラウンド(そして実装なし)を持っていました。 最速のアルゴリズムにはあまり興味がありませんが、特定のニーズに合った実用的なものに興味があります。

1
GSATアルゴリズムの実装-反転するリテラルの選択方法
GSATアルゴリズムは、ほとんどの場合、単純です:連言標準形式で式を取得し、式を満たす解が見つかるか、max_tries / max_flips制限に到達して解が見つからなくなるまで、句のリテラルを反転します。 次のアルゴリズムを実装しています。 procedure GSAT(A,Max_Tries,Max_Flips) A: is a CNF formula for i:=1 to Max_Tries do S <- instantiation of variables for j:=1 to Max_Iter do if A satisfiable by S then return S endif V <- the variable whose flip yield the most important raise in the number of …

5
ラベルなしツリーの効率的な圧縮
ラベルのない、ルート付きのバイナリツリーを検討してください。私たちはできる圧縮サブツリーへのポインタがあるたび:そのような木をTTTとT′T′T'とT=T′T=T′T = T'(通訳===構造的平等など)、我々は保存(WLOG)TTTとのすべてのポインタ置き換えるT′T′T'へのポインタでTTT。例については、uliの回答を参照してください。 上記の意味でツリーを入力として使用し、圧縮後に残る(最小限の)ノード数を計算するアルゴリズムを提供します。このアルゴリズムは、入力のノード数nで、時間O(n log n )O(nlogn)O(nlog⁡n)\cal{O}(n\log n)(均一コストモデル)で実行する必要があります。nnn これは試験問題であり、良い解決策を思い付くことができず、見たこともありません。

1
疎グラフの周囲を見つけるための最適なアルゴリズム?
疎な無向グラフの周囲をどのように見つけるか疑問に思います。スパースとは。最適とは、時間の複雑さが最も低いことを意味します。|E|=O(|V|)|E|=O(|V|)|E|=O(|V|) 無向グラフのためのTarjanのアルゴリズムの変更について考えましたが、良い結果が見つかりませんでした。実際、で2連結成分を見つけることができれば、最初の部分から達成できる何らかの誘導により、胴回りを見つけることができると考えました。ただし、間違った方向に進んでいる可能性があります。Θ (| V | 2)(つまりo (| V | 2))よりも漸近的に優れたアルゴリズムを歓迎します。O(|V|)O(|V|)O(|V|)Θ(|V|2)Θ(|V|2)\Theta(|V|^2)o(|V|2)o(|V|2)o(|V|^2)

2
2つの2x2行列の行列乗算が7回未満の乗算でできないことを証明するにはどうすればよいですか?
Strassenの行列乗算では、2つの2 x 2の行列乗算に7つの乗算が必要であるという奇妙な(少なくとも私には)事実を述べています。 質問: 2つの2 x 2行列を6回の乗算で乗算できないことを証明するにはどうすればよいですか? 行列は整数を超えていることに注意してください。


3
最も効率的な定数空間ソートアルゴリズムは何ですか?
私は配列のサイズ以外のバイトを割り当てず、2つの命令に制限されているint配列のソートアルゴリズムを探しています: SWAP:次のインデックスを現在のインデックスと交換します。 MOVE:カーソルを+1または-1インデックスに移動します。 つまり、indexを交換した100だけでは、隣接していないインデックスを交換したり、インデックスを交換したりすることはできません10。最も効率的なアルゴリズムは何ですか?つまり、総移動量が少ないアルゴリズムですか?

12
文字列間の違いをすばやく見つけるためのデータ構造またはアルゴリズム
私はすべて長さの100,000文字列の配列を持っています。各文字列を他のすべての文字列と比較して、2つの文字列が1文字異なるかどうかを確認します。現時点では、各文字列を配列に追加するときに、配列内の既存のすべての文字列に対してチェックしています。これは、時間の複雑さを持っています。kkkn (n − 1 )2kn(n−1)2k\frac{n(n-1)}{2} k 私がすでにやっていることよりも速く文字列を互いに比較できるデータ構造またはアルゴリズムはありますか? 追加情報: 注文事項は:abcdeとxbcdeしながら、1つの文字によって異なるabcdeとedcba4つの文字で異なります。 1文字異なる文字列のペアごとに、それらの文字列の1つを配列から削除します。 現在、私は1文字だけ異なる文字列を探していますが、その1文字の差を、たとえば2、3、または4文字に増やすことができればいいと思います。ただし、この場合、文字差の制限を大きくする能力よりも効率のほうが重要だと思います。 kkkは通常20〜40の範囲です。

3
1つの配列が他の配列のソートバージョンかどうかを確認する決定論的線形時間アルゴリズム
次の問題を考慮してください。 入力:長さnの 2つの配列AAAおよびここで、Bはソート順です。BBBnnnBBB クエリは:ないAAAとBBB(その多重度)と同じ項目が含まれていますか? この問題の最速の決定論的アルゴリズムは何ですか? それらをソートするよりも速く解決できますか?この問題は確定的な線形時間で解決できますか?

1
数に等しい二項係数を見つけることの複雑さ
バイナリエンコーディングでビットを使用して)数値取得していると仮定します。O (log m )mmmO(logm)O(log⁡m)O(\log m) どれだけ速く見つけることができますか(またはそのようなものが存在しないと判断しますn,k∈N,1&lt;k≤n2:(nk)=mn,k∈N,1&lt;k≤n2:(nk)=mn,k\in \mathbb N, 1<k\leq\frac{n}{2}:{n \choose k}=m か)? たとえば、入力m = 8436285が与えられた場合、n = 27、k = 10をm=8436285m=8436285m=8436285出力できます。n=27,k=10n=27,k=10n=27, k=10 問題の単純なアルゴリズムは、nのすべての可能な値を調べ、プロパティを満たすkのnnn値を検索します。kkk 簡単な観察は、\ log mより小さいまたはO(\ sqrt m)より大きいnの値をチェックする必要がないということです。ただし(n値ごとにO(1)可能なk値のみをチェックできたとしても)これは、入力サイズが指数関数的である非効率的なアルゴリズムになります。nnnlogmlog⁡m\log mO(m−−√)O(m)O(\sqrt m)O(1)O(1)O(1)kkknnn 別のアプローチは、kの可能な値kkkを調べて(\ {2,3、\ ldots、2 \ log m \}をチェックするのに十分です{2,3,…,2logm}{2,3,…,2log⁡m}\{2,3,\ldots,2\log m\})、nnn値をチェックするたびに行います。その後、次を使用できます: (nk)k&lt;(nk)&lt;nkk!(nk)k&lt;(nk)&lt;nkk!\left(\frac{n}{k}\right)^k<{n\choose k}< \frac{n^k}{k!} したがって、与えられたkに対して、範囲[\ sqrt [\ leftroot {-2} \ uproot {2} k] {m \ …

3
CookieボックスにいくつのCookieがありますか?—星を並べる
ホリデーシーズンが近づいてきたので、シナモンスターを作ることにしました。それは楽しかった(そして結果はおいしい)が、星の最初のトレイを箱に入れたときに私の内側のオタクが縮み、それらが1つのレイヤーに収まらなかった: ほとんど!彼らがフィットする方法はありますか?とにかく星をどれだけタイルできますか?これらが通常の6点星であるとすれば、よく知られている六角形のタイルを近似として使用できます。 右上の1つをめちゃくちゃにしました。 しかし、これは最適ですか?ヒントの間には十分なスペースがあります。 この考慮のために、長方形のボックスと6点の規則正しい星に制限してみましょう。つまり、すべてのヒントとその隣の隅との間に30度(または)があります。星は、内側半径と外側半径によって特徴付けられ。π6π6\frac{\pi}{6}r私r私r_iroror_o [ ソース ] 我々は六角形有することに留意されたいとhexagramsため。これらを極端なもの(Cookieの場合)と見なし、その間の範囲、つまり。r私= 3√2⋅ Ror私=32⋅ror_i = \frac{\sqrt{3}}{2} \cdot r_or私= 13√⋅ Ror私=13⋅ror_i = \frac{1}{\sqrt{3}} \cdot r_or私r0∈ [ 13√、 3√2]r私r0∈[13、32]\frac{r_i}{r_0} \in \Bigl[\frac{1}{\sqrt{3}}, \frac{\sqrt{3}}{2}\Bigr] 私のcookieにはと不完全さを無視しています。r私≈ 17 M Mr私≈17mmr_i \approx 17\mathrm{mm}ro≈ 25 メートルメートルro≈25mmr_o \approx 25\mathrm{mm} 上記の特性を持つ星の最適なタイリングとは何ですか?静的な最適なタイリングがない場合、効率的に良いものを見つけるためのアルゴリズムはありますか?

1
最後のN個の数値の加重合計
ストリームで数値を受け取っているとします。各数値を受信した後、最後の数値の加重合計を計算する必要があります。加重は常に同じですが、任意です。NNN 計算を支援するためにデータ構造を保持することが許可されている場合、これはどの程度効率的に実行できますか?よりも良いこと、つまり数字を受け取るたびに合計を再計算することはできますか?Θ(N)Θ(N)\Theta(N) 例:重みがます。ある時点で、最後の数値のリストと、加重和ます。W=⟨w1,w2,w3,w4⟩W=⟨w1,w2,w3,w4⟩W= \langle w_1, w_2, w_3, w_4\rangleNNNL1=⟨a,b,c,d⟩&gt;L1=⟨a,b,c,d⟩&gt;L_1= \langle a, b, c, d \rangle>S1=w1∗a+w2∗b+w3∗c+w4∗dS1=w1∗a+w2∗b+w3∗c+w4∗dS_1=w_1*a+w_2*b+w_3*c+w_4*d 別の番号を受け取ったら、リストを更新してをし、を計算する必要があります。eeeL2=⟨b,c,d,e⟩L2=⟨b,c,d,e⟩L_2= \langle b,c,d,e\rangleS2=w1∗b+w2∗c+w3∗d+w4∗eS2=w1∗b+w2∗c+w3∗d+w4∗eS_2=w_1*b+w_2*c+w_3*d+w_4*e FFTを使用した検討 この問題の特殊なケースは、高速フーリエ変換を使用することで効率的に解決できるようです。ここでは、倍数で加重和を計算します。言い換えれば、数値を受け取り、対応する加重和を計算することができます。これを行うには、過去の数(合計が既に計算されている)と、合計個の新しい数が必要です。SSSNNNNNNNNNN−1N−1N-1NNN2N−12N−12N-1 この入力数のベクトルと重みベクトル、係数を逆にして多項式との係数を定義する場合、積はaからまでの係数を持つ多項式が、求める重み付き和になります。これらは、時間でFFTを使用して計算できます。これにより、入力数ごとのΘ(\ log(N))時間の平均が得られます。WWWP(x)P(x)P(x)Q(x)Q(x)Q(x)QQQP(x)×Q(x)P(x)×Q(x)P(x)\times Q(x)xN−1xN−1x^{N-1}x2N−2x2N−2x^{2N-2}Θ(N∗log(N))Θ(N∗log⁡(N))\Theta(N*\log (N))Θ(log(N))Θ(log⁡(N))Θ(\log (N)) ただし、新しい数値が受信されるたびに加重和を効率的に計算する必要があるため、これは前述の問題の解決策ではありません。計算を遅らせることはできません。

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