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

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

2
ジャンプポイントサーチアルゴリズムはどのように機能し、なぜそれほど効率的ですか?
以下のアプレットを試してみたところ、Jump Point Searchと呼ばれるこの経路探索アルゴリズムは、A *やDijkstraよりもはるかに高速な結果をもたらすことがわかりました。 http://qiao.github.io/PathFinding.js/visual/ A *:46秒 ダイクストラ:1分39秒 ジャンプポイント検索:3秒未満 言うまでもなく、その結果にはかなり驚いています。視覚的な表現から、Jump Point Searchは(少なくともブロックの選択から)パスを見つける際に多くのランダムな推測(おそらく非常にインテリジェントなもの)をしているようですが、このアルゴリズムが悪い結果となったテストケースはまだ見つけていませんA *とダイクストラよりも結果。 このアルゴリズムはどのように機能しますか?A *やダイクストラと比べてどれほど効率的ですか?

3
変更を最小限に抑える単純な「デフラグ」ロジック?
編集: はっきりと私はこれをうまく説明しなかったので、例を使ってもう一度試してみましょう。私は与えられたサイズの「パイプ」を持ち、与えられたオフセットで信号がルーティングされます。パイプは、異なるオフセットの信号でフラグメント化される可能性があり、新しい信号を適合させることが不可能になります。パイプをデフラグするための信号の配置方法を教えてくれるアルゴリズムが必要です。しかし、実際には最小限の数の信号が移動しています!だから例のために.. サイズ16のパイプがあるとします。これには、サイズとオフセットが記述された次の信号があります。 offset 0: A (size of 4; fills slots 0-3) offset 5: C (size of 2, fills slot 5-6) offset 8: B (size of 4, fills 8-11) offset 14: D (size 2, fills 14-15) Pipe: AAAA_CC_BBBB__DD この場合、オフセット4および7で1つのスロットを開き、オフセット12-13で2つのスロットを開いています。次に、このパイプにサイズ4の信号を追加するとします。現在、そのための連続したスペースはありませんが、デフラグすると、十分なスペースがあることがわかります。「明白な」ソリューションは、次のようにすべての信号を「上部」でグループ化することです。 offset 0: A (size 4, fills 0-3) offset 4: B (size …

1
完全にソートされていないデータを検索するためのヒューリスティック
ソートされたデータがあれば、検索ソリューションは明白です。並べ替えられていないデータが与えられた場合、適切なオプションは、並べ替えてから検索するか、単なる線形検索です。 この質問は、データがある程度ソートされているが、再編成できない場合の対処方法です(書き込み操作にはセクターの消去が必要であり、セクターがRAMに収まりません)。 詳細: データレコードは、タイムスタンプとともに順次ログに記録されます。ただし、タイムスタンプクロックは、同期される前にしばらくの間エポックにリセットされるか、夏時間調整などにより単純に調整されます。 検索結果は、指定された時刻に最も近いタイムスタンプを持つログレコードである必要があります。特定のタイムスタンプでレコードのバイナリ検索を実行しているときに、不連続なログデータのパッチに到達し、間違った方向にピボットする可能性があります。 ブルート線形法以外に、ここで利用できるヒューリスティックはありますか?例:ローカルミニマの影響を受けないシンプレックス検索? 更新: レコードの約95%がソートされた順序であると想定できます。約5%(ログ全体に分散)は、汚いしゃっくりです。タイムスタンプが時間的に逆戻りし、ログの先頭よりも前のスタンプがある場合、しゃっくりの始まりを識別できます。

3
このグラフで最短経路を見つけるには、どのアルゴリズムを使用すればよいですか?
約10億個の頂点を持つグラフがあり、それぞれがランダムに約100個の他の頂点に接続されています。 2点間の最短経路の長さを求めたい。使用される実際のパスは気にしません。 ノート: エッジが切断または追加されることがあります。これは、ルックアップの約500分の1の頻度で発生します。また、パフォーマンスを向上させることができるのであれば、エッジ変更をバッチ処理することもできます。 私がすることができ、グラフを事前に処理します。 6ステップ以上かかる場合は、無限に戻ることができます。 0.01%の確率で間違っていても問題ありませんが、長すぎる長さを返す場合のみです。 すべてのエッジの長さは1です。 すべてのエッジは双方向です。 アルゴリズムを探しています。Psuedocode、英語の説明、実際のコードはすべて素晴らしいです。 A *を使用することもできますが、パスファインディング用に最適化されているようです。ダイクストラのアルゴリズムの 使用を考えましたが、すべての頂点の最短パス検出属性を無限大に設定する必要がある手順があります (ユースケースについて疑問がある場合は、アンダーハンドCコンテスト用です。)

3
文字列なしの最長サブシーケンス
サブストリングとしてYを含まないストリングXで最長のサブシーケンスを見つける動的プログラミングアルゴリズムはありますか?この問題は、最長の共通サブシーケンスや文字列など、他のDP文字列アルゴリズムと非常に似ているように見えます。オーバーラップするYの発生を処理できる必要があります。 これは2状態のDP問題である可能性があります。状態[s_pos、t_pos]は、ストリングT [t_pos..M]をサブストリングとして持たないs_posで始まるストリングSの最も長いサブシーケンスです。Nは文字列Sの長さ、Mは文字列Tの長さです。ただし、私の遷移は正しくありません。S= aaabcおよびT =の場合は取得されませんaabc。問題はelseステートメントにあります -文字が等しい場合に遷移する方法がわかりません。実際、私はifブランチが間違っていると感じています...誰が間違っているのか知っていますか? S = aaabおよびT =の場合も失敗しますaab。失敗する理由を説明できます。solve(0、0)を呼び出すと仮定します。solve(0、0)はsolve(1、1)を呼び出します。solve(1、1)はsolve(2、2)を呼び出します。s [2]!= t [2]なので、solve(3、0)から検索を再開します。ただし、aabは部分文字列であり、これをチェックしたり、このケースを考慮したりすることはありません... int solve(int s_pos, int t_pos) { if (s_pos >= N || t_pos >= M) return 0; if (t_pos == M - 1 && s[s_pos] == t[t_pos]) return 0; int ret = 0; if (s[s_pos] != t[t_pos]) { …

1
一連の制約が与えられたセミランダムな組み合わせ/順列の数
バックグラウンド: 私が働いている寄宿学校には約60人の生徒がいます。カウンセラーは私の同僚と私に、手よりも夕食のための座席配置を考え出すより良い方法を考え出すように頼みました。彼は残りの学年度の宿題を希望しています。また、学生や教職員から聞いた問題のいくつかを解決するように依頼してくれました。 制約: ほとんどの学生はアメリカ出身ではないので、同じ国籍の人々に囲まれているとき(つまり、夕食の席で)、英語を練習する代わりに、流暢な言語を話します。 学生が特定のテーブルに全体的に「多すぎる」回数座っていると、不満が出ます。 または、同じテーブルに2回以上続けて座っている場合、 そして、何人かの生徒は仲良くしないので、一緒に座ることができません。 入力: 実行時に、プログラムには以下が提供されます。 一組の人々、 テーブルのセット、および 各テーブルの座席数は異なります(繰り返しが可能です) 両方のセットのサイズ、および各テーブルのサイズは、割り当てごとに変わりません。 テスト: 私はさまざまな国籍の18人と、サイズ3〜6の4つのテーブルを使用しています。私はそのデータセットに意味があると思う数を選びました: 同じ国籍の人が同時に座ることができるのは3人までです 誰もテーブルに4回以上座ることができません 結果: 入力データを変更せずにジェネレータを約15回実行しました。毎回、6〜12週間の割り当てがあります。 質問: (重要度の低いものから) プログラムを実行するたびに、生成される割り当ての数が異なるのはなぜですか?データセットは実行間で変化していません。 どうやって見つけるのですか... 特定のテーブルに座ることができる同じ国籍の最小人数、 彼らが与えられたテーブルに着席する全体的な最小回数 生成された割り当ての数を最大化しますか? これらが実際に正しい数であることをどのように保証しますか? 編集: 新しい課題を生成するたびにCollections.shuffle(List)、人のリストを呼び出して順序をランダム化します。次に、テーブルと人のリストを、github でのkapilidの8つのクイーンの実装に基づくバックトラッキングメソッドに渡して、人をテーブルに割り当てます。


2
アルゴリズムのパラダイムとは何ですか?
私たちは一般に、プログラミングのパラダイムについて、関数型、手続き型、オブジェクト指向、命令型などについて話しますが、アルゴリズムのパラダイムを聞かれたときはどうすればよいですか? たとえば、巡回セールスマン問題、ダイクストラ最短経路アルゴリズム、ユークリッドGCDアルゴリズム、バイナリ検索、クラスカルの最小全域木、ハノイの塔アルゴリズムパラダイムなどです。または、おそらくパラダイムは、これらのアルゴリズムを設計するために使用するデータ構造ですか?

3
Sin関数をより速くより正確に計算する方法は?
を計算しますy(n)=32677Sin(45/1024•n)。yは整数で、n範囲は0〜2048です。このプロセスをより速く、より正確にするにはどうすればよいですか?以来:今、私はあなたの参照の答えを示したい Sin(a+b)=Sin(a)Cos(b)+Cos(a)Sin(b) とし Cos(a+b)=Cos(a)Cos(b)-Sin(a)Cos(b)。だから私は保存することができ Sin(45/1024•1)、そして Cos(45/1024•1)次の公式を使います: Sin(45/1024•2)=Sin(45/1024•1+45/1024•1)、 Cos(45/1024•2)=Cos(45/1024•1+45/1024•1)、 Sin(45/1024•n)=Sin(45/1024•(n-1)+45/1024•1)、 Cos(45/1024•n)=Cos(45/1024•(n-1)+45/1024•1)、この方法で多分速く大きな配列を格納せずに。
8 c++  algorithms 

3
製造現場のレイアウトに使用するアルゴリズム?
私は昨日教室の問題に遭遇しました(コンピューターサイエンスではなくビジネス志向のクラス)。アルゴリズムの観点から興味深いことに気付きました。 問題は次のよう になります。N個の異なる部屋がある製造現場があり、それらの部屋に行く必要のあるN個の異なる部門があるとします。部署と部屋はすべて同じサイズなので、どの部署でもどの部屋にも入ることができます。各部屋から他の部屋への移動距離はわかっています。ある部署から別の部署への必要な既知の移動量もあります(移動元の部屋に関係なく、移動は同じようにカウントされるため、AからBへの移動はBからAへの移動と同じです)。これらの入力を考慮して、移動時間を最小にする部屋への部門のレイアウトを決定します。 この問題にアルゴリズム的に取り組む最善の方法は何ですか?このタイプの問題を解決するために設計された特定のアルゴリズムまたはアルゴリズムのクラスはすでにありますか?この種の問題はコンピュータサイエンスで名前を持っていますか? これを解決するアルゴリズムを設計することを私は探していませんが、必要に応じて自由に設計してください。これがすでにアルゴリズムで十分に定義され、研究されている問題空間であるかどうか、そして、もしそうであれば、さらに研究するためのリンクをいくつか取得してください。これに適用できるさまざまなデータ構造とアルゴリズムがたくさんあるので、どのアプローチが「最適」か知りたいです。 心配しないでください、あなたは私の宿題をしてくれません。これはビジネスコースであるため、それ自体は宿題の問題ではありません。概念を単に議論しているだけで、アルゴリズムで問題を解決しようとはしていません。

2
(車両)トラフィックネットワーク内で最短経路を見つけるためのより良いアプローチはありますか?
プログラマの皆さん、 車両の通行をシミュレートするソフトウェアを開発しています。「割り当て」と呼ばれるプロセスの一部は、ルートへの車両の割り当てに関係しており、ある種の最短経路探索アルゴリズムを使用する必要があります。 伝統的に、人々はダイクストラでこれを行っており、特定の科学文献は、おそらくグラフの性質のために、A *や他の代替案は大幅な改善をもたらさないことを示しているようです。 したがって、ダイクストラも使用しています。小さな問題が発生しました。交通リンク(交差点間の道路のスパン)をエッジとして扱い、交差点をノードとして扱う場合、古典的な単方向グラフを取得できません。交差点に近づくと、頻繁に方向転換できるかどうかは従来のグラフでは、ノードから任意のエッジを取得できますが、 この問題は、リンクと交差のペア(「ラス」と呼ばれます)をノードとして表すことで簡単に解決できました。後続の「ラス」または選択したポイントに到達するにはリンクをたどる必要があるため、エッジがこのトラバーサルとして定義され、典型的なグラフが得られます。 次に、結果は単純なテーブルN x Nに格納されます。ここで、Nは「ラス」の数です。 これは(避けられない?)欠点です。シミュレーションの一般的なネットワークに2000の交差点がある場合、約6000リンク、つまりN = 3Vになります。明らかに、交差(V)で数えると、O(log(3V)*(3V + E))になります。 3(または9)は一定の要素であると主張するかもしれませんが、実際の観点からは、処理速度がかなり遅くなり、ストレージスペースが3V x 3Vに増加します。 これを再構成してパフォーマンスを向上させる方法を誰かが知っていますか?必ずしも別のアルゴリズムである必要はありません。おそらく、他の方法でグラフに合うようにデータ構造を再形成しますか?

2
LINQは、低レベルのデータ反復手法よりもはるかに多くの処理サイクルとメモリを必要としますか?
バックグラウンド 私は最近、.NETスタックを使用するポジションの厳しい技術面接に耐える過程にあります。その中には、このような愚かな質問や、より有効な質問が含まれています。最近、有効な問題に遭遇しましたが、確認するにはここのコミュニティに確認したいと思います。 面接官から、テキストドキュメント内の単語の頻度を数え、結果をランク付けする方法を尋ねられたとき、私は ストリームオブジェクトを使用して、テキストファイルを文字列としてメモリに配置します。 句読点を無視しながら、文字列をスペース上の配列に分割します。 配列とに対してLINQを使用.GroupBy()し.Count()、次にOrderBy()カウントと言います。 私は2つの理由でこの答えを間違えました: テキストファイル全体をメモリにストリーミングすると、障害が発生する可能性があります。それが完全な百科事典だったらどうでしょうか?代わりに、一度に1つのブロックをストリーミングして、ハッシュテーブルの作成を開始します。 LINQは高すぎるため、必要な処理サイクルが多すぎます。代わりにハッシュテーブルを作成する必要があり、反復ごとに、存在しない場合にのみハッシュテーブルに単語を追加してから、カウントをインクリメントしました。 最初の理由は、まあ、理にかなっているようです。しかし、2番目は私にもっと休止を与えます。LINQのセールスポイントの1つは、ハッシュテーブルのような下位レベルの操作を単純に抽象化することですが、ベールの下では、同じ実装です。 質問 抽象化されたメソッドを呼び出すためのいくつかの追加の処理サイクルを除いて、LINQは、特定のデータ反復タスクを実行するために、低レベルのタスク(ハッシュテーブルの作成など)よりもはるかに多くの処理サイクルを必要としますか?

3
アレイを拡大するには何枚のコピーが必要ですか?
動的配列の分析を読んでいます(Skienaのアルゴリズムマニュアルから)。 つまり、配列構造があり、スペースがなくなるたびに、元のサイズの2倍のサイズの新しい配列を割り当てます。 これは、アレイのサイズを変更する必要があるときに発生する無駄について説明しています。 これは、(n / 2)+1からnまでが最大で1回移動されるか、まったく移動されないことを示しています。これは明らかです。 次に、要素の半分が1回移動し、要素の4分の1が2回移動する、などと記述すると、移動の総数Mは次のようになります。 これは実際に起こるよりも多くのコピーを追加するように私には思えます。 例えば 以下の場合: array of 1 element +--+ |a | +--+ double the array (2 elements) +--++--+ |a ||b | +--++--+ double the array (4 elements) +--++--++--++--+ |a ||b ||c ||c | +--++--++--++--+ double the array (8 elements) +--++--++--++--++--++--++--++--+ |a ||b ||c ||c …

4
電子メールを外部システムへの入力として使用する場合、本文のみの電子メールをトリミングする方法は?
アプリケーションがメールに送信してコメントに返信したり、ToDoを追加したりできるようにする場合、さまざまな標準が存在するため、関連するテキストのみのメールをトリミングすることが問題になります。多くの場合、次のようなものが表示されます。 ジョー、こんにちは。いつ町に戻るか教えてください。 Bobによる投稿、30分前 13日に戻ります。 - よろしくお願いいたします。JosephR . Roberts シニアパートナー この通信は機密情報であり、Whatever Law Firmの所有物です。 Joeによる投稿、10秒前 署名はおそらく取り除くのが最も難しく、引用されたテキストが最も簡単です。トリミングの包括的な戦略は多面的であり、理想的には学習になると思います。私は良いシステムがすべきだと思います: 引用された本文を削除 引用ヘッダーを削除(「10月15日、Joeは次のように書いた:」) 署名を削除する 手動で入力したものはすべて保持します。 これを達成するためにシステムはどのような手順を踏む必要がありますか?また、システムが認識すべき落とし穴は何ですか? この回答は、同様の質問に対する有用な回答の良い例です

2
デプスマップイメージを使用して3Dアナグリフを作成するアルゴリズムはどこにありますか?
この例のように、元の画像とその黒/白の深度マップから始まる赤/シアンのアナグリフを計算するための一般的なアルゴリズムを探していますか? このアルゴリズムは、たとえばPhotoshopで使用されていますが、それを再現するための読みやすい説明が見つかりません。
8 algorithms  3d 

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