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

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

1
グリッド内で動くボールが与えられた場合、ボールはどの正方形に到達しますか?
mxnグリッドが与えられます。無次元のボールがグリッドの1つの正方形の中心に配置され、4つの方向(北東、北西、南東、または南西)のいずれかで動き始めます。ボールはボードの端に到達するまで動き続け、その時点でボールは物理法則に従って跳ね返ります。 m、n、ボールの初期位置と方向(NE / NW / SE / SW)が与えられた場合、ボールが指定されたターゲットグリッドの正方形(x0、y0)に到達するかどうかを判断できますか? ボールの動きを徹底的にたどることによって質問に答えることは可能ですが、もっと簡単なより効率的な方法はありますか?関連文献へのポインタも大歓迎です。

1
最小限の引き出しの動きで、順序付けられていないアイテムの山を引き出しに分類する
しばらく前、私は夜遅くに洗濯をしていました。洗濯物を寮に持ち帰ると、片付け始めました。 私のワードローブは次のように設定されています: 私の引き出しは、持っている衣類の種類によって分類されており、私はそのことに非常にこだわっています。これは、パンツの引き出しにTシャツを入れられないことを意味します(それ以外の場合は、毛羽立ちすぎて寝ることができません)。もちろん、私はこの分類を知っており、暗闇の中でもどの引き出しがどれであるかを知っています。 私はきれいな洗濯物を個持っており、引き出しが縦に並んでいます(引き出しの一番上が)NNNMMMD0D0D_0 引き出しは開閉可能ですが、引き出しが開いていると、衣類を引き出し入れることができません(ブロックされているため)。D私DiD_iDi + 1Di+1D_{i+1}D私DiD_i 部屋に入ると、引き出しはすべて閉じています。 終了したら、開いている引き出しをすべて閉じなければなりません。 私は思いやりのある紳士で、ルームメイトを起こしたくありません(これは大学の寮だったので、同じ部屋で寝ていました)。私はライトをオンにしないで、できるだけノイズを少なくすることにしました。 これは、以下の制約の下で洗濯物を片付けなければならないことを意味します。 洗濯物が見えないので、引っ張った瞬間に何を掴んでいるか分からない。 引き出しを開閉すると音がします。ランドリーバッグからアイテムを引き出したり、実際に引き出しに入れたりしても、そうはいきません。 一度に片方の衣類しか片付けることができません。床が汚れすぎて手が届かない家具のスペースがないので、私は服のように折りたたんで積み重ねることができません(それからそれらの積み重ねを置きません)。 衣類をバッグに入れて別のアイテムを取り出すことはできますが、次に取り出すのは、入れたばかりのアイテムである可能性があります(バッグから何を取り出すかは制御できません)。 このことから、3つの質問があります。 引き出しの開閉をできる限り少なくするために、洗濯物をどのように片付けることができますか? 他の誰かがこの問題または同様のことを考えましたか? この問題には実用的な用途がありますか?

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:実際に興味深い列挙戦略を選択する検索問題の例はありますか?人気戦略のバリエーションが実際に効果的に機能する検索問題があるかもしれません。


1
ChaffのようなDPLLベースのアルゴリズムに純粋なリテラル除去が存在しないのはなぜですか?
私はさまざまなSATソルバーを調べて、それらがどのように機能し、なぜ特定の方法で設計されているのかを理解しようとしています。(しかし、私は今のところ大学にいないので、教授をしている人を知りません。誰かが助けてくれることを願ってここに投稿します。本当に感謝します。) チャフ、BCP(ブール制約伝播)が異なる原稿から実現されるDPLL:これは、2つの見て、それをしないリテラル時間(最初に提案ものからわずかに異なる技術でSATO:効率的な命題証明者)2001紙によれば、チャフ:エンジニアリング効率的なSATソルバー。ただし、このホワイトペーパーでは、純粋な文字の削除については触れていません。 でピュアリテラル撤廃の複雑さ、ヤンJohannsenが書きました ChaffやBerkMinのようなDLLタイプのSATソルバーの現在の最良の実装では、ユニットの伝播で効率を上げるためにこのヒューリスティックを犠牲にします。 ここで、「このヒューリスティック」は、純粋な文字消去を指します。純粋な文字消去が何をするかについての私の理解は、 すべての単極(または純粋)リテラルを検索します ブール値を割り当てて、それぞれが True その場合、それらを含むすべての句を削除できます。 これが私の質問です: 犠牲はどのように必要ですか?ChaffのようなDPLLベースのアルゴリズムで純粋なリテラル除去が欠けている正当な理由はありますか?各決定レベルで純粋な文字削除を行うことはできませんか(または少なくとも分岐前の最初に行うことはできません)。

2
n log n = c。これの良い近似は何ですか?
私は現在Big O表記法と計算の複雑さを調べています。 CLRSの問題1.1は、基本的な質問のように聞こえます。これは、入力のサイズとともにさまざまなアルゴリズムの複雑さがどのように成長するかについての直感を得ることです。 質問は尋ねます: 次の表の各関数と時間について、問題を解決するアルゴリズムにマイクロ秒かかると仮定して、時間で解決できる問題の最大サイズを決定します。f(n)f(n)f(n)tttnnntttf(n)f(n)f(n) 期間は、1秒、1分、1時間、1日、1か月、1年、1世紀です。 関数は、アルゴリズムで頻繁に発生する一般的な時間の複雑さであり、リストは次のとおりです。f(n)f(n)f(n) log2n,n−−√,n,nlog2n,n2,n3,2nandn!log2⁡n,n,n,nlog2⁡n,n2,n3,2nandn! \log_2n, \quad \sqrt{n}, \quad n, \quad n \log_2 n, \quad n^2, \quad n^3, \quad 2^n \quad \text{and} \quad n! ほとんどはかなり単純な代数的操作です。私はこれらの2つ、そして同じ理由で両方に苦労しています: がマイクロ秒の時間である場合、私が苦労している2つは cccnlog2n=cnlog2⁡n=c n \log_2 n = c n!∼2πn−−−√(ne)n=cn!∼2πn(ne)n=c n! \sim \sqrt{2\pi n} \left(\frac{n}{e}\right)^n = c 以下のためスターリングの近似を使用することを考えました。n!n!n! これらはどちらもを解く能力を必要とし、スターリングはもう少し操作が必要です。nlog2n=cnlog2⁡n=cn \log_2 n = c ご質問 …

3
前に起こった因果関係
私はLamportの「時間、クロック、および分散システムにおけるイベントの順序付け」を読んでいて、私を悩ませている詳細があります。 ランポートは、「以前に起こった」半順序を定義しています。次に彼は、「定義を表示する別の方法は、a-> bは、イベントaがイベントbに因果的に影響を与える可能性があることを意味する」と言います。 ここで、aがbの前に発生するような、プロセスP1でのメッセージ受信である2つのイベントaとbを考えます。さらに、aとbがP1で発生した2つのイベントだけであると仮定します。前に発生したリレーションの定義によれば、a-> bがあります(P1がこれらのイベントをこの順序で監視しているため、これは理にかなっています)。 ただし、イベントaがイベントbに因果的に影響を与える可能性があるかどうかはわかりません。これらの2つのイベントはまったく無関係であり、異なる順序で発生した可能性があります。 ここで何が欠けていますか?

1
文字列がコレクション内の部分文字列と一致するかどうかを効率的に確認するにはどうすればよいですか
部分文字列のコレクションがあります "this" "is" "a" "antelope" 与えられた文字列を見て、「この文字列に与えられた部分文字列はありますか」という質問に答える必要があります。 だから私の入力文字列は "issue" 「is」は「issue」のサブストリングであるため、どちらが一致します これを初めて試したところ、部分文字列のコレクションを誤ってトライに変えました。「入力文字列は与えられたコレクションの部分文字列である」と逆に答えたので、それは私をどこにも速くさせませんでした。 この質問に効率的に答えるためにコレクションを変換できるアルゴリズムまたはデータ構造はありますか?つまり、単純なブルートフォースの「すべての部分文字列に対して入力をチェックする」メソッドを実行できましたが、もっと良い方法があるようです。 私の与えられた例では、「a」がカモシカがするすべてのケースをカバーするので、「カモシカ」が決してチェックされないことを期待します。「is」は「this」を削除することを期待しているかもしれません。したがって、長い部分文字列を短い文字列で削除すると、パフォーマンスが向上するようです。 私はとりとめています...私が調べなければならないことはありますか?

1
最も効率的な道を旅する
私の友人が実際に私に非常に興味深いコンピューターサイエンス関連の質問をしてきました。 問題は、旅行する必要があることです。 100010001000キロ。唯一のガソリンスタンドは出発点にあります。燃料タンクの最大容量は kmの走行に十分であり、途中で燃料を「埋め」、後で使用するために保存することができます。505050 たとえば、最初に km 走行し、そこに km相当の燃料を埋め込んでから、給油に戻ると、次に、残った kmの燃料を取り出して、それを使ってさらに到達することができます。202020101010101010 あなたは目的地に到達するための最も効率的な方法を見つける必要があります。 私が考えたのは動的プログラミングの使用ですが、給油を行う前に移動する距離はキロメートル単位の整数であると想定する必要があります。そうでなければ、DPでそれを行うのは難しいので、まだ線形プログラミングを試していません、それは可能だと思います。 それを行う方法について何か考えがありますか?または何かヒントはありますか? 最も重要なのは、どのタイプのcs問題ですか?NPは難しいですか?機械で解けるのか、それとも数学的な問題なのか? さらにいくつかの考え: それは継続的なパスなので、NPかどうかを尋ねるのは少しばかげているかもしれませんが、私はまだ非常に興味があります。 100010001000複雑な計算を回避するために、とが意図的に選択される場合があります。505050 貪欲な解決策はありますか?まだ考えられません。 私の友人はそれがcs問題であると主張しているのですが、今は数学的なパターンを見つける問題のほうが多いと思うので、この投稿を続けることにします。 そして、これに関連する科学記事や教科書があれば教えてください、そもそもどこから始めればよいのかわかりません。

2
単純な言語のゼロへの等価性の計算可能性
葉に一連の番号でラベルが付けられたツリーと、一連の操作Oで内部ノードがあるとします。LLLOOO 特に、LLLはN,ZN,Z\mathbb{N}, \mathbb{Z}またはQQ\mathbb{Q}にすることができ、オプションでππ\piやeを含めることができますeee。 OOOは\ {+、-、\ cdot、/、\ hat \ \}の任意のサブセットにすることができます{+,−,⋅,/, ^}{+,−,⋅,/, ^}\{+,-,\cdot,/,\hat\ \}。 ゼロとの平等は決定可能ですか?符号比較は決定可能ですか?もしそうなら、彼らは実現可能ですか? "無効"操作(0/00/00/0、00000^0、...)を生成するNaNNaNNaN、NaN≠0NaN≠0NaN \neq 0およびNaNNaNNaN通常どおり計算を通って伝播します。 いくつかの組み合わせは簡単です。フィールド操作に限定し、Lにππ\piもeも含めない場合は、結果の分数を計算してそれで処理できます。または、\ mathbb {Z} \ cup \ {\ pi \}および\ {+、-、\ cdot \}に制限すると、多項式を計算して係数を確認できます。一方、べき乗(つまりn乗根)と\ piとeは、物事をかなり難しくします。eeeLLLZ∪{π}Z∪{π}\mathbb{Z} \cup \{\pi\}{+,−,⋅}{+,−,⋅}\{+,-,\cdot\}nnnππ\pieee 「ゼロとの平等」問題は、定数問題のインスタンスです。

1
3つ接続するために追加するエッジの最小数の決定
グラフ GGG であると言われています 333-接続されていない場合 222-vertexカットセット(つまり、グラフを切断するには、少なくとも3つの頂点を削除する必要があります)。私の知る限り、単純なグラフが333-接続されている O (n )O(ん)O(n)時間(例:http : //www2.tu-ilmenau.de/combinatorial-optimization/Schmidt2012b.pdf)が、グラフを作成するために追加するエッジを効率的に決定するのに役立ちます333-まだ接続されていない場合は接続されます(これが効率的に実行できる場合のエッジの最小数が理想的です)。誰かがそのようなアルゴリズムを知っていますか?もしそうなら、私はリファレンスまたは2つをいただければ幸いです。

1
奇妙なグラフ分割問題のNP困難性の証明
次の問題がNP困難であることを示しようとしています。 入力:整数eee、および接続された無向グラフ G=(V,E)G=(V,E)G=(V,E)、頂点加重グラフ 出力: パーティションGGG、 Gp=(V,Ep)Gp=(V,Ep)G_p=(V,E_p) いずれかを削除して取得 eee からのエッジ EEE 最大化する max∑Gi∈{G1,G2,...,Gk}1|Gi|⎛⎝∑vj∈Viw(vj)⎞⎠2,max∑Gi∈{G1,G2,...,Gk}1|Gi|(∑vj∈Viw(vj))2,\max \sum\limits_{G_i \in \{G_1,G_2,...,G_k\}} \frac1{|G_i|}\left(\sum_{v_j \in V_i}w(v_j)\right)^{\!2}, ここで、と要素は互いに素です。はの頂点セットで、は頂点重みですGp=G1∪G2∪ ⋯ ∪GkGp=G1∪G2∪⋯∪GkG_p=G_1 \cup G_2 \cup \dots \cup G_kGGG V私ViV_iG私GiG_iw (vj)w(vj)w(v_j)vjvjv_j わかりやすい英語の説明:目的を最大化するために、eeeエッジを削除してグラフを分割します。目的は、結果の分離したサブグラフのそれぞれについて、サブグラフの頂点の合計を計算し、その値を二乗し、カーディナリティで除算します。最後に、これをすべてのサブグラフについて合計します。 これまで、レシオカット、パーティション(グラフ以外の問題)、最大マルチカットなどのNPハード問題からの削減を試みました。また、問題の特殊なケースがNP困難(理想的ではない)であることを示すように試みました。この問題が(ほとんどのグラフ分割問題がNPハードであることに加えて)NPハードであると疑う理由は、パーティションの重みの間にカーディナリティ項とクロス項が存在するためです。入力/問題の提案があれば役に立ちます。あらゆる種類の特定のグラフに対するNPハード証明は有用でしょう。

2
自動(人間によるテストなし)で測定する方法はありますか
そのため、数独パズルを提供するほとんどのリソースは、各パズルに難易度カテゴリを割り当てています。15以上の難易度カテゴリで私が見たものも含まれています。しかし、これらの難易度カテゴリを割り当てる良い方法は何ですか?人間のパズルソルバーが十分に使用された場合、人間がパズルを完了するまでの平均時間と、パズルを正常に解決した人のパーセンテージを、人間のサンプルについて計算し、それに応じて難易度カテゴリを割り当てることができます。しかし、平均的な人間の難易度に影響を与えるさまざまなパズルが解決されているときに出現し続ける予測可能なシナリオがあるはずです。コンピューターがパズルを解くと自動的に検出され、これらのパターンが人間の予測平均難易度にまとめられます。 。これを行うには良い方法はありますか?多分、サンプルパズルでの人間のパフォーマンスの十分なトレーニングデータを使用した機械学習でしょうか?

2
推測ゲーム
私はこの質問を解決していました。以下のとおりです ジョーはリストから整数を選びます 1,2,⋯,N1,2,⋯,N1,2,\cdots,N 確率で pipip_i ピッキングの iii すべてのために 1≤i≤N1≤i≤N1\leq i \leq N。それから彼はジェイソンを与えますKKK彼の数を推測しようとします。推測のたびに、ジョーはジェイソンの推測よりも多いか少ないかをジェイソンに伝えます。ジェイソンがジョーの番号を正しく推測した場合、KKK推測では、ゲームは終了し、ジェイソンが勝ちます。ジェイソンはそうでなければ負ける。ジェイソンがすべてを知っている場合p′ispi′sp_i's 彼が勝つ確率はどれくらいですか? 1≤N≤2000001≤N≤2000001\leq N\leq 200000 1≤K≤201≤K≤201\leq K\leq 20 この問題を動的プログラミングで試しました。しましょうDP[i][j][k]DP[i][j][k]DP[i][j][k] 数が次のようになるような勝率を格納します iii そして jjj 包括的かつ唯一 kkkチャンスが残っています。そう DP[i][j][k]=maxi≤l≤j{pl+DP[i][l−1][k−1]+DP[l+1][j][k−1]}DP[i][j][1]=maxi≤l≤jpl Base CaseDP[i][j][k]=maxi≤l≤j{pl+DP[i][l−1][k−1]+DP[l+1][j][k−1]}DP[i][j][1]=maxi≤l≤jpl Base CaseDP[i][j][k] = \max_{i\leq l\leq j} \{p_l + DP[i][l-1][k-1] + DP[l+1][j][k-1]\}\\DP[i][j][1] = \max_{i\leq l\leq j}p_l\ \quad \quad \text{Base Case} しかし、の範囲が非常に高いため、この解決策は実行できません。したがって、私はソリューションを探していたときに、次のソリューションに遭遇しました(インターネットで受け入れられました)NNNO(n)O(n)\mathcal{O}(n) Sort()p[]p[]p[] …

1
補数グラフで最短経路を見つける
入力として頂点を受け取るアルゴリズムを探しています sss、からの最短経路を見つける sss補数グラフ(無向)のすべての頂点に。アルゴリズムを実行する必要がありますO (V+ E)O(V+E)O(V+E) 時間、場所 EEE 元のグラフ(補数グラフではない)のエッジの数です。 もし GGG はグラフです。補数グラフは次のグラフとして定義されます。 eee元のグラフのエッジではない場合にのみ、補数グラフのエッジです。つまり、既存のエッジをすべて削除し、元のグラフから欠落していたすべてのエッジを追加します。 したがって、まず最初に、もちろん補数グラフを「構築」する(隣接リストの頂点をそこに表示されないもので置き換える)ことを考え、次に新しいリストでBFSを実行しましたが、もちろん、ランタイム元のエッジではなく、補数グラフのエッジに基づいています。 もちろん、元のグラフでBFSを実行した後、距離が sss(元のグラフで)1より大きい値は、補数グラフで1になるはずです(元のグラフで隣接していなかった場合、それらは補数グラフで隣接しているため)。しかし、距離をいつ更新するか、何を更新するかについて、特定のルールに従ってアルゴリズムを続行できませんでした。助言がありますか?

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