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

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

3
最大のものを見つけることの複雑さ
以下は、私がそうであると信じるものでこれを行うための私のアルゴリズムです O(n)O(n)O(n)時間、そしてそれに対する私の証拠。私の教授はそれが実行されることに同意しませんO(n)O(n)O(n) 代わりにそれが実行されると考えています Ω(n2)Ω(n2)\Omega(n^2)時間。証明自体またはスタイルに関するコメント(つまり、私のアイデアは明確かもしれませんが、プレゼンテーションは明確ではありません)。 元の質問: 与えられた nnn 数、最大を見つける m≤nm≤nm \leq n そのうちに o(nlogn)o(nlog⁡n)o(n \log n)。あなたは他に何も想定しないmmm。 私の答え: 最初に並べ替え mmm配列の要素。これにはO(1)O(1)O(1) 時間、これは完全に依存しているため mmmではなく nnn。 それらをリンクされたリストに格納します(ソートされた順序を維持します)。これもかかりますO(1)O(1)O(1) 時間と同じ理由で。 配列内の他のすべての要素について、リンクリストの最小要素より大きいかどうかをテストします。これにはO(n)O(n)O(n) 時間として nnn 比較を行う必要があります。 数値が実際に大きい場合は、リンクされたリストの最初の要素(最小のもの)を削除し、リストを並べ替えられた順序で保持する場所に新しい数値を挿入します。これにはO(1)O(1)O(1) それは定数(mmm)上記のリストは拡大しません。 したがって、アルゴリズムの全体的な複雑さは O(n)O(n)O(n)。 リンクされたリストとは対照的に赤黒ツリーを使用すると、定数の点でより効率的であることを知っています(定数の上限が O(m⋅log2(m))O(m⋅log2⁡(m))O(m\cdot \log_2(m)) とは対照的に mmm (比較を容易にするために)ツリーの最下部の要素へのポインタを保持するという問題は非常に実行可能ですが、そのときは私には起こりませんでした。 私の証拠は何ですか?それを提示するより標準的な方法はありますか?

1
ウィンドウが表示されている画面を表すための効率的なクエリ可能なデータ構造
(これは私の他の質問に関連しています、ここを参照してください) 3つのウィンドウがある画面を想像してください。 これらをサポートしながら、これを表す効率的なデータ構造を見つけたいのですが。 特定のウィンドウを他のウィンドウと重複せずに配置できる座標のリストを返します 上記の例で、サイズ2x2のウィンドウを挿入する場合、可能な位置は(8、6)、(8、7)、..になります。 アスペクト比を維持しながら、他のウィンドウと重ならないように画面上のウィンドウのサイズを変更する x、yの位置にウィンドウを挿入します(ウィンドウが重ならない場合) 今の私の素朴なアプローチは、ウィンドウの配列を維持し、画面上のすべてのポイントを調べて、ウィンドウのいずれかにあるかどうかをチェックすることです。これは、ここで、画面の幅、高さであり、それにウィンドウの数です。一般に、各ウィンドウが多くのスペースをとる場合、は小さくなります(たとえば、<10)。O (N ⋅ M ⋅ W )O(ん⋅メートル⋅w)O(n\cdot m\cdot w)n 、mん、メートルn, mwwwwww

1
ショットガンヒルクライミングの詳細を実装して効果的にするにはどうすればよいですか?
私は現在、(少しの調査の後)ヒルクライミングの使用、より具体的にはショットガン(またはランダムリスタート)ヒルクライミングアルゴリズムのアイデアが最適であるように見える問題の解決策に取り組んでいます。最適な開始値を見つける方法を知る手がかりはありません。 しかし、このタイプのアルゴリズムについては、その背後にある基本的な考え方を除いて、多くの情報はありません。 [Shotgun]ヒルクライミングは、ヒルクライミングアルゴリズムの上に構築されたメタアルゴリズムです。ランダムな初期条件で、毎回山登りを繰り返します。最高のが維持されます。山登りの新しいランが保存された状態よりも優れた生成する場合、保存された状態を置き換えます。x0x0x_0xmxmx_mxmxmx_m 私がこれを正しく理解している場合、これは次のようなものを意味します(最大化を想定): x = -infinity; for ( i = 1 .. N ) { x = max(x, hill_climbing(random_solution())); } return x; しかし、これを本当に効果的にするにはどうすればよいですか?これは通常の山登りよりも優れていますか?ランダムな開始値を使用すると、特に巨大な検索スペースで多くの効果があるとは信じがたいです。より正確には、私は疑問に思います: (つまりを実装)を選択するための、特に以前の反復の(中間)結果を知るための優れた戦略はありますか?x0x0x_0random_solution どのようにを選択するか、それは、完全な解が(かなり)見逃されないことを非常に確実にするために必要な反復回数です。NNN

1
最短経路グラフに還元できるすべての特別なグラフを見つける
有向加重グラフがあります G = (V、E、W)G=(V,E,W)G = (V, E, W)。常に頂点からのエッジがあります私ii 別のものに jjj、 重量 w (i 、j )w(i,j)w(i,j) 正の無限大である可能性があり、負のサイクルは存在しません。 一部のアルゴリズムを実行すると、頂点のすべてのペア間の最短パスの長さ(合計重み)が検出されますが、パス自体の詳細は返されません。たとえば、Floyd–Warshallアルゴリズムは単純であり、機能します。結果を次のように表しますG′=(V,E,W′)G′=(V,E,W′)G' = (V, E, W')。 に G′G′G'、からのエッジの可能性があります iii に jjj、 w′(i,j)=w′(i,k0)+w′(k0,k1)+⋯+w′(kn,j)w′(i,j)=w′(i,k0)+w′(k0,k1)+⋯+w′(kn,j)w'(i,j) = w'(i, k_0) + w'(k_0, k_1) + \dots + w'(k_n, j)。から作りましょうG′G′G' 別のグラフ G′′G″G''を除いて、任意の要素はと同じです。そこで我々は、最短経路の実行は、アルゴリズムにいることを知っている与える。G′G′G'w′′(i,j)=∞≠w′(i,j)w″(i,j)=∞≠w′(i,j)w''(i,j) = \infty \neq w'(i,j)G′′G″G''G′G′G' したがって、与えられた場合、すべてのと、となるように、ようなすべてのグラフを見つけたいと思います。とは、最短経路アルゴリズムを使用して減らすことができます。G′G′G'G′′G″G''iiijjjw′′(i,j)∈{w′(i,j),∞}w″(i,j)∈{w′(i,j),∞}w''(i,j) \in \{ w'(i,j), \infty\}G′′G″G''G′G′G' 私の質問が明確であることを願っています...これのアルゴリズムがすでに存在するかどうかわかりませんが、誰かが何か考えを持っていますか?

4
アルゴリズムのループ不変式
ペアの合計の問題の次の疑似コードを開発しました。 与えられた配列 AAA 整数と整数の bbb、位置があり、場合はYESを返し、それ以外の場合はNOを返します。i,ji,ji,jAAAA[i]+A[j]=bA[i]+A[j]=bA[i] + A[j] = b 次に、私のアルゴリズムが正しいことを示すループ不変条件を記述します。誰かが有効なループ不変のヒントを教えてくれますか? PAIRSUM(A,b): YES := true; NO := false; n := length(A); if n<2 then return NO; SORT(A); i := 1; j := n; while i < j do // Here I should state my invariant currentSum := A[i] + A[j]; if …

1
3次スプラインの最大曲率を計算する効率的な方法
2D 3次スプライン(ベジェ)があり、そのスプラインを離散化したポリゴンラインがあります。 滑らかな表現または離散ポリラインのいずれかを使用して、スプラインの最大曲率を計算する方法を実装するための効率的で簡単な方法はありますか?それはゲーム用であるため、正確である必要はありません。約10%のエラーは完全に許容されます。 別の言い回し:知りたいのですが、スプラインに沿って一定の速度で運転している車を運転する場合、ハンドルを切るためにハンドルを回さなければならない最大の度合いはどのくらいでしょうか?

1
パレートフロンティア要素を見つけるオンラインアルゴリズム
要素のストリームを取得し、パレートフロンティアにある要素(たとえば、すべての非支配要素)を保持するオンラインアルゴリズムを探しています。 例えば。以下の入力が与えられると、保持されているパレートフロンティアセットは次のように進化します。 (3,7) 要素b / cを挿入します最初の要素です パレートセットに含まれるもの {(3,7)} (7,3) 最初に支配されていない要素b / cを挿入します パレートセットに含まれるもの {(3,7), (7,3)} (8,4) 支配されていない要素b / cを挿入します。(7,3)両方の次元で支配されているものを削除する パレートセットに含まれるもの {(3,7), (8,4)} (1,1) 両方の次元で支配的であるため、挿入しないでください パレートセットに含まれるもの {(3,7), (8,4)} (9,9) 支配されていない要素b / cを挿入します。他のすべての要素を削除します。これは、両方の次元でそれらを支配するためです パレートセットに含まれるもの {(9,9)} 私の例では2タプルを使用していますが、「小さい」N(たとえば、<10)のNタプルを処理できるアルゴリズムを探しています。 素朴な解決策は、各要素を現在セット内のすべての要素と比較することです。実際には、素朴なアプローチはそれほど悪くないかもしれません(例えば、サブO(n2)O(n2)O(n^2))要素は比較セットによって定期的に排除されるためです。しかし、このための効率的なアルゴリズムが知られているかどうか疑問に思っていました。メモリの効率と計算の複雑さに興味があります。(ハ!そして実際のところ、メモリと計算の複雑さに関してパレート最適であるアルゴリズムのセットを探しています。) これの私の現在のアプリケーションは、最も関連性の高いドキュメント(検索エンジンの一般的な使用例)を収集しないが、指定された次元に沿ってパレート最適ドキュメントを収集するLucene検索ドキュメントの構築Collectorです。

2
もし
誰かが私に言った ログログ\log計算を簡単にするために関数が導入されました。計算する必要がある場合x yバツyxy、代わりに計算できます ログx + ログyログ⁡バツ+ログ⁡y\log x+\log y 以来 ログx y= ログx + ログyログ⁡バツy=ログ⁡バツ+ログ⁡y\log xy=\log x+\log y。これはどのように計算を簡単にすることができますか?数学者の視点からかもしれませんが、コンピューター科学者の視点はどうでしょうか? それが計算をより簡単にするならば、なぜ人々はそれを使って乗算アルゴリズムの複雑さを単純化しないのですか? 私の考えでは、この変換は計算をより困難にします。どのように計算できますかログバツログ⁡バツ\log x そして expバツexp⁡バツ\exp x コンピュータで機能する? 私は正しいですか?何か提案してください?お時間をいただきありがとうございます。

1
行列の列のサブセットを選択します。簡単ですか?
この問題が多項式時間で解けるかどうか知りたいのですが? 問題は次のとおりです。サイズが2 \ times nの非負の整数値行列2×n2×n2\times nと2つの非負の整数値b&lt;nb&lt;nb<nおよびcが与えられますccc。 問題は、列のサブセットの各行の合計がcよりも大きくなるように、最大bのカーディナリティの列のサブセットを見つけることです。そのようなサブセットが存在しない場合は、noを返します。bbbccc NP難しいとは言えません。 編集: 硬さを証明するための私の試み:Filmusの提案に従って、PARTITION(インスタンスは負でない整数のセット\ {a_1、\ ldots、a_n \}によって与えられる{a1,…,an}{a1,…,an}\{a_1,\ldots,a_n\})を私の問題に削減しようとしました。もちろん失敗しました。私が理解しなかったと思うのは、非負の整数のセットの分割がこの問題にどのように関係しているのですか?私の問題では、何かを最大化するために\ {1、\ ldots、n \}のサブセットを選択したいということです{1,…,n}{1,…,n}\{1,\ldots,n\}。これがパーティションであることがわかりません。私は多くの考えを試してみましたが、ここにそれらすべてを書くことはできません: 最初の行にa_ {2i}のみ、2番目の行にa_ {2i + 1}のみを含む行列を作成しようとしました。a2ia2ia_{2i}a2i+1a2i+1a_{2i+1} 最初の行を昇順でソートし、2番目の行を降順でソートするのに疲れました。 となるように、を2つの値とに分割し、最初の行に、2番目の行にを含む行列を作成しようとしました。aiaia_iαiαi\alpha_iβiβi\beta_iai=αi+βiai=αi+βia_i=\alpha_i+\beta_iαiαi\alpha_iβiβi\beta_i PARTITIONを使用して問題のNP困難さを示すにはどうすればよいですか?あなたは解決策を与える必要はありません。 問題を解決するための私の解決策: 私はこの解決策を試しました。一般性を失うことなく、行列の最初の行が昇順でソートされると仮定します。(行列の2行目は並べ替える必要はありません。そうでない場合、問題は簡単です。) ここで、行列の最後の列を取ります。bbb 最初の行の合計がよりも小さい場合は、完了したときよりも小さくなり。解決策はありません。ccc または、最後の列の最初の行の合計がより大きい場合、2番目の行の合計を確認します。 bbbccc 最後の列の2番目の行の合計が、よりも大きい場合。最後の列を返します。bbbcccbbb そうでなければ、上の最初の行の合計値列は、より大きいが、上2行目の和列は、以下である。さて、ここに問題があります。bbbcccbbbccc
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.