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

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


30
JavaScriptで配列に値が含まれているかどうかを確認するにはどうすればよいですか?
JavaScript配列に値が含まれているかどうかを確認する最も簡潔で効率的な方法は何ですか? これが私が知っている唯一の方法です。 function contains(a, obj) { for (var i = 0; i < a.length; i++) { if (a[i] === obj) { return true; } } return false; } これを達成するためのより良い、より簡潔な方法はありますか? これは、スタックオーバーフローの質問と非常に密接に関連しています。これは、を使用して配列内のオブジェクトを見つけることを扱いますindexOf。

30
山から靴下を効率的にペアリングするにはどうすればよいですか?
昨日、きれいな洗濯物から靴下をペアにしていて、自分のやり方があまり効率的でないことに気付きました。私は素朴な検索を行っていました。靴下を1つ選び、そのペアを見つけるために山を "反復"しました。これは、N / 2×N / 4 = Nにわたって繰り返す必要と2平均オン/ 8靴下。 コンピューターサイエンティストとして、自分にできることを考えていました。O(NlogN)ソリューションを実現するために、(サイズ/色/ ...に従って)並べ替えを行うことはもちろん思いつきました。 私は靴下を複製することができないので、ハッシュまたは他のインプレースソリューションはオプションではありません(できればいいのですが)。 したがって、質問は基本的には次のとおりです。 要素nを含む靴下のペアの山2n(各靴下に一致するペアが1つだけあると想定)が与えられた場合、それらを対数の余分なスペースまで効率的にペアにする最良の方法は何ですか?(必要に応じて、その量の情報を思い出せると思います。) 以下の側面に対処する回答をいただければ幸いです。 膨大な数の靴下の一般的な理論的ソリューション。 靴下の実際の数はそれほど多くありません、私は私の配偶者を信じていません、そして私は30足以上持っています。(そして、私の靴下と彼女の靴下を区別するのはかなり簡単です。これも使用できますか?) 要素の明確性の問題と同等ですか?

14
ゲーム2048に最適なアルゴリズムは何ですか?
私は最近2048年のゲームに遭遇しました。類似のタイルを4つの方向のいずれかに移動して結合し、「より大きな」タイルを作成します。移動するたびに、新しいタイルが空の位置にランダムに表示され、2またはのいずれかの値が表示されます4。すべてのボックスがいっぱいになり、タイルをマージできる動きがないか、値がのタイルを作成すると、ゲームは終了します2048。 1つは、明確に定義された戦略に従って目標を達成することです。それで、そのためのプログラムを書くことを考えました。 私の現在のアルゴリズム: while (!game_over) { for each possible move: count_no_of_merges_for_2-tiles and 4-tiles choose the move with a large number of merges } 私がやっていることは、いつでも、タイルを値2とマージしようとする4ことです。つまり、2と4タイルを最小限にしようとしています。この方法で試してみると、他のすべてのタイルが自動的にマージされており、戦略は良いようです。 しかし、実際にこのアルゴリズムを使用すると、ゲームが終了するまでに約4000ポイントしか得られません。最大点AFAIKは20,000ポイントをわずかに超えており、私の現在のスコアよりもはるかに大きいです。上記よりも良いアルゴリズムはありますか?


24
画像処理:「コカ・コーラ缶」認識のためのアルゴリズムの改善
私が過去数年間取り組んだ最も興味深いプロジェクトの1つは、画像処理に関するプロジェクトでした。目標は、コカコーラの「缶」を認識できるシステムを開発することでした(「缶」という言葉を強調していることに注意してください。その理由はすぐにわかります)。下のサンプルを見ることができます。缶はスケールと回転で緑色の長方形で認識されます。 プロジェクトに関するいくつかの制約: 背景は非常に騒々しいかもしれません。 缶は、任意の可能性があり、スケールまたは回転(合理的な範囲内で)、あるいは配向を。 画像にある程度のぼやけがある可能性があります(輪郭が完全にまっすぐではない場合があります)。 画像にコカコーラのボトルが含まれている可能性があり、アルゴリズムは缶を検出するだけです! 画像の明るさは大きく異なる可能性があります(そのため、色の検出に「過度に」依存することはできません)。 缶は、部分的側面または途中に隠された、おそらく一部は瓶の後ろに隠れてすることができます。 画像にはまったく缶がありません。その場合、何も見つからず、そのことを伝えるメッセージを書く必要がありました。 したがって、次のようなトリッキーなものになる可能性があります(この場合、アルゴリズムが完全に失敗しました)。 私はこのプロジェクトを少し前にやっていましたが、それを行うのはとても面白かったし、適切な実装がありました。ここに私の実装に関するいくつかの詳細があります: 言語:OpenCVライブラリを使用してC ++で実行。 前処理:画像の前処理、つまり画像をより生の形式に変換してアルゴリズムに提供するために、2つの方法を使用しました。 カラードメインをRGBからHSVに変更し、「赤」の色相に基づいてフィルタリングし、特定のしきい値を超える彩度でオレンジ色のような色を避け、低い値でフィルタリングして暗い色調を避けます。最終結果は、白黒のバイナリ画像で、すべての白いピクセルがこのしきい値に一致するピクセルを表します。明らかに画像にはまだがらくたがたくさんありますが、これにより、操作する必要がある次元の数が減ります。 ノイズを減らすために、メディアンフィルタリング(すべての近傍のピクセル値の中央値を取り、この値でピクセルを置き換える)を使用したノイズフィルタリング。 キャニーエッジ検出フィルターを使用して、前の2つの手順の後にすべてのアイテムの輪郭を取得します。 アルゴリズム:このタスクで選択したアルゴリズム自体は、特徴抽出に関するこの素晴らしい本から引用され、一般化ハフ変換(通常のハフ変換とはかなり異なります)と呼ばれています。それは基本的にいくつかのことを言います: 分析方程式(ここではその場合)を知らなくても、空間内のオブジェクトを記述できます。 スケーリング係数と回転係数のすべての組み合わせについて画像を基本的にテストするため、スケーリングや回転などの画像変形に耐性があります。 アルゴリズムが「学習」する基本モデル(テンプレート)を使用します。 輪郭画像に残っている各ピクセルは、モデルから学んだことに基づいて、オブジェクトの(重力に関して)中心となる別のピクセルに投票します。 最後に、投票のヒートマップが作成されます。たとえば、ここでは、缶の輪郭のすべてのピクセルがその重心に投票するので、同じピクセルに対応する多数の投票が中央にあり、ヒートマップに次のようなピークが表示されます。 それができたら、単純なしきい値ベースのヒューリスティックが中心ピクセルの位置を提供し、そこからスケールと回転を導き出し、その周りに小さな長方形をプロットできます(最終的なスケールと回転係数は明らかに、元のテンプレート)。理論的には少なくとも... 結果:現在、このアプローチは基本的なケースでは機能しましたが、一部の領域では非常に不十分でした。 それは非常に遅いです!私はこれを十分に強調していません。一部の缶が非常に小さかったため、回転と平行移動のスケーリング係数が非常に高かったため、30枚のテスト画像の処理にはほぼ1日が必要でした。 ボトルが画像内にあると完全に失われ、何らかの理由でほとんどの場合、缶の代わりにボトルが見つかりました(おそらく、ボトルが大きく、ピクセルが多く、投票数が多かったためです)。 投票は中央付近のランダムな場所のピクセルで行われ、非常にノイズの多いヒートマップで終わったため、あいまいな画像も良くありませんでした。 平行移動と回転の不変が達成されましたが、向きは達成されませんでした。つまり、カメラの対物レンズに直接面していない缶は認識されませんでした。 上記の4つの特定の問題を解決するために、OpenCV機能のみを使用して、特定のアルゴリズムを改善するのを手伝っていただけますか? 何かを学んでくれる人もいるといいのですが、結局、質問をする人だけが学ぶべきではないと思います。:)

20
GetHashCodeをオーバーライドするための最適なアルゴリズムは何ですか?
.NETでは、このGetHashCodeメソッドは.NET基本クラスライブラリ全体の多くの場所で使用されます。適切に実装することは、コレクション内でアイテムをすばやく見つけるか、同等かどうかを判断するときに特に重要です。 GetHashCodeパフォーマンスを低下させないようにカスタムクラスを実装する方法について、標準的なアルゴリズムまたはベストプラクティスはありますか?

30
簡単なインタビューの質問が難しくなりました:1..100の数値を指定した場合、正確にkが指定されている場合、不足している数値を見つけます
久しぶりに面接の面白い体験をしました。質問は本当に簡単に始まりました: Q1:私たちは、数字の入った袋を持って1、2、3、...、 100。各数値は1回だけ表示されるため、100個の数値があります。これで、バッグからランダムに1つの番号が選択されます。不足している番号を見つけます。 もちろん、このインタビューの質問は以前聞いたことがあるので、次のように非常にすばやく答えました。 A1:さて、数値の合計1 + 2 + 3 + … + Nは(N+1)(N/2)(ウィキペディア:算術級数の合計を参照)です。の場合N = 100、合計は5050です。 したがって、バッグにすべての数値が存在する場合、合計は正確にになります5050。1つの数値が欠落しているため、合計はこれより少なくなり、違いはその数値です。したがって、O(N)時間とO(1)空間でその欠けている数を見つけることができます。 この時点で、私はうまくやったと思いましたが、突然、質問は予想外に変わりました。 Q2:それは正しいですが、2つの番号が欠落している場合、これをどのように実行しますか? これまでにこの変化を見たり聞いたり考慮したことがなかったので、慌てて質問に答えることができませんでした。インタビュアーは私の思考プロセスを知ることを強く求めたので、予想される製品と比較することで、またはおそらく1回目のパスからいくつかの情報を収集した後に2回目のパスを実行するなどして、より多くの情報を得ることができると述べましたが、私は本当に撮影していました解決策への明確な道を実際に持っているのではなく、暗闇の中で。 インタビュアーは、2番目の方程式を持つことが実際に問題を解決する1つの方法であると言って、私を励まそうとしました。この時点で私はちょっと気が動転し(答えを事前に知らなかったため)、これが一般的な(「役に立つ」)プログラミング手法であるのか、それとも単なる裏技なのかを尋ねました。 インタビュアーの答えには驚かされました。3つの欠けている数字を見つける手法を一般化できます。実際、それを一般化してk個の欠損数を見つけることができます。 Qk:バッグから正確にk個の数値が欠落している場合、どのように効率的に見つけますか? これは数か月前のことでしたが、このテクニックが何であるかはまだわかりませんでした。Ω(N)すべての数値を少なくとも1回スキャンする必要があるため、明らかに時間の下限がありますが、インタビュアーは、解法の時間とスペースの複雑さ(O(N)時間入力スキャンを除く)はNではなくkで定義されると主張しました。 したがって、ここでの質問は簡単です。 Q2をどのように解決しますか? Q3をどのように解決しますか? Qkをどのように解決しますか? 明確化 通常、1..100だけでなく、1 .. NからN個の数値があります。 私は明らかなセットベースのソリューションを探していません。たとえば、ビットセットを使用して、指定されたビットの値で各数値の存在/不在をエンコードし、O(N)追加のスペースでビットを使用します。Nに比例する追加のスペースはありません。 また、明確なソートファーストのアプローチも探していません。これとセットベースのアプローチはインタビューで言及する価値があります(実装は簡単で、Nによっては非常に実用的です)。私はHoly Grailソリューションを探しています(実装するのが実際的であるかどうかはわかりませんが、それでも望ましい漸近的な特性があります)。 繰り返しますが、もちろん、で入力をスキャンする必要O(N)がありますが、キャプチャできるのは少量の情報(Nではなくkで定義)であり、kの欠損数を何らかの方法で見つける必要があります。
1146 algorithm  math 

7
ウッコネンの単純な英語のサフィックスツリーアルゴリズム
この時点で少し分厚い感じがします。私はサフィックスツリーの構築に完全に頭を悩ませるために何日も費やしましたが、私には数学的な背景がないため、数学記号を過度に使用し始めると、多くの説明がわからなくなります。私が見つけた優れた説明に最も近いのは、サフィックスツリーを使用した高速文字列検索ですが、彼はさまざまな点につながっており、アルゴリズムのいくつかの側面は不明のままです。 このStack Overflowでのアルゴリズムのステップバイステップの説明は、私以外の多くの人にとって非常に貴重だと思います。 参考までに、ここにアルゴリズムに関するウッコネンの論文があります。http://www.cs.helsinki.fi/u/ukkonen/SuffixT1withFigs.pdf これまでの私の基本的な理解: 特定の文字列Tの各プレフィックスPを反復処理する必要があります 接頭辞Pの各接尾辞Sを反復処理し、それをツリーに追加する必要があります 接尾辞Sをツリーに追加するには、Sの各文字を反復処理する必要があります。反復は、Sの同じ文字セットCで始まる既存のブランチを歩いて行き、エッジを子孫ノードに分割する可能性があります。サフィックス内の別の文字に到達する、または一致するエッジがない場合は下に移動する。Cに対して下に移動する一致するエッジが見つからない場合、Cに対して新しいリーフエッジが作成されます。 ほとんどの説明で指摘されているように、基本的なアルゴリズムはO(n 2)のように見えます。これは、すべてのプレフィックスをステップスルーする必要があるため、各プレフィックスの各サフィックスをステップスルーする必要があるためです。ウッコネンのアルゴリズムは、彼が使用しているサフィックスポインターテクニックのために、明らかにユニークですが、それは私が理解するのに苦労しているものだと思います。 私も理解できません: 「アクティブポイント」が割り当てられ、使用され、変更される時期と方法 アルゴリズムの正規化の側面で何が起こっているか 私が見た実装が使用している境界変数を「修正」する必要がある理由 完成したC#ソースコードを以下に示します。正しく機能するだけでなく、自動正規化をサポートし、出力の見栄えの良いテキストグラフをレンダリングします。ソースコードとサンプル出力は次の場所にあります。 https://gist.github.com/2373868 2017年11月4日更新 長年の後に、私はサフィックスツリーの新しい使用法を見つけ、JavaScriptにアルゴリズムを実装しました。要旨は以下の通りです。バグがないはずです。npm install chalk同じ場所からそれをjsファイルにダンプし、node.jsで実行してカラフルな出力を表示します。同じGistには、デバッグコードのない、簡略化されたバージョンがあります。 https://gist.github.com/axefrog/c347bf0f5e0723cbd09b1aaed6ec6fc6

30
リストの重複を削除する
ほとんどの場合、リストに重複があるかどうかを確認するプログラムを作成する必要があり、リストに重複がある場合はそれらを削除し、重複/削除されなかったアイテムを含む新しいリストを返します。これは私が持っているものですが、正直に言うと何をすべきかわかりません。 def remove_duplicates(): t = ['a', 'b', 'c', 'd'] t2 = ['a', 'c', 'd'] for t in t2: t.append(t.remove()) return t


9
アルゴリズムの時間の複雑さを見つける方法
質問 アルゴリズムの時間の複雑さを見つける方法は? SOに質問を投稿する前に何をしましたか? 私はこれ、これと他の多くのリンクを通過しました しかし、時間の複雑さを計算する方法についての明確でわかりやすい説明を見つけることができた場所はありませんでした。 私は何を知っていますか? 以下のコードのように単純なコードを言ってください: char h = 'y'; // This will be executed 1 time int abc = 0; // This will be executed 1 time 以下のようなループがあるとします。 for (int i = 0; i < N; i++) { Console.Write('Hello World !'); } int i = 0; これは一度だけ実行されます。時間は実際にi=0は宣言ではなく計算されます。 i …




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