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

数学とコンピュータサイエンスでは、アルゴリズムは、関数を計算するための明確に定義された命令の有限リストとして表現される効果的な方法です。アルゴリズムは、計算、データ処理、および自動推論に使用されます。

8
オブジェクト指向とアルゴリズムの関係
私がいくつかのアルゴリズムの教科書を読んでいるとき、それらはいくつかの問題(ソート、最短経路)またはいくつかの一般的な方法(再帰アルゴリズム、分割統治、動的プログラミング...)の賢い手順でいっぱいです。そこではオブジェクト指向プログラミングの痕跡をいくつか見つけました。(なぜそれらはより手続き指向であるのですか?) それから私は考えていました: アルゴリズムとOOPの関係は何ですか?2つの独立したトピックですか? OOPでしか表示および解決できない問題はありますか? OOPはアルゴリズムをどのように支援できますか?それともどの方向に影響を与えることができますか?

3
リーグスケジューリングアルゴリズムの特定に支援が必要
私はスポーツリーグのスケジューラを作成しようとしています。各スロットを効率的に埋めるのに役立つアルゴリズムを特定できません。 スケジュールを作成するためのサンプルデータは次のとおりです。 10チーム 各チームはお互いに1回プレイします(合計45試合必要) 各チームは1日に1回しかプレイしません テストでは、1日あたり5スロットで9日間使用しています。 コンボテーブル(45のコンボを含む) ID Team1ID Team2ID ビット割り当て 済み スケジュールテーブル(45のタイムスロットを含む) scheduleID homeTeamID awayTeamID GameDate GameTime 現在、私の既存の手順は、スロットの約90%を占め、上記のルールに基づいて、スケジュールの競合のためにスロットの10%を空にします。 スケジュールテーブルを日付/時間の昇順でループします。 私の最初の時間帯は土曜日の午前8時です。 まだスケジュールされていないチームのリストを照会します。次に、それらのチームの可能な組み合わせの配列を作成します。次に、その配列を使用して、まだスケジュールされていない組み合わせから組み合わせテーブルから1つのランダムなレコードを取り出し、それらのチームをスケジュールに配置します。次に、その組み合わせを使用するように設定します。 ループを何度も繰り返し、使用可能なチームのリストが小さくなるたびに、結果として配列も小さくなります。 いくつかの日はうまく行き、他の日に私の最後の最後の2つの残りのチームは前の週にすでにプレーしたので、それらは再びスケジュールに追加されません。 まだ試していないのは、競合する日を「リセット」して、もう一度試し、より良い配置が得られるかどうかを確認することだけです。 誰か提案はありますか?

3
画像モザイクを作成するためのアルゴリズム-これよりも速い方法はありますか?
私は画像モザイクの作成に取り組んできました。私のスクリプトは多数の画像を取得し、それらをサムネイルサイズに縮小してから、それらをタイルとして使用してターゲット画像を概算します。 アプローチは実際にはかなり楽しいです: すべてのタイル位置のすべての親指の平均二乗誤差を計算します。 最初は貪欲な配置を使用しました。エラーが最小の親指をタイルに最も適したタイルに配置し、次に親指を配置します。 貪欲の問題は、あまり一致しないかどうかにかかわらず、最も人気のないタイルに最も異なる親指を配置することになるということです。ここに例を示します:http : //williamedwardscoder.tumblr.com/post/84505278488/making-image-mosaics そのため、スクリプトが中断されるまでランダムスワップを実行します。結果はまったく問題ありません。 2つのタイルのランダムスワップは必ずしも改善されるとは限りませんが、3つ以上のタイルのローテーションによって全体的な改善がもたらされるA <-> B場合がA -> B -> C -> A1あります。 このため、ランダムなタイルを2つ選んで改善されないことがわかった後、タイルの束を選び、そのような回転で3番目のタイルになるかどうかを評価します。4つのタイルの任意のセットを有利に回転できるかどうかなどは検討しません。それはまもなく超高額になるでしょう。 しかし、これには時間がかかります。 より良い、より速いアプローチはありますか? バウンティ更新 ハンガリー語メソッドのさまざまなPython実装とバインディングをテストしました。 はるかに高速だったのは、純粋なPython https://github.com/xtof-durr/makeSimple/blob/master/Munkres/kuhnMunkres.py 私の直感は、これが最適な答えに近いということです。テストイメージで実行すると、他のすべてのライブラリが結果に同意しましたが、このkuhnMunkres.pyは桁違いに高速でしたが、他の実装が同意したスコアに非常に非常に近づいています。 速度はデータに大きく依存します。モナリザは13分でkuhnMunkres.pyを駆け抜けましたが、スカーレットチェステッドインコは16分かかりました。 結果は、インコのランダムスワップとローテーションとほとんど同じでした。 (左側はkuhnMunkres.py、右側はランダムにスワップ、比較のための元の画像) しかし、私がテストしたモナリザの画像で​​は、結果が著しく改善され、彼女は実際に彼女の定義された「笑顔」を輝かせていました: (左側がkuhnMunkres.py、右側がランダムスワップ)

4
ビッグデータが機能する必要があるのはなぜですか?
最近、インターンシップのためにビッグデータに関連する新しいプロジェクトに取り組み始めました。私のマネージャーは関数型プログラミングの学習を始めることを推奨しました(彼らはScalaを強く推奨しました)。私はF#を使ってささやかな経験をしましたが、このプログラミングパラダイムを使用することの重要性を理解できませんでした。 ディーンはこのトピックについて興味深い話をし、ここで「ビッグデータ」を使用する理由についての彼の考えを共有しました:http : //www.youtube.com/watch?v=DFAdLCqDbLQ しかし、ビッグデータは意味がないので、あまり便利ではありませんでしたHadoopのみ。 BigDataは非常にあいまいな概念なので。しばらく忘れます。私は、データを処理するときにさまざまな側面を比較するための1つの簡単な例を考え出して、機能的な方法が高価であるかどうかを確認しました。関数型プログラミングが小さなデータに対して高価でメモリを消費する場合、なぜビッグデータに関数型プログラミングが必要なのですか? 派手なツールから遠く離れて、私は3つのアプローチを使用して1つの特定の人気のある問題の解決策を構築しようとしました:命令的な方法と機能的な方法(再帰、コレクションの使用)。時間と複雑さを比較して、3つのアプローチを比較しました。 Scalaを使用してこれらの関数を記述しました。3つのパラダイムを使用してアルゴリズムを記述するのに最適なツールだからです。 def main(args: Array[String]) { val start = System.currentTimeMillis() // Fibonacci_P val s = Fibonacci_P(400000000) val end = System.currentTimeMillis() println("Functional way: \n the Fibonacci sequence whose values do not exceed four million : %d \n Time : %d ".format(s, end - start)) val …

1
「悪いリンゴ」アルゴリズム、またはプロセスが共有サンドボックスをクラッシュさせる
次の問題を処理するためのアルゴリズムを探しています。これは(今のところ)「悪いリンゴ」アルゴリズムと呼んでいます。 問題 M個のサンドボックスでN個のプロセスを実行しています。N>> Mです。 各プロセスに独自のサンドボックスを与えることは実際的ではありません。 これらのプロセスの少なくとも1つが正しく動作せず、サンドボックス全体を停止させているため、同じサンドボックス内の他のすべてのプロセスが強制終了されています。 単一の不適切な動作のプロセスである場合は、単純な二分法を使用して、プロセスの半分を1つのサンドボックスに入れ、残りの半分を別のサンドボックスに入れて、不正なものが見つかるまで続けます。 質問 場合は、複数のプロセスがひどく行儀である-彼らはしているという可能性を含め、すべてのひどく行儀-この素朴なアルゴリズム「仕事」をしますか?いくつかの賢明な範囲内で動作することが保証されていますか? 簡略化 議論のために、悪いプロセスがサンドボックスを瞬時にダウンさせ、良いプロセスが決してダウンさせないと仮定しましょう。

3
クイックソートが「クイックソート」と呼ばれるのはなぜですか?
この質問の目的は、他の並べ替えアルゴリズムに対してこのメ​​リットを議論することではありません-これを行う他の多くの質問があります。この質問は名前についてです。クイックソートが「クイックソート」と呼ばれるのはなぜですか?確かに、それはほとんどの場合「迅速」ですが、常にというわけではありません。O(N ^ 2)に退化する可能性はよく知られています。この問題を軽減するさまざまな変更がクイックソートにありますが、最悪の場合を保証されたO(n log n)に下げるものは、一般にクイックソートと呼ばれなくなりました。(例:Introsort)。 よく知られているすべてのソートアルゴリズムのなかで、これが「クイック」という名前に値する唯一の理由であることに疑問を感じます。これは、アルゴリズムの動作方法ではなく、通常(通常)の速度を表します。Mergesortは、データをマージするため、それと呼ばれています。ヒープを使用するため、ヒープソートと呼ばれています。Introsortは、QuicksortからHeapsortに切り替えるタイミングを決定するために自身のパフォーマンスを監視するため、「Introspective」からその名前を得ています。同様に、すべての遅いもの(バブルソート、挿入ソート、選択ソートなど)についても同様です。私が考えることができる他の唯一の例外は「Bogosort」です。これは実際には誰も実際に実際に使用したことのない単なる冗談です。クイックソートが「パーティションソート」や「ピボットソート」など、より説明的なものと呼ばれないのはなぜですか。それが実際に何をしているのか?それは「最初にここに来た」の場合でさえありません。MergesortはQuicksortの15年前に開発されました。(ウィキペディアによると、それぞれ1945年と1960年) これは、プログラミングの問題というより、歴史の問題だと思います。私はそれがどのように名前を付けたのか興味があります-それはちょうど良いマーケティングでしたか?

6
並べ替えられていない配列の範囲から最大値を取得しています
私が持っている未ソート配列を。範囲を指定し、その範囲の最大値を返さなければならないクエリがあります。例えば: array[]={23,17,9,45,78,2,4,6,90,1}; query(both inclusive): 2 6 answer: 78 任意の範囲から最大値をすばやく取得するために構築するアルゴリズムまたはデータ構造。(クエリがたくさんあります) 編集: これは確かに実際の問題の単純なバージョンです。配列のサイズは100000まで、クエリの数は100000までにすることができます。そのため、高速なクエリ応答を促進する前処理が必要です。


1
ダメラウ・レヴェンシュタインの改善の可能性は?
最近、Wikipediaの疑似コードからDamerau-Levenshtein距離アルゴリズムを実装しました。私はそれが動作します正確にどのように任意の説明を見つけることができなかったとの擬似コードは次のように完全に情報価値がない変数名を使用してDA、DB、i1、そしてj1左のように私は私の頭を掻きます。 Pythonでの実装は次のとおりです。https://gist.github.com/badocelot/5327337 Pythonの実装は、プログラムをウォークスルーして何が起こっているのかを理解し、変数の名前をよりわかりやすい名前に変更するのに役立ちました。私は、私が参照枠を持っているレーベンシュタイン距離を計算するためのワーグナーフィッシャーアプローチに十分に精通していました。 過度に長くなるおそれがあるので、ここに私がダメラウ=レヴェンシュタインを理解する方法を示します。 ミステリー変数: DA(last_row私のコードでは)は、各要素が表示された最後の行を保持する一種のマップです。私のコードでは、それは実際のPython辞書です DB(last_match_col)は、現在の行の文字がb一致する最後の列を保持しますa i1(last_matching_row)は、DA現在の文字の行番号ですb j1更新される前のDB/ の値の単なるコピーlast_match_colです。私のコードでlast_match_colは、更新された場所に移動してこの変数を削除しました 転置コスト: H[i1][j1] + (i-i1-1) + 1 + (j-j1-1) で現在の文字スワップのコスト計算されてbの最後の文字とbであることが知られてa追加または削除のどちらかとの間のすべての文字を処理すること、(最後の試合を)。 コストの要素: H[i1][j1] 転置を見つけると以前の作業が無効になるため、基本コストを転置前の計算のポイントに戻します。 (i-i1-1) 現在の行と現在の文字に一致する最後の行の間の距離であり、これは必要な削除の数です (j-j1-1) 現在の列と一致する最後の列の間の距離、つまり追加の数 余分なもの+ 1は、転置自体のコストです この分析が正しくない場合は、どこに問題があるのか​​を知りたいです。言ったように、アルゴリズムがオンラインでどのように機能するかについての詳細な説明は見つかりませんでした。 改良版? しかし、それを理解して、転置された文字間の追加と削除の両方のコストを計算することには欠陥があるように思われたことに感銘を受けました。1つの追加と1つの削除は置換に相当し、これはチェックしていません。 それがすべて正しい場合、解決策は簡単です。転置された文字間の文字のコストは、追加と削除のどちらか高くなるはずです。できるだけ多くを置換に変換し、残っている追加または削除を追加します。 したがって、コストは次のようになります。 H[i1][j1] + max((i-i1-1), (j-j1-1)) + 1 これがこのバージョンの私のコードです:https : //gist.github.com/badocelot/5327427 いくつかの簡単なテストから、これは正しいようです。たとえば、 "abcdef"-> "abcfad"は編集距離を2(転置 "d"と "f"、 "e"を "a"に変更)しますが、元のアルゴリズムは距離を3(最後の3つ)にします。文字は置換、または1つの転置+ 1つの追加+ …

1
ハッシュ関数分類
インターネットで、私はこの質問に遭遇しました: キー値を見つけるさまざまな方法に基づいてハッシュ関数を分類します。 のような答えで 直接法 減算方式 Modulo-Divisionメソッド 桁抽出法 ミッドスクエア法 折り方 疑似ランダム法 奇妙だと思います。私はハッシュについてはよく知っていると思いますが、これは私には意味不明なことです。誰かが説明できますか?

2
コンピュータービジョンアルゴリズム(これはどのように可能ですか?)
私は最近、万引きを自動的に検出してユーザーに警告できるコンピュータービジョンテクノロジーのように見えるものを作成した会社に偶然出会いました。 リンク 同社が提供するビデオや例をいくつか見て、私は完全に困惑し、驚いたことに、いったい彼らがこの機能をどのように実現したのかについて驚いた。 ここで誰もこれがどのようにして達成されたのかを正確に伝えることはできないが、誰もが知っている-そして私に指摘することができる-この分野の研究を調査するか、あるいはこのようなものがどのように実装されるかについての詳細を提供するか、またはどこから始めればよいのか? 私の理解では、コンピュータービジョンアルゴリズムは、この洗練されたものから何年も離れていました。この種のアプリケーションは本当に可能ですか?彼らがこれをどのように達成したかで推測を危険にさらすことをいとわない誰か?

4
メモリ使用量の分析:JavaとC ++は無視できるか?
Javaで記述された整数オブジェクトのメモリ使用量は、C ++で記述された整数オブジェクトのメモリ使用量とどのように比較されますか?違いは無視できますか?変わりはない?大きな違いは?言語に関係なくintはintであるため、同じだと思います(?) 私がこれを尋ねた理由は、プログラムのメモリ要件がプログラマーが特定の問題を解決するのをいつ妨げるかを知ることの重要性について読んでいたからです。 私を魅了したのは、単一のJavaオブジェクトを作成するために必要なメモリの量です。たとえば、整数オブジェクトを考えてみましょう。私が間違っているが、Java整数オブジェクトが24バイトのメモリを必要とする場合は修正してください。 intインスタンス変数用に4バイト 16バイトのオーバーヘッド(オブジェクトのクラス、ガベージコレクション情報、同期情報への参照) 4バイトのパディング 別の例として、Java配列(オブジェクトとして実装されている)には48バイト以上が必要です。 24バイトのヘッダー情報 16バイトのオブジェクトオーバーヘッド 長さは4バイト パディング用に4バイト さらに、値を格納するために必要なメモリ これらのメモリ使用量は、C ++で記述された同じコードとどのように比較されますか? 以前は自分が書いたC ++およびJavaプログラムのメモリ使用量について気づいていませんでしたが、アルゴリズムについて学び始めた今、コンピューターのリソースに対する理解が深まっています。

2
動的プログラミングの問題を解決する方法
私は最近この質問に出くわしました。「シンボルの文字列で構成されるブール式が与えられます。true、false、and、or、xor。括弧で囲む方法の数を数えますtrueと評価されるような式。たとえば、trueと評価されるように 'trueとfalse xor true'を括弧で囲むには2つの方法があります。 私はそれが動的プログラミングの問題であることを知っていたので、次のような自分で解決策を考え出そうとしました。ABC .... D where '。'のような式があるとします。操作のいずれかを表します。または、xorおよび大文字はtrueまたはfalseを表します。このサイズKの式がtrueを生成する方法の数はNであるとしましょう。新しいブール値Eがこの式に追加されると、この新しい式1を括弧で囲む2つの方法があります((ABC .... D) .E)つまり ABC .... Dの可能なすべての括弧で、最後にEを追加します。2.(ABC(DE))すなわち まずDEを評価してから、サイズKのこの式が真を生成する方法の数を見つけます。 T [K]がサイズKの式がtrueを生成する方法の数であるとすると、T [k] = val1 + val2 + val3で、val1、val2、val3は次のように計算されます。 1)EがDとグループ化されている場合。 i)Dの値を変更しない ii)Dの値を逆にします 最初のケースではval1 = T [K] = Nです(これは最初のABC ... D式に減少するため)。2番目のケースでは、Dの値を逆にしてdp [K]を再評価します。これはval1です。 2)Eが式全体とグループ化されている場合。 // val2には、「true」の数が含まれます。Eは、括弧で囲まれたABCのすべてのインスタンスの中で「true」を与えた式で生成されます...... D i)true.E = trueの場合、val2 = N ii)true.E = falseの場合、val2 = …

3
最適化アルゴリズムの最適性を評価する一般的な方法はありますか?
最適化アルゴリズムの最適性を評価する一般的な方法はありますか。たとえば、NPハード問題またはNP完全問題を解くアルゴリズムなどです。 これまでに私が思いついた唯一の方法は、アルゴリズムの結果を既知の最適解と比較することです。 そうでない場合、いくつかの特別な問題のための特定の方法はありますか? 編集明確にするために:最適性とは、結果が最適解の結果にどれだけ近いかを意味します。

5
O(n)のサフィックス配列を使用した文字列の最小の辞書式回転
ACM 2003の問題を引用します。 長さn(1 <= n <= 100000)の文字列を考えます。その最小の辞書式回転を決定します。たとえば、文字列「alabala」のローテーションは次のとおりです。 アラバラ ラバラ アバラール バラアラ アラララブ ラアラバ あらばる その中で最小のものは「aalabal」です。 解決策として-私はサフィックス配列を構築する必要があることを知っています-そして、O(n)でそれを行うことができるとしましょう。私の質問はまだ、どうすればO(n)の最小回転を見つけることができますか?(n =文字列の長さ) 私はこの問題に非常に興味がありますが、それでも解決策が得られません。具体的な実装ではなく、概念と問題の解決方法に興味があります。 注:最小回転とは、英語の辞書と同じ順序であることを意味します。dはwの前にあるため、「dwor」は「word」の前にあります。 編集:サフィックス配列の構築にはO(N)が必要です 最終編集:解決策を見つけたと思います!!! 2つの文字列をマージした場合はどうなりますか?文字列が "alabala"の場合、新しい文字列は "alabalaalabala"になり、これのサフィックス配列(O(2n)= O(n)内)を作成して最初のサフィックスを取得しますか?これは正しいと思います。どう思いますか?ありがとうございました!

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